我正在尝试在运行 httpd apache 和 iptables 的 CentOS 7 VPS 上运行私有 docker 注册表。
当我启动容器时docker run -it -p 5017:5000 --name registry registry
,我尝试运行curl http://localhost:5017/v2
,但在 5 分钟后出现以下错误(之前没有其他输出):
curl: (56) Recv failure: Connection reset by peer
我发现,如果我禁用 iptables,我就可以正常连接到我的 docker 容器。我查看了我的 iptable 规则,发现如果我注释掉其中一条规则,一切都会正常。我注释掉的规则是-A OUTPUT -j DROP
。但我真的不想允许所有传出流量。这样可以吗?还是我必须打开某个特定端口?
我尝试添加以下所有规则,但都无济于事。
-A INPUT -p tcp --dport 5000 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp --sport 5000 -m state --state ESTABLISHED -j ACCEPT
-A INPUT -p tcp --dport 5017 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp --sport 5017 -m state --state ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 5000 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 5000 -j ACCEPT
-A FORWARD -p tcp -m tcp --dport 5000 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 5017 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 5017 -m state --state ESTABLISHED -j ACCEPT
-A FORWARD -p tcp -m tcp --dport 5017 -j ACCEPT
答案1
删除OUTPUT
规则中的所有流量将阻止您访问主机上的任何容器:从系统的角度来看,容器有一个“网络上其他地方”的地址,就像可以通过以太网或 WiFi 连接访问的任何东西一样。
如果您想要阻止“所有从主接口发出的流量”,您可以编写如下内容:
iptables -A OUTPUT -o eth0 -j DROP
这只会影响退出的流量eth0
(但由于这会阻止 DNS 等工作,因此您可能需要更细致的规则集)。