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