解决docker容器开启端口映射后,会自动在防火墙上打开端口的问题
解决docker容器开启端口映射后,会自动在防火墙上打开端口的问题(https://www.cnblogs.com/qjfoidnh/p/11567309.html 转自)
在docker中运行第三方服务时,通常需要绑定服务端口到本地主机。但使用 -p 参数进行的端口映射,会自动在iptables中建立规则,绕过firewalld,这对于端口级的黑白名单控制管理是很不利的,所以我们需要对iptables进行手动修改。
这里以从名为centos.19.09.05的image建立一个容器为例:
首先,如果系统是CentOS7的话,需要关闭自带firewalld防火墙,并切换为iptables.
假设需要将新容器的27017端口映射到主机的27017端口,一般情况下我们使用命令
docker run -idt -p 27017:27017 centos.19.09.05 /bin/bash
在容器中27017端口服务运行起来后,我们在外网使用端口扫描工具,发现本地主机的27017端口已经打开了,而我们还未在防火墙上进行开放操作;此时检查iptabes规则:
iptables --list
发现在Chain DOCKER下多出了一条
Chain DOCKER (1 references) target prot opt source destination ACCEPT tcp -- anywhere 172.17.0.2 tcp dpt:27017
其中172.17.0.2为该容器在docker网桥中的IP,可见该规则允许任意来源的地址访问27017端口,所以我们需要删除该规则,并替换成安全性更高的规则。
#删除DOCKER链中的1号规则;如果待删除规则不位于第一行,则将数字改为对应行号 iptables -D DOCKER 1 #此容器只接受来自地址123.345.456.567的连接请求 iptables -A DOCKER -s 123.345.456.567 -d 172.17.0.2 -p tcp --sport 27017 -j ACCEPT
再次进行端口扫描,发现27017端口已经关闭,只有IP为123.234.345.456的主机能够连接。
还有一种更简单的方式。因为docker绕过防火墙的原理是修改了iptables,那不让它修改即可,此方法无需切换默认防火墙。
按照https://blog.csdn.net/qadzhangc/article/details/96140703 所述设置即可,经试验不可省略步骤,否则可能造成容器无法连接外网。
vim /etc/default/docker #修改文件,此处设置等同于在创建容器时手动指定iptables=false参数 DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 -iptables=false"
vim /etc/docker/daemon.json { "iptables": false }
#此处对更改设置之前创建的容器也有效,编辑后需重启docker服务
对ufw的设置主要是为容器建立起转发,如果容器内的服务不需要访问外网,不做也可以。
firewalld的操作与ufw有些不同
#ubuntu(ufw)操作为 vim /etc/default/ufw DEFAULT_FORWARD_POLICY="ACCEPT" #对应centos(firewalld)上操作为: firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD_direct 0 -i eth0 -j ACCEPT #eth0为宿主机网卡名 firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD_direct 0 -o eth0 -j ACCEPT firewall-cmd --reload
ubuntu(ufw): vim /etc/ufw/before.rules 在`*filter`前面添加下面内容 *nat :POSTROUTING ACCEPT [0:0] -A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE COMMIT centos(firewalld): firewall-cmd --zone=public --add-masquerade #默认docker0在public zone里 firewall-cmd --reload
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
2018-10-14 Java 配置环境变量教程