我对Docker在修改防火墙规则方面的行为感到非常不满,因为它只是打开我服务器上的所有端口。
所以我已经安装了iptables-persistent并设置了一些防火墙规则,阻止除端口22,80和443之外的所有传入stream量,并确保Docker停止混乱这些规则,方法是创build/etc/systemd/system/docker.service.d/noiptables.conf包含以下内容:
[Service] ExecStart= ExecStart=/usr/bin/dockerd --iptables=false -H "fd://"
然后重新启动服务器。
现在我的问题是,我的Docker容器不能访问互联网(接口:ens3)了。
这些是我的规则:
*nat :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] -A POSTROUTING -o ens3 -j MASQUERADE COMMIT *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] # Allow localhost -A INPUT -i lo -j ACCEPT -A OUTPUT -o lo -j ACCEPT # ICMP -A INPUT -p icmp -j ACCEPT # Docker -A FORWARD -i docker0 -o ens3 -j ACCEPT -A FORWARD -i ens3 -o docker0 -j ACCEPT # Incoming -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT -A INPUT -j DROP # Outgoing -A OUTPUT -j ACCEPT # Routing -A FORWARD -j DROP COMMIT
我将它们存储在/etc/iptables/rules.v4和/etc/iptables/rules.v6 ,并确保通过运行sudo netfilter-persistent reload 。
根据这个指南: https : //blog.daknob.net/debian-firewall-docker/ *nat部分可以完成这项工作,但是不能。
我的系统:
$ sudo iptables --version iptables v1.6.1 $ uname -r 4.11.0-1-amd64 $ sudo lsb_release -a No LSB modules are available. Distributor ID: Debian Description: Debian GNU/Linux testing (buster) Release: testing Codename: buster
首先,你从来没有提到net.ipv4.ip_forward net.ipv4.ip_forward 。 启用,如果你没有。
确保您可以访问互联网。 curl httpbin.org/ip是一个很好很容易的方法来检查。
如果是这样,请通过检查iptables-save的输出来确保您的规则处于活动状态
如果是,debugging它,这里是伪步骤:
在docker内部,ping一个外部IP地址,比如说8.8.8.8并确保你没有收到任何回应。 不要使用主机名。 让我们来解决DNS问题。 继续运行下一步。
在容器内部,使用tcpdump逐个检查所有接口,并查找目标为8.8.8.8的包。 根据您粘贴到您的问题的规则,这必须是docker0。
检查您的主机的路由表,并确保默认路由,0.0.0.0在接口ens3上
你应该得到足够的信息来解决这个问题。