docker使用firewalld防火墙容器无法互通和外部网络访问不了
摘要:本文介绍在启用firewalld防火墙时与Docker iptables规则的冲突解决方案。主要步骤包括:1)禁用Docker的iptables管理并修改配置文件;2)重启Docker和防火墙服务;3)将Docker网桥网络加入防火墙白名单。还提供了解决容器网络访问问题的补充方案,如开启IP伪装、内核转发等。这些操作确保firewalld能正常管理Docker端口,同时维持容器内外网络互通性
·
如何在启用firewalld防火墙
首先docker服务默认是使用iptable规则进行端口管理,所以firewalld启用后会跟iptables冲突。
1、禁用docker使用iptables管理,编辑/etc/docker/daemon.json
在{} 中添加一个配置 “iptables”: false
vim /etc/docker/daemon.json
2、添加好后重启docker
systemctl daemon-reload
systemctl restart docker
3、然后重启防火墙
systemctl restart firewalld
一般情况下,这样docker的端口就回被firewalld管理,开放端口出去就需要使用firewall-cmd命令添加
如果出现docker内部访问不到宿主机的情况下
#将docker网桥及自建网络的地址全部加入firewall防火墙放开
ip addr | grep br-
ip addr | grep docker0
将docker网桥及自建网络的地址全部加入firewall防火墙放开
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="172.17.0.0/16" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="172.168.0.0/16" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="172.31.0.0/16" accept"
firewall-cmd --reload
然后去验证容器内部是否互通。
其他问题:
1、如果上面的都操作了还出现容器无法访问外部网络的情况。执行以下操作。
#打开IP地址伪装
firewall-cmd --zone=public --add-masquerade --permanent
#添加内核配置允许内核转发
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
#使内核配置生效
sysctl -p
#重启一下 防火墙和docker
systemctl restart firewalld && systemctl restart docker
#如果容器能互相访问了,也能访问宿主机了,但是访问不了外部其他机器,在执行一下下方命令。
#允许docker的出站流量
iptables -P FORWARD ACCEPT
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)