iptables はすべてのトラフィックを 2 つの異なるチェーンにルーティングしますか?

iptables はすべてのトラフィックを 2 つの異なるチェーンにルーティングしますか?

自分で書いていない 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 に入ります。

関連情報