我有许多运行 Docker 的 CentOS 7 VPS,由 Cattle(Rancher)负责协调。
这些 VPS 只能从互联网上的几个 IP 地址访问,所有其他来源都应被删除/忽略。我已经正确配置了防火墙,并且限制适用于标准系统服务(例如 SSH),但是当我将容器部署到它们时,暴露的端口从任何地方都被允许。
看起来 Docker 正在将主机 IP/端口映射到容器 IP/端口(这是正确的),但是这条规则在我的显式源允许列表之前被插入到 netfilter 中……
有什么办法可以解决这个问题吗?任何帮助都将不胜感激。
答案1
是的,您只需让您的阻止防火墙条目在 docker 添加的条目之前进行评估。
在我的环境中,docker 将允许规则添加到名为 DOCKER 的链中,并将拒绝规则添加到名为 DOCKER-ISOLATION 的链中。这些规则在 FORWARD 链的开头进行评估。因此,如果您的环境与我的环境类似,只需将您自己的规则粘贴在 FORWARD 链的顶部即可。这在“filter”表中。我最近对“filter”和“nat”表感到困惑。
希望这能有所帮助 -Dylan
答案2
我为这个问题奋斗了几个小时,但这里有一个使用iptables
而不是 的解决方案firewalld
。
关键是要在 Docker 之前将块放入。然而,Docker 有一个坏习惯,就是在每次服务重新启动时将其规则放在表链的顶部FORWARD
。filter
所以...我必须发挥创造力并利用mangle
表和POSTROUTING
链,如下所示:
*mangle
:IS-ALLOWED -
-A IS-ALLOWED ! -o docker0 -j RETURN
-A IS-ALLOWED -o docker0 -s 1.1.1.1 -j RETURN
-A IS-ALLOWED -j DROP
-I POSTROUTING -j IS-ALLOWED
COMMIT
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:IS-ALLOWED -
-A IS-ALLOWED -s 1.1.1.1 -j RETURN
-A IS-ALLOWED -i lo -j RETURN
-A IS-ALLOWED -j DROP
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -j IS-ALLOWED
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
这将限制仅访问1.1.1.1
机器的服务(SSH,ICMP等)和docker0
接口上的Docker转发服务。