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

Операционная система 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 используется для настройки организации очередей и формирования трафика на интерфейсах поставщиков.