iptables -L、iprule show(ポリシーベースのルーティング)、複数のテーブルを持つiprouteの出力を理解する

iptables -L、iprule show(ポリシーベースのルーティング)、複数のテーブルを持つiprouteの出力を理解する

コマンドの出力を解釈する方法iptables -Lと、それをコマンドで使用する方法のip rule show良い説明を探していますip route show table <table_name>

WiFiホットスポットサービスがオンになっていると、OnePlus 8 Proの過度に複雑なポリシーベースのルーティングを理解するのが困難になりました。 CCNAおよびCisco Certified Specialist - Enterprise Core認証を持っているので、ルーティングとポリシーベースのルーティングについてすべてを知ることはできませんが、まだ助けが必要です。

私はLinuxについてよく知りませんiptables。私はいくつかの出力ip rule show(たとえば、優先順位とルールが一致した場合に確認されるルーティングテーブル)を理解します。単一のテーブルを使用することは確信していますip routeが、ポリシーベースのルーティングと組み合わせるときはわかりません。

残念ながら、私のOnePlus 8 Proは、何らかの理由でiptableをポリシーベースのルーティングテーブルと複数のルーティングテーブルと組み合わせるようです。私のシステムはルートされており、ほとんどの標準Linuxコマンドラインツールを提供するbusyboxがインストールされています。

だから私が理解しようとしている混乱は次のとおりです。

まず、デバイスのインターフェイスのリストは次のとおりです。

OnePlus8Pro# ifconfig
dummy0    Link encap:Ethernet  HWaddr ae:22:9c:ac:69:85
          inet6 addr: fe80::ac22:9cff:feac:6985/64 Scope: Link
          UP BROADCAST RUNNING NOARP  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:113 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 TX bytes:15971

wlan0     Link encap:Ethernet  HWaddr 4c:4f:ee:96:b3:ed  Driver cnss_pci
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3000
          RX bytes:0 TX bytes:0

rmnet_data3 Link encap:UNSPEC
          inet6 addr: fe80::a00e:387b:f22e:c336/64 Scope: Link
          inet6 addr: 2607:fc20:1bc3:a194:a00e:387b:f22e:c336/64 Scope: Global
          UP RUNNING  MTU:1500  Metric:1
          RX packets:10 errors:0 dropped:0 overruns:0 frame:0
          TX packets:18 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:804 TX bytes:1284

rmnet_data0 Link encap:UNSPEC
          inet6 addr: fe80::11c2:944d:89dd:e766/64 Scope: Link
          UP RUNNING  MTU:1500  Metric:1
          RX packets:51 errors:0 dropped:0 overruns:0 frame:0
          TX packets:36 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:7720 TX bytes:2487

rmnet_mhi0 Link encap:UNSPEC    Driver mhi_netdev
          UP RUNNING  MTU:65535  Metric:1
          RX packets:48471 errors:0 dropped:0 overruns:0 frame:0
          TX packets:42815 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:23427476 TX bytes:11997668

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope: Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:59 errors:0 dropped:0 overruns:0 frame:0
          TX packets:59 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:5850 TX bytes:5850

wlan1     Link encap:Ethernet  HWaddr 62:59:38:18:bc:69  Driver cnss_pci
          inet addr:192.168.42.149  Bcast:192.168.42.255  Mask:255.255.255.0
          inet6 addr: fe80::6059:38ff:fe18:bc69/64 Scope: Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:4599 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1756 errors:0 dropped:44 overruns:0 carrier:0
          collisions:0 txqueuelen:3000
          RX bytes:859009 TX bytes:143474

rmnet_data2 Link encap:UNSPEC
          inet addr:33.215.218.82  Mask:255.255.255.252
          UP RUNNING  MTU:1440  Metric:1
          RX packets:30742 errors:0 dropped:0 overruns:0 frame:0
          TX packets:35534 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:21959066 TX bytes:11141381

以下はルーティングです。

OnePlus8Pro# ip route
33.215.218.80/30 dev rmnet_data2 proto kernel scope link src 33.215.218.82
192.168.42.0/24 dev wlan1 proto kernel scope link src 192.168.42.149

IPルール(ポリシーベースのルーティング)は次のようになります。

OnePlus8Pro# ip rule show
0:      from all lookup local
10000:  from all fwmark 0xc0000/0xd0000 lookup legacy_system
10500:  from all iif lo oif dummy0 uidrange 0-0 lookup dummy0
10500:  from all iif lo oif rmnet_data0 uidrange 0-0 lookup rmnet_data0
10500:  from all iif lo oif rmnet_data2 uidrange 0-0 lookup rmnet_data2
10500:  from all iif lo oif wlan1 uidrange 0-0 lookup local_network
13000:  from all fwmark 0x10063/0x1ffff iif lo lookup local_network
13000:  from all fwmark 0xd0001/0xdffff iif lo lookup rmnet_data0
13000:  from all fwmark 0x10064/0x1ffff iif lo lookup rmnet_data2
14000:  from all iif lo oif dummy0 lookup dummy0
14000:  from all fwmark 0xc0000/0xc0000 iif lo oif rmnet_data0 lookup rmnet_data0
14000:  from all iif lo oif rmnet_data2 lookup rmnet_data2
14000:  from all iif lo oif wlan1 lookup local_network
15000:  from all fwmark 0x0/0x10000 lookup legacy_system
16000:  from all fwmark 0x0/0x10000 lookup legacy_network
17000:  from all fwmark 0x0/0x10000 lookup local_network
18000:  from all iif wlan1 lookup rmnet_data2
19000:  from all fwmark 0x64/0x1ffff iif lo lookup rmnet_data2
22000:  from all fwmark 0x0/0xffff iif lo lookup rmnet_data2
32000:  from all unreachable

名前付きすべてのルーティングテーブルのリスト:

OnePlus8Pro# show table all | grep "table" | sed 's/.*\(table.*\)/\1/g' | awk '{print $2}' | sort | uniq
1014
1025
dummy0
local
local_network
rmnet_data0
rmnet_data2

ip route show table <table_name>名前付き各ルーティングテーブルの出力:

OnePlus8Pro# ip route show table 1014

OnePlus8Pro# ip route show table 1025

OnePlus8Pro# ip route show table dummy0
default dev dummy0 proto static scope link

OnePlus8Pro# ip route show table local
broadcast 33.215.218.80 dev rmnet_data2 proto kernel scope link src 33.215.218.82
local 33.215.218.82 dev rmnet_data2 proto kernel scope host src 33.215.218.82
broadcast 33.215.218.83 dev rmnet_data2 proto kernel scope link src 33.215.218.82
broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
broadcast 192.168.42.0 dev wlan1 proto kernel scope link src 192.168.42.149
local 192.168.42.149 dev wlan1 proto kernel scope host src 192.168.42.149
broadcast 192.168.42.255 dev wlan1 proto kernel scope link src 192.168.42.149

OnePlus8Pro# ip route show table local_network
192.168.42.0/24 dev wlan1 proto static scope link

OnePlus8Pro# ip route show table rmnet_data0

OnePlus8Pro# ip route show table rmnet_data2
default via 33.215.218.81 dev rmnet_data2 proto static mtu 1500
33.215.218.80/30 dev rmnet_data2 proto static scope link

最後に、出力は次のようになりますiptables -L

OnePlus8Pro# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
bw_INPUT   all  --  anywhere             anywhere
fw_INPUT   all  --  anywhere             anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
oem_fwd    all  --  anywhere             anywhere
fw_FORWARD  all  --  anywhere             anywhere
bw_FORWARD  all  --  anywhere             anywhere
tetherctrl_FORWARD  all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
nm_qti_filter_ssdp_dropper  all  --  anywhere             anywhere
oem_out    all  --  anywhere             anywhere
fw_OUTPUT  all  --  anywhere             anywhere
st_OUTPUT  all  --  anywhere             anywhere
bw_OUTPUT  all  --  anywhere             anywhere

Chain bw_FORWARD (1 references)
target     prot opt source               destination
bw_costly_rmnet_data2  all  --  anywhere             anywhere
bw_costly_rmnet_data2  all  --  anywhere             anywhere

Chain bw_INPUT (1 references)
target     prot opt source               destination
bw_global_alert  all  --  anywhere             anywhere
bw_costly_rmnet_data2  all  --  anywhere             anywhere
RETURN     esp  --  anywhere             anywhere
RETURN     all  --  anywhere             anywhere             mark match 0x100000/0x100000
MARK       all  --  anywhere             anywhere             MARK or 0x100000

Chain bw_OUTPUT (1 references)
target     prot opt source               destination
bw_global_alert  all  --  anywhere             anywhere
bw_costly_rmnet_data2  all  --  anywhere             anywhere

Chain bw_costly_rmnet_data2 (4 references)
target     prot opt source               destination
bw_penalty_box  all  --  anywhere             anywhere
REJECT     all  --  anywhere             anywhere             ! quota rmnet_data2: 9223372036854775807 bytes  reject-with icmp-port-unreachable

Chain bw_costly_shared (0 references)
target     prot opt source               destination
bw_penalty_box  all  --  anywhere             anywhere

Chain bw_data_saver (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere

Chain bw_global_alert (3 references)
target     prot opt source               destination
           all  --  anywhere             anywhere             ! quota globalAlert: 2097152 bytes

Chain bw_happy_box (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere            match bpf pinned /sys/fs/bpf/prog_netd_skfilter_whitelist_xtbpf
bw_data_saver  all  --  anywhere             anywhere

Chain bw_penalty_box (2 references)
target     prot opt source               destination
REJECT     all  --  anywhere             anywhere            match bpf pinned /sys/fs/bpf/prog_netd_skfilter_blacklist_xtbpf reject-with icmp-port-unreachable
bw_happy_box  all  --  anywhere             anywhere

Chain fw_FORWARD (1 references)
target     prot opt source               destination

Chain fw_INPUT (1 references)
target     prot opt source               destination

Chain fw_OUTPUT (1 references)
target     prot opt source               destination

Chain nm_mdmprxy_doze_mode_skip (0 references)
target     prot opt source               destination

Chain nm_mdmprxy_iface_pkt_fwder (0 references)
target     prot opt source               destination

Chain nm_qti_filter_ssdp_dropper (1 references)
target     prot opt source               destination
DROP       udp  --  anywhere             anywhere             udp dpt:1900
DROP       udp  --  anywhere             anywhere             udp dpt:1900

Chain oem_fwd (1 references)
target     prot opt source               destination

Chain oem_out (1 references)
target     prot opt source               destination

Chain st_OUTPUT (1 references)
target     prot opt source               destination

Chain st_clear_caught (2 references)
target     prot opt source               destination

Chain st_clear_detect (0 references)
target     prot opt source               destination
REJECT     all  --  anywhere             anywhere             connmark match  0x2000000/0x2000000 reject-with icmp-port-unreachable
RETURN     all  --  anywhere             anywhere             connmark match  0x1000000/0x1000000
CONNMARK   tcp  --  anywhere             anywhere             u32 "0x0>>0x16&0x3c@0xc>>0x1a&0x3c@0x0&0xffff0000=0x16030000&&0x0>>0x16&0x3c@0xc>>0x1a&0x3c@0x4&0xff0000=0x10000" CONNMARK or 0x1000000
CONNMARK   udp  --  anywhere             anywhere             u32 "0x0>>0x16&0x3c@0x8&0xffff0000=0x16fe0000&&0x0>>0x16&0x3c@0x14&0xff0000=0x10000" CONNMARK or 0x1000000
RETURN     all  --  anywhere             anywhere             connmark match  0x1000000/0x1000000
st_clear_caught  tcp  --  anywhere             anywhere             state ESTABLISHED u32 "0x0>>0x16&0x3c@0xc>>0x1a&0x3c@0x0&0x0=0x0"
st_clear_caught  udp  --  anywhere             anywhere

Chain st_penalty_log (0 references)
target     prot opt source               destination
CONNMARK   all  --  anywhere             anywhere             CONNMARK or 0x1000000
NFLOG      all  --  anywhere             anywhere

Chain st_penalty_reject (0 references)
target     prot opt source               destination
CONNMARK   all  --  anywhere             anywhere             CONNMARK or 0x2000000
NFLOG      all  --  anywhere             anywhere
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable

Chain tetherctrl_FORWARD (1 references)
target     prot opt source               destination
bw_global_alert  all  --  anywhere             anywhere
tetherctrl_counters  all  --  anywhere             anywhere            [goto]  state RELATED,ESTABLISHED
DROP       all  --  anywhere             anywhere             state INVALID
tetherctrl_counters  all  --  anywhere             anywhere            [goto]
DROP       all  --  anywhere             anywhere

Chain tetherctrl_counters (2 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere
RETURN     all  --  anywhere             anywhere

これらすべてのルールを携帯電話のように処理/理解しようとしていますが、迷子になります。私は10500: from all iif lo oif rmnet_data0 uidrange 0-0 lookup rmnet_data0このような行の良い説明を見つけることができませんip rules show。また、iptablesのタグ付けとそれがどのように適用されるかを理解していません13000: from all fwmark 0xd0001/0xdffff iif lo lookup rmnet_data0

私の究極の目標は、この携帯電話のWiFiホットスポットルーティングの問題を解決するためのシェルスクリプトを書くことです。 WiFiホットスポットが起動するたびにこのスクリプトを実行する予定です。しかし、これを行うには、まずこの複雑なルーティングが何をしているのかを理解する必要があります。

私はルーティングを理解することに関連していると思われるすべての結果をここに提供しました。助けてくれてありがとう。

ベストアンサー1

でもここパーティーにはかなり遅かったです。 AOSPコードを見なくてもAndroidルーティングを理解するのは難しいです。あなたはそれを把握することができますこれは本当ですが、なぜ確かに、本当に難しいです。 Androidのルールは同時に多くのネットワークに接続することが多いため、通常のUNIXシステムのルールよりもはるかに複雑です。一部のプロセスは特定のネットワークにアクセスでき、他のプロセスは各UIDが異なるプライマリネットワークにアクセスできます。複数を使用した基本ネットワークに加えて、他のネットワーク要求アプリケーションプログラミングインターフェース。 Unixサーバーやデスクトップコンピュータはこれらの複雑さを処理する必要はなく、より簡単なルーティングを介して実行できます。

ルールの仕組みに興味がある場合は、始めてください。ここ最新のコードを入手してください(興味のある特定のAndroidバージョンの前の四半期を確認できます)。これに加えて、デバイスメーカーは変更することができ、しばしば変更する可能性があるため、特定のデバイスの詳細が異なる場合があります。

一般的なアイデアは、ルーティングが最初に各ルールを優先順位(低から低)まで調べることです。パケットがルールと一致すると、カーネルは接続テーブルを検索します。そこで目的地を見つけたら、そこからパケットを送信し、そうでない場合は戻って次の規則を評価します。

このようなルール

10500:  from all iif lo oif rmnet_data0 uidrange 0-0 lookup rmnet_data0

man ip-ruleで説明されています。簡単に言うと:

  • 10500最優先事項です。パスはルールを昇順で評価します。同じ優先順位を持つ2つのルールの順序は定義されていません。
  • from all iif lo oif rmnet_data0 uidrange 0-0フィルターです。それぞれは2つの単語です。
    • from allすべてのソースが一致することを意味します。
    • iif lo(ローカル入力インターフェイスの場合)ローカルで生成されたトラフィックのみが一致します(転送されたトラフィックは一致しません)。
    • oif rmnet_data0(出力インターフェイスの場合)そのrmnet_data0インターフェイスに向かうトラフィックのみが一致します。
    • uidrange 0-00と0の間のUIDから発生するトラフィックのみを一致させます(したがって、この例ではUID 0のみ)。 Androidのすべてのアプリケーションには異なるUIDがあります。
  • lookup rmnet_data0簡単に言えば、パケットがすべてのフィルタと一致する場合は、rmnet_data0テーブルを検索してパスを見つける必要があります。ある場合はそれに従い、そうでない場合は次の規則に進みます。

マーキングの場合、ここあなたが始めたい場所です。 Androidはファイアウォールフラグを使用して、ネットワーク権限とアプリケーションの明示的な要求を管理します。コードが示すように、ファイアウォールタグの下部の16ビットはネットワークIDです(Androidは各ネットワークに16ビットネットワークIDを割り当てます)。高いビットは権限、会計などに使用されます。

このようなフィルタを見ると、fwmark 0xd0001/0xdffffソケットの表示を右部分(ここでは0xdffff)にマスキングし、これを左部分(ここでは0xd0001)と比較するという意味です。この場合、コードを再検索すると、0xdffffはビット0〜15(netId)、ビット16(「明示的選択」)、ビット18、および19(権限)を予約します。ブロック後にソケットタグ0xd0001を持つトラフィックはこのルールと一致するため、netId 1は明示的に選択されたネットワークにバインドする必要があります(これは、アプリケーションがデフォルトネットワークではなく一部のAPIを使用してこのネットワークを要求したことを意味します)。 2つの特権ビットがあります(したがって、Android特権を持つ特権アプリケーションである必要がありますUSE_RESTRICTED_NETWORKS)。

ソケットの表示方法は別の話です。ただし、簡単に言えば、connectネットワークを選択できるいくつかのAndroid APIを呼び出すと、Androidはシステムコールのフックを使用してソケットを次の場所に送信します(Androidのみ)。 netdデーモンを使用すると、netdはソケットを表示します。論理を見ることができるこのコードでは詳細に興味があれば。また、許可されたソケットを表示するためのいくつかのiptablesルールと、詳細を知りたい場合は、コードで見つけることができる多くの技術的な詳細もあります。

役に立つことを願って、

おすすめ記事