原创

Linux防火墙firewalld不生效,无法拦截端口

今天出现了一个奇怪的现象,centos服务器上的防火墙(firewall)没有开放3306端口,但是依然可以访问数据库

服务器开放的端口如下:


可以看出并没有开放3306端口

开放的服务如下:


也没有开放mysql服务

数据库访问情况如下:


重启过防火墙,重启过服务器,仍未解决此现象。真是脑阔疼啊!!!

执行systemctl status firewalld 时突然发现了这么一条警告


 WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -D FORWARD -i docker0 -o docker0 -j DROP' failed: iptables: Bad rule (does a matching ru...that chain?).  

firewall启动的时候会删除docker往iptables里面添加的规则,这也就是我们经常在重启firewalld服务后,再重启docker容器时无法启动的原因,此问题可以重启docker服务解决,当然这与我们今天的主题无关。

至此终于找到端口拦截失败的原因,如下:

docker run -p 启动的时候会往iptables里面添加规则,firewall底层是基于iptables的,所以-p参数启动等于在防火墙上打了个洞

因为我是在docker的宿主机上控制端口访问,所以简单粗暴直接让docker不使用iptables,操作如下:

vi /usr/lib/systemd/system/docker.service

在文件中添加 --iptables=false


systemctl restart docker

搞定!!!

正文到此结束