Netzwerk-Stack-Konfigurationstools

Das Android-Betriebssystem enthält standardmäßige Linux-Netzwerkdienstprogramme wie ifconfig , ip und ip6tables . Diese Dienstprogramme befinden sich im Systemabbild und ermöglichen die Konfiguration des gesamten Linux-Netzwerkstapels. Auf Geräten mit Android 7.x und niedriger ist es dem Herstellercode gestattet, diese Binärdateien direkt aufzurufen, was zu folgenden Problemen führt:

  • Da Netzwerkdienstprogramme im Systemabbild aktualisiert werden, bieten sie keine stabile Implementierung.
  • Der Umfang der Netzwerkdienstprogramme ist so groß, dass es schwierig ist, das Systemabbild weiterzuentwickeln und gleichzeitig ein vorhersehbares Verhalten zu gewährleisten.

Auf Geräten mit Android 8.0 und höher bleibt die Herstellerpartition gleich, während die Systempartition ein Update erhält. Um dies zu erreichen, bietet Android 8.0 die Möglichkeit, eine stabile, versionierte Schnittstelle zu definieren und gleichzeitig SELinux-Einschränkungen zu verwenden, um die gegenseitige Abhängigkeit von Anbieter und System-Image auf einem bekanntermaßen guten Satz zu halten.

Anbieter können die von der Plattform bereitgestellten Netzwerkkonfigurationsdienstprogramme verwenden, um den Linux-Netzwerkstapel zu konfigurieren. Diese Dienstprogramme enthalten jedoch noch keinen HIDL-Schnittstellen-Wrapper. Um eine solche Schnittstelle zu definieren, enthält Android 8.0 das Tool netutils-wrapper-1.0 .

Netutils-Wrapper

Das netutils Wrapper-Dienstprogramm stellt eine Teilmenge der Linux-Netzwerk-Stack-Konfiguration bereit, die nicht von Systempartitionsaktualisierungen betroffen ist. Android 8.0 enthält Version 1.0 der Wrapper, die es Ihnen ermöglicht, dieselben Argumente wie die umschlossenen Dienstprogramme zu übergeben, die wie folgt in der Systempartition unter /system/bin installiert sind:

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 vom netutils Wrapper verpackten Netzwerkdienstprogramme, darunter:

  • ip
  • iptables
  • ip6tables
  • ndc
  • tc

Um diese Dienstprogramme in Android 8.0 und höher verwenden zu können, müssen Anbieterimplementierungen die folgenden Regeln einhalten:

  • Anbieterprozesse dürfen /system/bin/netutils-wrapper-1.0 nicht direkt ausführen; Versuche, dies zu tun, führen zu Fehlern.
  • Alle von netutils-wrapper-1.0 verpackten Dienstprogramme müssen mit ihren symbolischen Links gestartet werden. Ändern Sie beispielsweise den Herstellercode, 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 Domänenübergang ist in der SELinux-Plattformrichtlinie verboten. Diese Regel darf nicht geändert werden und wird in der Android Compatibility Test Suite (CTS) getestet.
  • Die direkte Ausführung der Dienstprogramme (z. B. /system/bin/ip <FOO> <BAR> ) aus den Anbieterprozessen ist in den SELinux-Plattformrichtlinien ebenfalls verboten. Diese Regel darf nicht geändert werden und wird im CTS geprüft.
  • Jede Anbieterdomäne (Prozess), die einen Wrapper starten muss, muss die folgende Domänenübergangsregel in der SELinux-Richtlinie hinzufügen: domain_auto_trans( VENDOR-DOMAIN-NAME , netutils_wrapper_exec, netutils_wrapper) .

Netutils-Wrapper-Filter

Mit verpackten Dienstprogrammen können nahezu alle Aspekte des Linux-Netzwerkstapels konfiguriert werden. Um jedoch sicherzustellen, dass eine stabile Schnittstelle aufrechterhalten und Aktualisierungen der Systempartition ermöglicht werden können, sind nur bestimmte Kombinationen von Befehlszeilenargumenten zulässig; andere Befehle werden abgelehnt.

Anbieterschnittstellen und -ketten

Der Wrapper verfügt über ein Konzept von Herstellerschnittstellen . Dabei handelt es sich um Schnittstellen, die typischerweise durch Herstellercode verwaltet werden, beispielsweise Mobilfunk-Datenschnittstellen. Normalerweise werden andere Arten von Schnittstellen (z. B. WLAN) von den HALs und dem Framework verwaltet. Der Wrapper erkennt Anbieterschnittstellen anhand ihres Namens (unter Verwendung eines regulären Ausdrucks) und ermöglicht es dem Anbietercode, viele Vorgänge auf ihnen auszuführen. Derzeit sind die Herstellerschnittstellen:

  • Schnittstellen, deren Namen auf „oem“ enden, gefolgt von einer Zahl, z. B. oem0 oder r_oem1234 .
  • Von aktuellen SOC- und OEM-Implementierungen verwendete Schnittstellen, z. B. rmnet_data[0-9] .

Namen von Schnittstellen, die normalerweise vom Framework verwaltet werden (z. B. wlan0 ), sind niemals Herstellerschnittstellen.

Der Wrapper hat ein ähnliches Konzept von Anbieterketten . Diese werden in iptables Befehlen verwendet und auch namentlich erkannt. Derzeit sind Anbieterketten:

  • Beginnen Sie mit oem_ .
  • Werden von aktuellen SOC- und OEM-Implementierungen verwendet, z. B. Ketten, die mit nm_ oder qcom_ beginnen.

Erlaubte Befehle

Die derzeit zulässigen Befehle sind unten aufgeführt. Einschränkungen werden über eine Reihe regulärer Ausdrücke in den ausgeführten Befehlszeilen implementiert. Einzelheiten finden Sie unter system/netd/netutils_wrappers/NetUtilsWrapper-1.0.cpp .

IP

Mit dem Befehl ip werden IP-Adressen, Routing, IPsec-Verschlüsselung und eine Reihe anderer Netzwerkparameter konfiguriert. Der Wrapper erlaubt die folgenden Befehle:

  • Fügen Sie IP-Adressen zu anbieterverwalteten Schnittstellen hinzu und entfernen Sie sie.
  • Konfigurieren Sie die IPsec-Verschlüsselung.

iptables/ip6tables

Die Befehle iptables und ip6tables werden zum Konfigurieren von Firewalling, Paketverwaltung, NAT und anderen paketbezogenen Verarbeitungen verwendet. Der Wrapper erlaubt die folgenden Befehle:

  • Anbieterketten hinzufügen und löschen.
  • Fügen Sie Regeln in jeder Kette hinzu und löschen Sie sie, die sich auf Pakete bezieht, die in ( -i ) oder aus ( -o ) einer Anbieterschnittstelle gehen.
  • Springen Sie von jedem Punkt in einer anderen Kette zu einer Anbieterkette.

NDC

ndc wird zur Kommunikation mit dem netd Daemon verwendet, der die meisten Netzwerkkonfigurationen unter Android durchführt. Der Wrapper erlaubt die folgenden Befehle:

  • Erstellen und zerstören Sie OEM-Netzwerke ( oemXX ).
  • Fügen Sie OEM-Netzwerken herstellerverwaltete Schnittstellen hinzu.
  • Fügen Sie Routen zu OEM-Netzwerken hinzu.
  • Aktivieren oder deaktivieren Sie die IP-Weiterleitung global und auf Anbieterschnittstellen.

tc

Der Befehl tc wird zum Konfigurieren der Datenverkehrswarteschlange und -gestaltung auf Anbieterschnittstellen verwendet.