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