iptables 將所有流量路由到兩個不同的鏈?

iptables 將所有流量路由到兩個不同的鏈?

我正在調試一個不是我編寫的 iptables 設定。此設定應該為路由器本身上運行的一些 Docker 容器(Portainer 和 Nginx 代理程式管理員)提供防火牆,但出了問題,兩個 Docker 容器都無法為 WAN 提供網站服務。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」的前兩行實際上測試的是什麼?

答案1

在行動裝置上,評論太長

您似乎認為將資料包發送到自訂/新鏈意味著它不會從那裡返回。這有些不正確。

依序檢查iptables中的規則

當封包匹配一條規則時,處理就會停止,該規則對該封包的命運做出最終決定(通常是 ACCEPT 、 DROP 、 REJECT ,也許還有我忽略的其他規則)

當規則跳到新的/自訂的鏈時:

  • 該鏈已輸入
  • 該鏈中的所有規則都會按順序檢查,直到對該資料包的命運做出最終決定
  • 如果沒有對資料包的命運做出最終決定:
    返回上一個鏈

這就是您的 DOCKER-USER 鏈中發生的情況,只有少數資料包與 DOCKER-MAN 鏈中的規則或隨後的 REJECT 規則匹配,從而得出最終決定。幾乎所有進入的資料包都不符合最終決定,返回 FORWARD 鏈,由下一條規則處理,它們將進入 DOCKER-ISOLATION-STAGE-1 鏈

相關內容