Инструменты настройки сетевого стека

Операционная система Android содержит стандартные сетевые утилиты Linux, такие как ifconfig, ip и ip6tables. Эти утилиты находятся в образе системы и позволяют настраивать весь сетевой стек Linux. На устройствах с Android 7.x и более ранними версиями код поставщика может вызывать эти двоичные файлы напрямую, что приводит к следующим проблемам:

  • Поскольку утилиты сети обновляются в образе системы, они не обеспечивают стабильную реализацию.
  • Сфера применения утилит для работы с сетью настолько широка, что сложно развивать образ системы, гарантируя предсказуемое поведение.

На устройствах с Android 8.0 и более поздними версиями ОС раздел поставщика остается неизменным, а системный раздел обновляется. Для этого в Android 8.0 можно задать стабильный интерфейс с указанием версии, а также использовать ограничения SELinux, чтобы поддерживать взаимозависимость образов поставщика и системы на известном уровне.

Поставщики могут использовать утилиты для настройки сети, предоставляемые платформой, чтобы настроить стек сети Linux, но эти утилиты пока не включают оболочку интерфейса HIDL. Для определения такого интерфейса в Android 8.0 включен инструмент netutils-wrapper-1.0.

Оболочка Netutils

Утилита-оболочка netutils предоставляет подмножество конфигурации сетевого стека Linux, на которое не влияют обновления системного раздела. В Android 8.0 используются оболочки версии 1.0, которые позволяют передавать те же аргументы, что и обернутые утилиты, установленные в системном разделе по адресу /system/bin, следующим образом:

u:object_r:system_file:s0           /system/bin/ip-wrapper-1.0 -> netutils-wrapper-1.0
u:object_r:system_file:s0           /system/bin/ip6tables-wrapper-1.0 -> netutils-wrapper-1.0
u:object_r:system_file:s0           /system/bin/iptables-wrapper-1.0 -> netutils-wrapper-1.0
u:object_r:system_file:s0           /system/bin/ndc-wrapper-1.0 -> netutils-wrapper-1.0
u:object_r:netutils_wrapper_exec:s0 /system/bin/netutils-wrapper-1.0
u:object_r:system_file:s0           /system/bin/tc-wrapper-1.0 -> netutils-wrapper-1.0

Символические ссылки показывают утилиты сети, обернутые в netutils оболочку, в том числе:

  • ip
  • iptables
  • ip6tables
  • ndc
  • tc

Чтобы использовать эти утилиты в Android 8.0 и более поздних версиях, реализации поставщиков должны соответствовать следующим правилам:

  • Процессы поставщика не должны выполняться непосредственно с помощью /system/bin/netutils-wrapper-1.0. Попытка сделать это приведет к ошибке.
  • Все утилиты, заключенные в netutils-wrapper-1.0, должны запускаться с помощью символических ссылок. Например, измените код поставщика, который раньше использовался для этого (/system/bin/ip <FOO> <BAR>), на /system/bin/ip-wrapper-1.0 <FOO> <BAR>.
  • Выполнение оболочек без перехода домена запрещено правилами SELinux платформы. Это правило нельзя изменить. Оно проверяется в наборе тестов на совместимость с Android (CTS).
  • Прямое выполнение утилит (например, /system/bin/ip <FOO> <BAR>) из процессов поставщика также запрещено правилами SELinux платформы. Это правило не должно изменяться и проверяется в CTS.
  • Любой домен поставщика (процесс), которому нужно запустить оболочку, должен добавить в правила SELinux следующее правило перехода домена: domain_auto_trans(VENDOR-DOMAIN-NAME, netutils_wrapper_exec, netutils_wrapper).

Фильтры оболочки Netutils

Утилиты-обертки можно использовать для настройки практически любого аспекта сетевого стека Linux. Однако, чтобы обеспечить стабильность интерфейса и возможность обновления системного раздела, разрешены только определенные сочетания аргументов командной строки. Другие команды отклоняются.

Интерфейсы и цепочки поставщиков

В оболочке есть понятие интерфейсов поставщиков. Это интерфейсы, которыми обычно управляет код поставщика, например интерфейсы мобильного интернета. Как правило, другими типами интерфейсов (например, Wi-Fi) управляют HAL и фреймворк. Обертка распознает интерфейсы поставщиков по названию (с помощью регулярного выражения) и позволяет коду поставщика выполнять с ними различные операции. В настоящее время доступны следующие интерфейсы поставщиков:

  • Интерфейсы, названия которых заканчиваются на "oem" и число, например oem0 или r_oem1234.
  • Интерфейсы, используемые в текущих реализациях SOC и OEM, например rmnet_data[0-9].

Названия интерфейсов, которыми обычно управляет фреймворк (например, wlan0), никогда не относятся к интерфейсам поставщика.

В контейнере используется похожая концепция цепочек поставщиков. Они используются в командах iptables и распознаются по названию. В настоящее время цепочки поставщиков:

  • Начальный заряд: oem_.
  • Используются в текущих реализациях SOC и OEM, например цепочки, начинающиеся с nm_ или qcom_.

Разрешенные команды

Ниже перечислены команды, которые можно использовать. Ограничения реализуются с помощью набора регулярных выражений в выполняемых командных строках. Подробную информацию можно найти в статье system/netd/netutils_wrappers/NetUtilsWrapper-1.0.cpp.

ip

Команда ip используется для настройки IP-адресов, маршрутизации, шифрования IPsec и ряда других сетевых параметров. Оболочка поддерживает следующие команды:

  • Добавлять и удалять IP-адреса из интерфейсов, управляемых поставщиком.
  • Настройте шифрование IPsec.

iptables и ip6tables;

Команды iptables и ip6tables используются для настройки межсетевого экрана, обработки пакетов, NAT и других операций с пакетами. Обертка поддерживает следующие команды:

  • Добавлять и удалять сети поставщиков.
  • Добавлять и удалять правила в любой цепочке, которая относится к пакетам, поступающим в интерфейс поставщика (-i) или исходящим из него (-o).
  • Перейти к цепочке поставщиков из любой точки другой цепочки.

ndc

ndc используется для связи с демоном netd, который выполняет большинство сетевых конфигураций в Android. Обертка поддерживает следующие команды:

  • Создание и удаление сетей OEM (oemXX).
  • Добавление управляемых поставщиком интерфейсов в сети OEM.
  • Добавьте маршруты в сети OEM.
  • Включите или отключите переадресацию IP-адресов глобально и в интерфейсах поставщиков.

tc

Команда tc используется для настройки очереди трафика и формирования трафика на интерфейсах поставщика.