コマンドの出力を解釈する方法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-0
0と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ルールと、詳細を知りたい場合は、コードで見つけることができる多くの技術的な詳細もあります。
役に立つことを願って、