使用主机的 iptables 阻止访问 docker-container 的暴露端口

使用主机的 iptables 阻止访问 docker-container 的暴露端口

我有一个运行一些 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 阻止访问容器

答案1

问题是PREROUTINGnat 表链中的 NAT 规则转换了主机的端口3306172.17.0.2:33066而不是172.17.0.2:3306因此,过滤表链中的规则FORWARD不匹配任何内容,因为它试图丢弃转发到目标端口的流量3306

相关内容