代码改变世界

Docker绕过firewalld

  williamzheng  阅读(650)  评论(1编辑  收藏  举报

一、起因

今天给pg做漏洞修复,因为pg只是对本机的其他服务使用,不对外使用,所以准备直接在firewalld中关闭pg的5432端口

然而神奇的一幕出现了,在其他服务器上telnet pg所在服务器的5432端口,居然能通,相当于firewalld对docker不起作用!

在docker中运行第三方服务时,通常需要绑定服务端口到本地主机。但使用 -p 参数进行的端口映射,会自动在iptables中建立规则,绕过firewalld,这对于端口级的黑白名单控制管理是很不利的,所以我们需要对iptables进行手动修改。

二、解决

方案一、修改docker配置文件

vim /etc/docker/daemon.json
"iptables": "false"

sudo systemctl daemon-reload
sudo systemctl restart docker

此方案也有几个弊端,如:

  • 此服务器上所有容器的端口对外都无法访问
  • 容器无法访问互联网
  • 无法按需只关闭某个容器的对外访问

方案二、修改iptables规则,去掉不需要对外提供服务的端口

# 查看规则
iptables -nvL --line-numbers

假设pg容器所在ip在第五条
# 删除DOCKER链的第5条规则
iptables -D DOCKER 5

# 此容器只接受来自地址10.10.10.64的连接请求,172.17.0.2为容器ip
iptables -A DOCKER -s 10.10.10.64 -d 172.17.0.2 -p tcp --sport  -j ACCEPT

方案三、添加DOCKER-USER链规则(推荐)

20241226:今天首次遇到此方案不行,查看容器网络模式为host,此方案貌似只针对容器网络模式为bridge,如果是host则不行,需要将规则加入INPUT链才行,此次就是这样解决的,但具体原因还待研究。

# 设置5432端口只能被10.10.10.10访问
iptables -I DOCKER-USER -i eth0 -s 10.10.10.10 -p tcp --dport 5432 -j ACCEPT
iptables -A DOCKER-USER -i eth0 -p tcp --dport 5432 -j DROP

# 设置5432端口只能被10.10.10.0/24网段访问
iptables -I DOCKER-USER -i eth0 -s 10.10.10.0/24 -p tcp --dport 5432 -j ACCEPT
iptables -A DOCKER-USER -i eth0 -p tcp --dport 5432 -j DROP
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 三行代码完成国际化适配,妙~啊~
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
点击右上角即可分享
微信分享提示