自分で書いていない iptables 設定をデバッグしています。この設定は、ルーター自体で実行されているいくつかの Docker コンテナー (Portainer と Nginx Proxy Manager) の周囲にファイアウォールを提供するはずですが、何かがおかしく、どちらの Docker コンテナーも WAN に Web サイトを提供できません。iptables -L -v -n
出力は次のようになります。
root@FriendlyWrt:/proc/sys/net/bridge# iptables -L -v -n
# Warning: iptables-legacy tables present, use iptables-legacy to see them
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
1400K 251M DOCKER-USER all -- * * 0.0.0.0/0 0.0.0.0/0
1397K 251M DOCKER-ISOLATION-STAGE-1 all -- * * 0.0.0.0/0 0.0.0.0/0
5815 404K ACCEPT all -- * docker0 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
2580 116K DOCKER all -- * docker0 0.0.0.0/0 0.0.0.0/0
15447 7639K ACCEPT all -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- docker0 docker0 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain DOCKER (1 references)
pkts bytes target prot opt in out source destination
83 4836 ACCEPT tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.2 tcp dpt:9443
1 60 ACCEPT tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.2 tcp dpt:8000
29 1740 ACCEPT tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.3 tcp dpt:443
1 60 ACCEPT tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.3 tcp dpt:81
2 120 ACCEPT tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.3 tcp dpt:80
Chain DOCKER-ISOLATION-STAGE-1 (1 references)
pkts bytes target prot opt in out source destination
15447 7639K DOCKER-ISOLATION-STAGE-2 all -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0
1397K 251M RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
Chain DOCKER-ISOLATION-STAGE-2 (1 references)
pkts bytes target prot opt in out source destination
0 0 DROP all -- * docker0 0.0.0.0/0 0.0.0.0/0
15447 7639K RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
Chain DOCKER-MAN (1 references)
pkts bytes target prot opt in out source destination
8395 519K RETURN all -- br-lan docker0 0.0.0.0/0 0.0.0.0/0
2805 167K DROP all -- * docker0 0.0.0.0/0 0.0.0.0/0 ctstate INVALID,NEW
236 59251 RETURN all -- * docker0 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
1388K 251M RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
Chain DOCKER-USER (1 references)
pkts bytes target prot opt in out source destination
1400K 251M DOCKER-MAN all -- * * 0.0.0.0/0 0.0.0.0/0
236 59251 REJECT all -- eth0 docker0 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
1397K 251M RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
「forward」チェーンの先頭で、すべてのトラフィックが「docker-user」チェーンに送信され、次のルールで、残りのすべてのトラフィックが「docker-isolation-stage-1」チェーンに送信されるようです。すべてを「docker-user」に送信した後は、ソートするトラフィックはなくなり、チェーンの残りの部分は完全に使用されないと思われます。しかし、各ルールで同量のトラフィックがキャッチされ、その後、さらにトラフィックが 3 行目に進んでいるようです。ここで何が起こっているのでしょうか。「forward」の最初の 2 行では実際に何がテストされているのでしょうか。
答え1
モバイルではコメントが長すぎる
パケットをカスタム/新しいチェーンに送信すると、そこからパケットが返されないと想定しているようです。これは少し間違っています。
iptablesのルールは順番にチェックされる
パケットがそのパケットの運命に関する最終決定を与えるルールに一致すると、処理は停止します (通常は ACCEPT、DROP、REJECT ですが、私が見落としているものもあります)
ルールが新しい/カスタム チェーンにジャンプする場合:
- そのチェーンが入力される
- そのチェーン内のすべてのルールは、そのパケットの運命について最終決定が下されるまで順番にチェックされます。
- パケットの運命に関する最終決定がなされない場合:
前のチェーンに戻る
これがチェーン DOCKER-USER で起こることです。DOCKER-MAN チェーンのルールや、最終決定につながる後続の REJECT ルールに一致するパケットはほんの一握りです。入力されたパケットのほとんどは最終決定を満たさず、FORWARD チェーンに戻り、次のルールによって処理され、チェーン DOCKER-ISOLATION-STAGE-1 に入ります。