我正在調試一個不是我編寫的 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 鏈