Das Android-Betriebssystem enthält standardmäßige Linux-Netzwerkdienstprogramme wie ifconfig
, ip
und ip6tables
.
Diese Dienstprogramme befinden sich auf dem System-Image und ermöglichen die Konfiguration des gesamten Linux-Netzwerkstacks. Auf Geräten mit Android 7.x und niedriger ist es Anbietercode erlaubt, diese Binärdateien direkt aufzurufen. Dies führt zu den folgenden Problemen:
- Da Netzwerk-Dienstprogramme im Systemabbild aktualisiert werden, bieten sie keine stabile Implementierung.
- Der Umfang der Netzwerk-Dienstprogramme ist so groß, dass es schwierig ist, das System-Image weiterzuentwickeln und gleichzeitig ein vorhersehbares Verhalten zu gewährleisten.
Auf Geräten mit Android 8.0 und höher bleibt die Anbieterpartition unverändert, während die Systempartition aktualisiert wird. Dazu bietet Android 8.0 die Möglichkeit, eine stabile, versionierte Schnittstelle zu definieren und gleichzeitig SELinux-Einschränkungen zu verwenden, um die Abhängigkeit zwischen Anbieter- und System-Image auf ein bekanntes, fehlerfreies Set zu beschränken.
Anbieter können die von der Plattform bereitgestellten Netzwerkkonfigurations-Dienstprogramme verwenden, um den Linux-Netzwerkstack zu konfigurieren. Diese Dienstprogramme enthalten jedoch noch keinen HIDL-Schnittstellen-Wrapper. Android 8.0 enthält das Tool netutils-wrapper-1.0
, mit dem Sie eine solche Benutzeroberfläche definieren können.
Netutils-Wrapper
Das netutils
-Wrapper-Dienstprogramm bietet einen Teil der Linux-Netzwerkstack-Konfiguration, der nicht von Aktualisierungen der Systempartition betroffen ist.
Android 8.0 enthält Version 1.0 der Wrapper, mit denen Sie dieselben Argumente wie die gewickelten Dienstprogramme übergeben können, die in der Systempartition unter /system/bin
installiert sind. Gehen Sie dazu so vor:
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
Symlinks zeigen die Netzwerk-Dienstprogramme, die vom netutils
-Wrapper umschlossen sind. Dazu gehören:
ip
iptables
ip6tables
ndc
tc
Damit diese Dienstprogramme unter Android 8.0 und höher verwendet werden können, müssen Anbieterimplementierungen die folgenden Regeln einhalten:
- Anbieterprozesse dürfen
/system/bin/netutils-wrapper-1.0
nicht direkt ausführen. Versuche dazu führen zu Fehlern. - Alle von
netutils-wrapper-1.0
umhüllten Dienstprogramme müssen über ihre Symbolverknüpfungen gestartet werden. Ändern Sie beispielsweise den Anbietercode, der dies zuvor getan hat (/system/bin/ip <FOO> <BAR>
), in/system/bin/ip-wrapper-1.0 <FOO> <BAR>
. - Die Ausführung der Wrapper ohne Domainübergang ist in der SELinux-Richtlinie der Plattform verboten. Diese Regel darf nicht geändert werden und wird in der Android Compatibility Test Suite (CTS) getestet.
- Ausführen der Dienstprogramme direkt (z.B.
/system/bin/ip <FOO> <BAR>
) aus den Anbieterprozessen ist auch in den SELinux-Richtlinien der Plattform verboten. Diese Regel darf nicht geändert werden und wird im CTS getestet. - Jede Anbieterdomain (jeder Prozess), die bzw. der einen Wrapper starten muss, muss der SELinux-Richtlinie die folgende Domainübergangsregel hinzufügen:
domain_auto_trans(VENDOR-DOMAIN-NAME, netutils_wrapper_exec, netutils_wrapper)
.
Netutils-Wrapper-Filter
Mit verpackten Dienstprogrammen können fast alle Aspekte des Linux-Netzwerkstacks konfiguriert werden. Damit jedoch eine stabile Benutzeroberfläche aufrechterhalten und Updates für die Systempartition zugelassen werden können, sind nur bestimmte Kombinationen von Befehlszeilenargumenten zulässig. Andere Befehle werden abgelehnt.
Anbieteroberflächen und -ketten
Der Wrapper hat ein Konzept für Anbieterschnittstellen. Diese Schnittstellen werden in der Regel über Anbietercode verwaltet, z. B. Mobilfunkschnittstellen. Andere Arten von Schnittstellen (z. B. WLAN) werden in der Regel von den HALs und dem Framework verwaltet. Der Wrapper erkennt Anbieterschnittstellen anhand ihres Namens (mithilfe eines regulären Ausdrucks) und ermöglicht es dem Anbietercode, viele Vorgänge darauf auszuführen. Derzeit gibt es folgende Anbieterschnittstellen:
- Schnittstellen, deren Namen auf „oem“ gefolgt von einer Zahl enden, z. B.
oem0
oderr_oem1234
. - Schnittstellen, die von aktuellen SOC- und OEM-Implementierungen verwendet werden, z. B.
rmnet_data[0-9]
.
Namen von Schnittstellen, die in der Regel vom Framework verwaltet werden (z. B. wlan0
), sind keine Anbieterschnittstellen.
Der Wrapper hat ein ähnliches Konzept von Anbieterketten. Sie werden in iptables
-Befehlen verwendet und auch per Namen erkannt. Derzeit gilt für Anbieterketten Folgendes:
- Beginnen Sie mit
oem_
. - Werden von aktuellen SOC- und OEM-Implementierungen verwendet, z.B. Ketten, die mit
nm_
oderqcom_
beginnen.
Zulässige Befehle
Unten finden Sie eine Liste der derzeit zulässigen Befehle. Einschränkungen werden über eine Reihe von regulären Ausdrücken in den ausgeführten Befehlszeilen implementiert. Weitere Informationen finden Sie unter system/netd/netutils_wrappers/NetUtilsWrapper-1.0.cpp
.
IP
Mit dem Befehl ip
können Sie IP-Adressen, Routing, IPsec-Verschlüsselung und eine Reihe anderer Netzwerkparameter konfigurieren. Der Wrapper ermöglicht die folgenden Befehle:
- IP-Adressen zu von Anbietern verwalteten Schnittstellen hinzufügen und daraus entfernen
- Konfigurieren Sie die IPsec-Verschlüsselung.
iptables und ip6tables
Mit den Befehlen iptables
und ip6tables
werden Firewalls, Paketmanipulation, NAT und andere Paketverarbeitung konfiguriert.
Der Wrapper unterstützt die folgenden Befehle:
- Anbieterketten hinzufügen und entfernen
- Fügen Sie in jeder Kette Regeln hinzu, die sich auf Pakete beziehen, die in eine Anbieterschnittstelle (
-i
) oder aus einer Anbieterschnittstelle (-o
) eingehen. - Von einer beliebigen Stelle in einer anderen Anbieterkette zu einer Anbieterkette springen.
ndc
ndc
wird verwendet, um mit dem netd
-Daemon zu kommunizieren, der die meisten Netzwerkkonfigurationen unter Android durchführt. Der Wrapper unterstützt die folgenden Befehle:
- OEM-Netzwerke erstellen und löschen (
oemXX
) - Fügen Sie OEM-Netzwerken vom Anbieter verwaltete Schnittstellen hinzu.
- Fügen Sie OEM-Netzwerken Routen hinzu.
- Aktivieren oder deaktivieren Sie die IP-Weiterleitung global und auf Anbieteroberflächen.
tc
Mit dem Befehl tc
können Sie die Traffic-Warteschlangen und ‑Formung auf Anbieterschnittstellen konfigurieren.