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

Операционная система 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 используется для связи с демоном netd , который выполняет большую часть настройки сети на Android. Оболочка допускает следующие команды:

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

тк

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