Linux防火墙firewalld不生效,无法拦截Docker映射端口
今天出现了一个奇怪的现象,centos服务器上的防火墙(firewall)没有开放8103端口,但是依然可以访问
服务器开放的端口如下:
可以看出并没有开放8103端口
开放的服务如下:
也没有开放某三维系统,但可以正常访问
重启过防火墙,重启过服务器,仍未解决此现象。真是脑阔疼啊!!!
执行 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 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
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 可能不能容忍,看个人的取舍吧。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
2021-03-09 DBeaver中如何调整SQL编辑器的字体大小