一、问题
docker 容器启动时,如果添加了 -p
参数,则 docker 会开启 iptables NAT 规则。此时, -p
参数指定的端口,不会得到 iptables 的保护,因此 UFW 设置的规则,对 docker -p
参数指定的端口全都不生效。
二、解决
第一步:禁止 docker 操作 iptables
给 docker 添加 --iptables=false
参数。
可以修改 /etc/default/docker
文件中的 DOCKER_OPTS
,增加 --iptables=false
。如下:
DOCKER_OPTS="--iptables=false"
此选项会禁用 docker 添加 iptables 规则。
第二步:编辑UFW默认规则链
编辑 /etc/ufw/before.rules
文件,在文件末尾添加内容如下:
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE
COMMIT
第三步:重载服务使上述修改生效
重启docker和ufw:
sudo systemctl restart docker
sudo ufw disable
sudo ufw enable
如果不行,直接重启操作系统。
sudo reboot