Loading ...
Linux 防火墙 firewalld 不生效?解决 Docker 映射端口拦截问题

在 CentOS 服务器上运维时,遇到了一个棘手的问题:明明防火墙没开放 8103 端口,外部却能正常访问该端口对应的服务。一番排查后,发现问题根源和 Docker 与防火墙的交互有关,这里把解决过程整理成笔记,供遇到类似问题的同学参考。

一、问题现象:防火墙未开放端口却能被访问

CentOS 服务器上的 firewalld 防火墙显示未开放 8103 端口,通过firewall-cmd --list-all查看 public 区域配置,开放的端口只有 8822/tcp,服务也仅包含 dhcpv6-client 和 ssh。但实际测试中,外部仍能访问 8103 端口对应的服务,重启防火墙和服务器也无法解决。

二、问题根源:Docker 自动修改 iptables 规则

排查发现,问题出在 Docker 与 iptables 的交互上。firewalld 底层基于 iptables 实现,而当使用docker run -p命令映射端口时,Docker 会自动向 iptables 添加规则,相当于直接 “绕过” firewalld 开放了端口,导致防火墙配置失效。

此外,重启 firewalld 时可能会删除 Docker 添加的 iptables 规则,甚至导致 Docker 容器无法启动(需重启 Docker 服务恢复,但这与本次端口拦截问题无关)。

三、解决步骤:禁用 Docker 的 iptables 整合

要让 firewalld 完全掌控端口访问,需禁用 Docker 对 iptables 的自动配置,具体操作如下:

  1. 修改 Docker 服务配置文件 编辑 Docker 服务的系统配置文件:

    vi /usr/lib/systemd/system/docker.service
  2. 添加禁用 iptables 的参数 [Service]段落的ExecStart行中,添加--iptables=false,修改后如下:

    [Service]
    ExecStart=/usr/bin/dockerd --iptables=false  # 关键:禁用Docker自动修改iptables

    (原配置可能为ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock,在其后添加参数即可)

  3. 重载配置并重启 Docker

    systemctl daemon-reload  # 重新加载服务配置
    systemctl restart docker  # 重启Docker使配置生效

    完成后,firewalld 即可正常拦截未开放的端口🔶5-24🔶。

四、注意事项:恢复容器网络通信

禁用 Docker 的 iptables 整合后,会出现新问题:容器间无法互相访问,且容器内无法访问外部网络。可通过以下步骤解决:

添加 NAT 转发规则(masquerade)

# 永久开启public区域的地址伪装(类似NAT,实现容器网络转发)
firewall-cmd --permanent --zone=public --add-masquerade
# 重启防火墙生效
firewall-cmd --reload

五、方案缺点:客户端真实 IP 不可见

该方案虽解决了防火墙可控性问题,但存在一个明显缺点:由于使用了 NAT 转发,容器内无法获取客户端的真实 IP(例如 Nginx 日志中会记录 docker0 子网的 IP)。因此,该方案更适合对客户端 IP 无要求的场景,若需获取真实 IP,需考虑其他替代方案(如使用 host 网络模式,但安全性较低)。

总结

当 Docker 映射端口无视 firewalld 规则时,核心原因是 Docker 自动修改了 iptables。通过禁用 Docker 的 iptables 整合,可让防火墙重新掌控端口访问,但需权衡 “网络可控性” 与 “客户端 IP 可见性”。实际使用中,可根据业务对客户端 IP 的依赖程度选择是否采用该方案。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇