DOCKER-USER链是Docker网络流量的第一道安检口,位于Docker自动生成规则之前,可精准拦截外部请求,防止端口映射绕过防火墙;所有自定义访问控制(如白名单、高危端口封禁)必须在此链中配置,且需用-I插入顶部、DROP丢弃而非REJECT,并配合持久化保存。

不能靠 Docker 自己管端口,得在它前面加一道“铁闸”——用 DOCKER-USER 链提前拦截,把不该出去的流量直接掐断。Docker 启动时会自动往 FORWARD 和 nat/PREROUTING 插规则,但它的规则默认插在 DOCKER-USER 之后,所以你只要在这个链里写好策略,就能稳稳压住 Docker 的自动行为。
明确 DOCKER-USER 链的不可替代性
Docker 官方文档明确推荐使用 DOCKER-USER 链做前置过滤:它位于 Docker 自动规则之前,且不会被 dockerd 重启或容器启停覆盖。其他链(如 INPUT、FORWARD)容易被 Docker 写入的规则干扰,尤其在多容器频繁启停时,规则顺序可能错乱。
-
DOCKER-USER是用户可控的“第一道安检口”,所有进入 Docker 网络栈的包都必须先过它 - 它不处理本地回环(lo)或已建立连接,只管新进来的外部请求,定位精准
- 写在这里的 DROP 规则,比在 INPUT 里封更早、更干净,连 SYN 包都不让发到容器
只放行可信来源,其他一律静默丢弃
别用 -p 0.0.0.0:8080:80 这种“全网开放”写法。哪怕容器只该内网访问,也要靠 DOCKER-USER 把公网入口彻底堵死:
- 允许特定网段访问某端口:
iptables -I DOCKER-USER -i eth0 -s 10.10.0.0/16 -p tcp --dport 8080 -j ACCEPT - 拒绝所有其他公网访问该端口:
iptables -I DOCKER-USER -i eth0 -p tcp --dport 8080 -j DROP - 若需限制 Docker API(2375/2376),同样处理:
iptables -I DOCKER-USER -i eth0 -p tcp --dport 2375 -j DROP
注意:用 -I 插入顶部,确保规则优先执行;用 DROP 而非 REJECT,避免向扫描器暴露端口存在。
封死高危端口 + 关键服务组合策略
常见漏洞端口(如 3306、6379、27017、5000、2375)一旦被映射,极易成为攻击跳板。单靠容器不暴露不够,必须在 DOCKER-USER 层面做“双保险”:
- 对数据库端口,只允跳板机或配置中心 IP 访问:
iptables -I DOCKER-USER -i eth0 -s 192.168.5.100 -p tcp --dport 3306 -j ACCEPT - 立刻封死其余所有来源:
iptables -I DOCKER-USER -i eth0 -p tcp --dport 3306 -j DROP - 对 Docker Registry(5000)等敏感服务,直接全端口阻断:
iptables -I DOCKER-USER -i eth0 -p tcp --dport 5000 -j DROP - UDP 端口也不能漏,如 DNS 反射类攻击常用端口:
iptables -I DOCKER-USER -i eth0 -p udp --dport 53 -j DROP
保存规则并验证是否生效
iptables 规则默认不持久,重启后失效。必须显式保存,并确认实际拦截效果:
- 保存规则(Ubuntu/Debian):
iptables-save > /etc/iptables/rules.v4 - 保存规则(CentOS/RHEL):
service iptables save或iptables-save > /etc/sysconfig/iptables - 验证是否拦截成功:从公网机器执行
telnet 公网IP 8080,应显示 “Connection refused” 或超时(不是 “Connected”) - 检查规则命中计数:
iptables -L DOCKER-USER -v -n | grep :8080,看 packets 列是否递增


















