docker设置iptables=false后无法解析DNS的解决方法

本文参考:docker设置iptables=false后无法解析DNS的解决方法_docker iptables false

docker默认使用iptables进行网络配置,与ufw有点不兼容,ufw无法管控docker暴露出来的端口,可能会造成一定的安全问题,所以某些情况下需要将docker的iptables设置为false。
设置之后进入docker容器内部发现无法访问网络,只能与172.17.0.1网段通信。

解决方案如下:

sudo systemctl edit docker.service

1
2
3
[Service]
ExecStartPre=/usr/sbin/iptables -t nat -A POSTROUTING -s 172.0.0.0/16 ! -o docker0 -j MASQUERADE
ExecStopPost=/usr/sbin/iptables -t nat -D POSTROUTING -s 172.0.0.0/16 ! -o docker0 -j MASQUERADE

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/4/image_411fbc44b1e7914f452aa767b676f8ce.png

配置解释:

这段配置的作用是为Docker容器设置网络地址转换(NAT),使得从172.17.0.0/16子网发出的流量经过docker0接口时进行MASQUERADE(伪装)处理,以实现网络地址的转换和隐藏。

在这段配置中:

  • ExecStartPre 行指定了在启动服务之前执行的操作,即向iptables中添加一个POSTROUTING规则,对从172.17.0.0/16子网发出的流量进行MASQUERADE处理,但排除了流量经过docker0接口的情况。
  • ExecStopPost 行指定了在停止服务之后执行的操作,即从iptables中删除之前添加的相同规则。

这种配置通常用于在Docker环境中管理网络流量,确保容器内部的流量能够正常地与外部通信,并且对外部网络隐藏了容器内部的真实IP地址。

生效配置

sudo systemctl daemon-reload 即可

systemctl restart docker 测试docker能否正常启动

参考资料:
https://gist.github.com/circa10a/e6cfc673af9282d17dfb958ef6adabeb
https://github.com/moby/moby/issues/26776