DOCKER-USER链是Docker官方推荐的最稳妥全局访问控制方式,因其不被Docker重启覆盖、专为用户规则预留、且位于流量进入容器前的关键路径,可精准拦截转发至容器的入向流量。

直接在 DOCKER-USER 链里加规则,是 Docker 官方推荐、最稳妥的全局访问控制方式。它不干扰 Docker 自动管理的链(比如 DOCKER 或 FORWARD),也不会被 Docker 重启覆盖,还能精准拦截进容器的流量。
为什么必须用 DOCKER-USER 链
Docker 流量进入宿主机后,会先经过 FORWARD 链,然后被跳转到 DOCKER-USER,再进入 DOCKER 链做端口映射。这意味着:
- 你在 INPUT 或 FORWARD 链里加的规则,对容器暴露端口的入向流量基本无效
- DOCKER-USER 是唯一被 Docker 明确预留、且保证“每次启动都存在”的用户入口链
- Docker 重启时会重建 DOCKER 链,但会保留你写在 DOCKER-USER 中的规则
- 默认末尾那条 RETURN 规则,就是为你留的“兜底出口”——没匹配上你的规则,就放行给后续处理
基础操作:只允许指定 IP 访问某容器端口
假设容器映射了宿主机 8080 端口,你想只让 203.107.10.5 和 192.168.10.0/24 访问它:
- 先确认目标端口和协议:这里是 TCP 的 8080
- 插入 ACCEPT 规则(放在 RETURN 前面才生效):
iptables -I DOCKER-USER -p tcp -s 203.107.10.5 --dport 8080 -j ACCEPT
iptables -I DOCKER-USER -p tcp -s 192.168.10.0/24 --dport 8080 -j ACCEPT - 再加一条 DROP 规则,拒绝其他所有尝试访问 8080 的流量:
iptables -I DOCKER-USER -p tcp --dport 8080 -j DROP - 注意顺序:DROP 必须插在 ACCEPT 之后、RETURN 之前;可用 iptables -L DOCKER-USER -n --line-numbers 查看并调整
进阶控制:按容器网段或目标容器隔离
如果你用的是自定义 bridge 网络(如 my-net,子网 172.20.0.0/16),想限制只有内网设备能访问该网络中所有容器:
- 允许来自特定源网段、发往容器网段的流量:
iptables -I DOCKER-USER -s 10.1.1.0/24 -d 172.20.0.0/16 -j ACCEPT - 拒绝其他所有发往该网段的流量:
iptables -I DOCKER-USER -d 172.20.0.0/16 -j DROP - 这种写法绕开了具体端口,适用于整个容器子网的粗粒度管控
- 配合
--internal网络或--icc=false使用,效果更彻底
排错与持久化要点
规则加完不生效?常见原因和应对方式:
- 规则顺序错了:用 iptables -L DOCKER-USER -n --line-numbers 检查,确保 DROP 在 ACCEPT 后、RETURN 前
- 协议或端口写错:Docker 映射的是宿主机端口,不是容器内端口;--dport 填的是宿主机监听端口(如 -p 8080:80 中的 8080)
- 没保存规则:iptables 默认不持久。CentOS 用 service iptables save,Ubuntu 推荐 iptables-persistent 工具
- 容器用 host 网络模式:DOCKER-USER 链不处理 host 模式流量,这类容器需单独在 INPUT 链控制


















