Iptables

使用主機的 iptables 來防止訪問 docker-container 的暴露埠

  • March 24, 2015

我有一個執行幾個 docker 容器的主機。

該主機有幾個網路介面,我的目標是使容器中的一些暴露埠只能由某些介面訪問,並阻止其他人訪問。

我想為此使用主機的 iptables。

但它不可能簡單地做:

iptables -I INPUT -i vlan2 --dport 80 -j DROP

因為數據包是通過預路由轉發的。

iptables -t nat -L PREROUTING                                                                                                                               2
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DOCKER     all  --  anywhere             anywhere             ADDRTYPE match dst-type LOCAL

Chain DOCKER (2 references)
target     prot opt source               destination         
DNAT       tcp  --  anywhere             anywhere             tcp dpt:mysql to:172.17.0.2:33066
DNAT       tcp  --  anywhere             anywhere             tcp dpt:http to:172.17.0.4:80

有兩個暴露的埠 80 和 3306 到不同的容器,我想讓它無法從介面 vlan2 訪問

在我添加這個之後:

iptables -I FORWARD -i vlan2 -p tcp --dport 80 -j REJECT

Web 伺服器停止工作,但

iptables -I FORWARD -i vlan2 -p tcp --dport 3306 -j REJECT

不要阻止連接到mysql,我仍然可以連接。tcpdump 證明了這一點:

tcpdump -n -i vlan2 port 3306
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on vlan2, link-type EN10MB (Ethernet), capture size 262144 bytes
22:48:13.066636 IP 3.2.2.2.47259 > 1.1.2.3.3306: Flags [S], seq 3619220560, win 29200, options [mss 1460,sackOK,TS val 90183390 ecr 0,nop,wscale 7], length 0
22:48:13.066740 IP 1.1.2.3.3306 > 3.2.2.2.47259: Flags [S.], seq 2743923517, ack 3619220561, win 28960, options [mss 1460,sackOK,TS val 10989883 ecr 90183390,nop,wscale 7], length 0

我無法理解這兩個規則之間的區別。

如何使用主機的 iptables 來阻止對容器的訪問

問題是PREROUTINGnat 錶鍊中的 NAT 規則將主機的埠轉換**3306172.17.0.2:33066而不是轉換為,172.17.0.2:3306因此過濾錶鍊中的規則FORWARD不匹配任何內容,因為它試圖丟棄轉發到目標埠的流量3306**。

引用自:https://serverfault.com/questions/677944