docker-user链是docker官方推荐、最稳定且不会被覆盖的自定义防火墙方式,位于iptables forward流程前端,可实现细粒度访问控制;其规则不被docker重启覆盖、生效优先级高、即时生效,并需配合非root用户运行与规则持久化。

直接在 DOCKER-USER 链中添加规则,是 Docker 官方推荐、最稳定且不会被覆盖的自定义防火墙方式。它位于 iptables 的 FORWARD 流程前端,所有进出容器的流量(包括端口映射、跨容器通信、外部访问)都会经过这里,因此能实现比 Docker 原生规则更细粒度、更严苛的访问控制。
为什么 DOCKER-USER 是唯一可靠的位置
Docker 服务每次重启或容器变动时,会自动重建 DOCKER 链和 FORWARD 中的部分规则,但明确承诺保留 DOCKER-USER 链中的内容。这意味着:
- 你写的规则不会被 Docker 覆盖或清空
- 规则生效顺序靠前,能在流量进入 DOCKER 链之前就拦截
- 无需停服、无需重载 Docker,规则即时生效
实现严苛访问控制的典型场景与写法
以下规则均插入到 DOCKER-USER 链头部(用 -I),确保优先匹配:
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
-
只允许可信 IP 访问所有映射端口:
iptables -I DOCKER-USER ! -s 192.168.10.0/24 -p tcp -m conntrack --ctstate NEW -j DROP
(除内网 10 段外,所有新建 TCP 连接一律拒绝) -
禁止某 IP 访问特定容器端口(如 API 服务):
iptables -I DOCKER-USER -s 203.0.113.5 -p tcp --dport 8080 -j DROP -
彻底阻断容器主动外连(仅允许响应):
iptables -I DOCKER-USER -i docker0 -o eth0 -m conntrack ! --ctstate RELATED,ESTABLISHED -j DROP
(容器发往外网的新建连接全部拦截,但已有会话可继续) -
限制容器间通信范围(基于源容器网络接口):
iptables -I DOCKER-USER -i docker0 -s 172.17.0.3 -d ! 172.17.0.0/16 -j DROP
(固定 IP 的容器只能和本 bridge 网段通信,无法访问宿主机或其他网络)
配合 USER 指令,从网络+进程双层收紧权限
单纯网络层控制还不够。若容器内应用仍以 root 运行,攻击者突破后可能直接修改 iptables 或逃逸。必须同步加固运行身份:
- 在 Dockerfile 中显式创建非特权用户并切换:
RUN groupadd -r app && useradd -r -u 1001 -g app appuserUSER appuser - 运行容器时禁用提权能力:
docker run --security-opt no-new-privileges --user 1001:1001 ... - 启用用户命名空间映射(需提前配置 daemon.json):
"userns-remap": "default"
此时容器内 UID 0 映射为宿主机普通用户,大幅降低逃逸风险
规则持久化与日常维护要点
iptables 规则默认不保存。为避免重启丢失,需手动固化:
- Debian/Ubuntu:
iptables-save > /etc/iptables/rules.v4 - RHEL/CentOS:
iptables-save > /etc/sysconfig/iptables - 建议将规则写成脚本,配合 systemd service 在 docker.service 启动后自动加载
- 定期检查:
iptables -L DOCKER-USER -n --line-numbers
确保你的规则排在最前面,且无重复或冲突项










