System operacyjny Android zawiera standardowe narzędzia sieciowe Linuxa, takie jak ifconfig
, ip
i ip6tables
.
Te narzędzia znajdują się w pliku obrazu systemu i umożliwiają konfigurowanie całego stosu sieciowego Linuxa. Na urządzeniach z Androidem 7.x lub starszym kod dostawcy może wywoływać te pliki binarne bezpośrednio, co powoduje następujące problemy:
- Ponieważ narzędzia sieciowe są aktualizowane w ramach obrazu systemu, nie zapewniają stabilnej implementacji.
- Zakres narzędzi sieciowych jest tak szeroki, że trudno jest rozwijać obraz systemu, zapewniając jednocześnie przewidywalne działanie.
Na urządzeniach z Androidem 8.0 lub nowszym partycja dostawcy pozostaje taka sama, a partycja systemowa jest aktualizowana. Aby to osiągnąć, Android 8.0 umożliwia zdefiniowanie stabilnego interfejsu z wersją, a także korzystanie z ograniczeń SELinux, aby zachować wzajemną zależność obrazu dostawcy i obrazu systemu w ramach znanego dobrego zestawu.
Do konfigurowania warstwy sieciowej Linuksa dostawcy mogą używać narzędzi do konfiguracji sieci dostarczanych przez platformę, ale te narzędzia nie zawierają jeszcze owijarki interfejsu HIDL. Aby zdefiniować taki interfejs, Android 8.0 zawiera narzędzie netutils-wrapper-1.0
.
Kod Netutils
Narzędzie do owijania netutils
udostępnia podzbiór konfiguracji stosu sieci Linux, na który nie mają wpływu aktualizacje partycji systemowej.
Android 8.0 zawiera wersję 1.0 oprogramowania opakowującego, która umożliwia przekazywanie tych samych argumentów co opakowane narzędzia zainstalowane na partycji systemowej w /system/bin
w ten sposób:
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
Symlinki wskazują na narzędzia sieciowe zapakowane przez oprogramowanie netutils
wrapper, w tym:
ip
iptables
ip6tables
ndc
tc
Aby można było używać tych narzędzi w Androidzie 8.0 lub nowszym, implementacje dostawców muszą przestrzegać tych zasad:
- Procesy dostawcy nie mogą być wykonywane bezpośrednio przez interfejs
/system/bin/netutils-wrapper-1.0
. Próby wykonania tego działania kończą się błędem. - Wszystkie narzędzia zapakowane przez
netutils-wrapper-1.0
muszą być uruchamiane za pomocą ich linków symbolicznych. Zmień na przykład kod dostawcy, który wcześniej wykonywał tę czynność (/system/bin/ip <FOO> <BAR>
), na/system/bin/ip-wrapper-1.0 <FOO> <BAR>
. - Wykonywanie owijek bez przejścia do domeny jest zabronione w zasadach SELinux. Tej reguły nie można zmieniać. Jest ona testowana w ramach kompatybilności z pakietem Compatibility Test Suite (CTS).
- Uruchamianie narzędzi bezpośrednio (np.
/system/bin/ip <FOO> <BAR>
) z procesów dostawcy jest również zabroniona w zasadach SELinux platformy. Tej reguły nie można zmieniać i jest ona testowana w CTS. - Każda domena dostawcy (proces), która musi uruchamiać owijacz, musi dodać w zasadach SELinux tę regułę przejścia domeny:
domain_auto_trans(VENDOR-DOMAIN-NAME, netutils_wrapper_exec, netutils_wrapper)
.
Filtry obudowy Netutils
Opakowane narzędzia można używać do konfigurowania niemal wszystkich aspektów warstwy sieciowej Linuksa. Aby jednak zapewnić stabilność interfejsu i możliwość instalowania aktualizacji na partycji systemowej, dozwolone są tylko określone kombinacje argumentów wiersza poleceń. Pozostałe polecenia są odrzucane.
Interfejsy i łańcuchy dostawców
Opakowanie zawiera koncepcję interfejsów dostawców. Są to interfejsy, którymi zwykle zarządza kod dostawcy, np. interfejsy danych komórkowych. Zazwyczaj innymi typami interfejsów (np. Wi-Fi) zarządzają HAL-e i platforma. Opakowanie rozpoznaje interfejsy dostawców po nazwie (za pomocą wyrażenia regularnego) i pozwala kodowi dostawcy wykonywać na nich wiele operacji. Obecnie interfejsy dostawców:
- interfejsy, których nazwy kończą się na „oem” i cyfrze, np.
oem0
lubr_oem1234
; - interfejsy używane przez obecne implementacje SOC i OEM, takie jak
rmnet_data[0-9]
.
Nazwy interfejsów, którymi zwykle zarządza platforma (np. wlan0
), nigdy nie są interfejsami dostawcy.
Opakowanie ma podobną koncepcję łańcuchów dostawców. Są one używane w poleceniach iptables
i także rozpoznawane po nazwie. Obecnie łańcuchy dostaw:
- Rozpocznij od
oem_
. - są używane przez obecne implementacje SOC i OEM, np. łańcuchy zaczynające się od
nm_
lubqcom_
;
Dozwolone polecenia
Poniżej znajdziesz listę dozwolonych poleceń. Ograniczenia są wdrażane za pomocą zbioru wyrażeń regularnych w wykonywanych wierszach poleceń. Więcej informacji znajdziesz w artykule system/netd/netutils_wrappers/NetUtilsWrapper-1.0.cpp
.
ip
Polecenie ip
służy do konfigurowania adresów IP, routingu, szyfrowania IPsec i innych parametrów sieci. Opakowanie umożliwia te polecenia:
- dodawać i usuwać adresy IP z interfejsów zarządzanych przez dostawców.
- Skonfiguruj szyfrowanie IPsec.
iptables i ip6tables
Polecenia iptables
i ip6tables
służą do konfigurowania zapory, przekształcania pakietów, NAT-u i innych rodzajów przetwarzania pakietów.
Oto polecenia, które można wykonywać za pomocą obudowy:
- dodawać i usuwać łańcuchy dostawców,
- Dodawaj i usuwaj reguły w dowolnym łańcuchu, który odnosi się do pakietów wchodzących (
-i
) lub wychodzących (-o
) z interfejsu dostawcy. - Przechodzenie do łańcucha dostawców z dowolnego miejsca w dowolnym łańcuchu.
ndc
ndc
służy do komunikacji z demonem netd
, który wykonuje większość konfiguracji sieci w Androidzie. Oto polecenia, które można wykonywać za pomocą owijarki:
- Tworzenie i usuwanie sieci OEM (
oemXX
). - Dodawanie interfejsów zarządzanych przez dostawcę do sieci OEM.
- Dodawanie tras do sieci OEM.
- Włączanie i wyłączanie przekierowywania adresów IP globalnie i w interfejsach dostawców.
tc
Polecenie tc
służy do konfigurowania kolejk i kształtowania ruchu w interfejsach dostawców.