firewall的底层是使用iptables进行数据过滤,建立在iptables之上,而docker使用iptables来进行网络隔离和管理,这可能会与 Docker 产生冲突。当 firewalld 启动或者重启的时候,将会从 iptables 中移除 DOCKER 的规则,从而影响了 Docker 的正常工作。 同理,重启docker或者docker安装在后(或 docker容器安装在后),也会清理firewalld的规则
iptables -L 查询iptables 链
解决方法:
让Docker 绕过了 firewalld
####### 1、先关闭防火墙 #######
systemctl stop firewalld
####### 2、修改docker配置 #######
#修改docker配置
vim /etc/docker/daemon.json
#添加规则
{
...
"iptables": false
}
#重启docker
systemctl daemon-reload
systemctl restart docker
####### 3、开启或重启防火墙 #######
systemctl restart firewalld
####### 4、再次重启docker #######
systemctl restart docker
####### 此时docker -p的服务的端口能本地127.0.0.1访问 #######
####### 以后就可以通过firewall控制对外端口是否可用了(firewall-cmd 命令) #######
firewall-cmd命令可参考:防火墙firewall-cmd
【重要一】
绕过iptables之后,有个弊端:容器内部无法访问外界IP。如果需要访问,那么打开firewalld防火墙,且开启NAT转发功能,详细步骤如下:
此外,建议firewall防火墙开启NAT转发功能,解决阻止docker容器访问外界IP
见 https://blog.csdn.net/liyanggyang/article/details/128838350
【重要二】
在打开firewalld防火墙,且开启NAT转发功能后,允许容器访问外界IP:
1、容器访问本宿主机(物理/虚拟机)IP,本宿主机的防火墙检测到的IP是容器IP, 所以本机防火墙需要放行docker网段(可见 firewall-cmd命令可参考)
2、访问其他外界物理/虚拟机,外界物理/虚拟机检测到的IP是容器所在宿主机IP。