问题由来
今天我启动了一个 docker 服务,通过 ip:port 的方式可以正常访问服务,但是在我查看防火墙的时候发现没有这个端口哇,奇怪了!!防火墙没有配置为啥能访问进来呢???勾起了我的好奇心,探究了一番有了以下教程,这个小知识点估计大佬们都知道了,但是涉及到安全问题,我相信好多小白可能还是不清楚的,安全问题多提几次我觉得也不为过,尤其是部署到公网上的服务尤其要引起重视!!
问题根源:Docker 端口映射的 “隐藏炸弹”
当使用 docker run -p 3001:3001
时,**Docker 会自动在 iptables 中添加 NAT 规则 **,允许外部流量通过 3001 端口访问容器。然而,这些规则:
- ** 对防火墙工具不可见 **:如
firewalld
、ufw
等工具无法直接管理这些规则; - ** 绕过常规防火墙控制 **:Docker 的规则优先级高于用户自定义规则,导致安全策略失效;
- ** 暴露端口到公网 **:默认绑定
0.0.0.0
(所有 IP),可能被扫描攻击。
**
终极解决方案:显式绑定本地回环地址 **
通过 ** 限制端口仅允许本地访问 **,彻底规避 Docker 的隐式规则!
** 操作步骤 **
# 关键参数:将容器端口绑定到 127.0.0.1(仅本地访问)
docker run -d --name my_app \
-p 127.0.0.1:3001:3001 \
your_image:tag
** 效果对比 **
配置方式 | 外部访问风险 | iptables 规则可见性 | 防火墙兼容性 |
---|---|---|---|
-p 3001:3001 (默认) |
![]() |
![]() |
冲突 |
-p 127.0.0.1:3001:3001 |
![]() |
![]() |
无冲突 |
补充说明
评论里大家提到了可以在安全组里面来控制端口是否放行,如果云厂商提供了安全组是可以的,比如国内的阿里、腾讯等大型的云服务厂商是提供了的,但是好多人购买服务器为了便宜或者是免备案等考虑是在其他平台买的,不一定有安全组这个功能
从互联网到容器会经过如下几层过滤到达你的容器
- 互联网
→ 2. 云平台安全组(第一层过滤)
→ 3. 宿主机本地防火墙(UFW等防火墙)(第二层过滤)
→ 4. 宿主机iptables
(包括 Docker 添加的规则)(第三层转发)
→ 5. 容器