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

文章讲述了在CentOS服务器上,尽管防火墙未开放8103端口,但仍然可以访问服务的现象。原因是Docker在运行时会向iptables添加规则。通过禁用Docker的iptables整合并重启服务解决了这个问题,但会导致容器间无法通信和容器无法访问外部网络。为恢复网络连接,使用firewall-cmd添加masquerade规则,但这会使容器无法获取客户端真实IP。
摘要由CSDN通过智能技术生成

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

服务器开放的端口如下:

image

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

开放的服务如下:

image

也没有开放某三维系统,但可以正常访问

image

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

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

image

WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -D FORWARD -i docker0 -o docker0 -j DROP' failed: iptables: Bad rule (does a matching rule exist in 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

image

systemctl daemon-reload
systemctl restart docker

重启 Docker 搞定!!!

注意:完成上述步骤以及可以采用系统 firewall 控制端口访问,但会出现 docker 容器间无法访问,而且容器内也无法访问外部网络

使用类似 NAT 网络方式使得 docker 可以访问外部网络

firewall-cmd --permanent --zone=public --add-masquerade

谈谈使用该方法解决 docker 无视系统防火墙问题所带来的缺点:容器内无法获取得到客户端的真实 IP,由于是类似 NAT 网络,常常 nginx 日志上记录的是 docker0 网络的子网 IP,对于一些业务无法获取真实 IP 可能不能容忍,看个人的取舍吧。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值