众所周知,Docker的自动iptables规则配置与ufw防火墙存在冲突,这会导致ufw无法有效禁用Docker的端口映射,从而使端口暴露在公网。这是因为Docker和ufw都依赖于iptables规则,所以很多人都会选择关闭Docker的自动配置iptables规则功能,但是这样做会导致Docker应用无法访问外网,这时就可以用以下我的解决方案:

  1. 使用ip addr show命令找到docker的网络接口名称和ip段,docker0是网络接口名称,172.17.0.1/16是ip段
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:cc:44:05:9a brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
  1. 添加 NAT 规则,以上述接口为例来演示操作
iptables -t nat -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
  1. 允许 Docker 网桥网络的流量通过 FORWARD 链
iptables -A FORWARD -i docker0 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o docker0 -m state --state RELATED,ESTABLISHED -j ACCEPT
  1. 进入容器内部使用ping或者curl命令验证是否能够访问外网
curl ip.sb
ping google.com
  1. 使用iptables-persistent保存iptables规则,使其永久生效(可选),