ネットワーク スタック構成ツール

Android オペレーティング システムには、ifconfigipip6tables などの標準的な Linux ネットワーク ユーティリティが含まれています。これらのユーティリティはシステム イメージ上に存在し、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 でテストされます。
  • ラッパーを起動する必要があるベンダー ドメイン(プロセス)は、ドメイン移行ルール domain_auto_trans(VENDOR-DOMAIN-NAME, netutils_wrapper_exec, netutils_wrapper) を SELinux ポリシーに追加する必要があります。

Netutils ラッパー フィルタ

ラップされたユーティリティは、Linux ネットワーク スタックのほぼすべての要素を構成するために使用できます。ただし、安定したインターフェースを維持し、システム パーティションのアップデートを可能にするために、コマンドライン引数の特定の組み合わせのみが許可され、他のコマンドは拒否されます。

ベンダー インターフェースとベンダー チェーン

ラッパーには、ベンダー インターフェースというコンセプトがあります。これは、モバイルデータ インターフェースなど、一般的にベンダーコードによって管理されるインターフェースです。通常、他のタイプのインターフェース(Wi-Fi など)は HAL とフレームワークによって管理されます。ラッパーは、ベンダー インターフェースを(正規表現を使用して)名前で認識し、ベンダーコードがそれらに対して多くのオペレーションを実行できるようにします。現在、ベンダー インターフェースには次のものがあります。

  • 名前が「oem」で終わり、その後に番号が続くインターフェース(oem0r_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

ndc は、Android でほとんどのネットワーク構成を行う netd デーモンと通信するために使用します。ラッパーを使用すると、次のようなコマンドを実行できます。

  • OEM ネットワーク(oemXX)の作成と破棄。
  • OEM ネットワークへのベンダー管理インターフェースの追加。
  • OEM ネットワークへのルートの追加。
  • グローバルまたはベンダー インターフェースでの、IP 転送の有効化または無効化。

tc

tc コマンドは、ベンダー インターフェース上のトラフィックのキューイングとシェーピングを構成するために使用します。