docker默认bridge网络不隔离容器间通信,真正加固需停用docker0、启用自定义internal网络并配置docker-user链策略。

要真正加固 docker0 网桥并彻底关闭容器映射带来的冗余宿主机端口,核心不是“修 docker0”,而是绕开它、限制它、最终让它的存在变得无关紧要。docker0 本身是无状态的二层网桥,不带策略能力,强行在它上面打补丁(比如改 iptables)容易遗漏或被 Docker 覆盖。真正有效的做法是三层隔离 + 策略前置。
停用默认 bridge,从源头切断依赖
docker0 的风险根源在于它是默认网络。只要新容器不连它,它的流量就自然归零。
- 编辑 /etc/docker/daemon.json,加入:
{"bridge": "none"} - 执行 sudo systemctl restart docker,此时
ip link show docker0将不再显示该网桥 - 所有后续容器必须显式指定网络,例如
docker run --network my-bridge ...,否则启动失败——这反而是一种安全强制
用自定义桥接网络替代,并禁用跨网通信
自定义网络自带 DNS 隔离与默认隔离策略,比后期封 docker0 更干净可靠。
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
- 创建内部专用网络:
docker network create --driver bridge --subnet=10.20.0.0/24 --gateway=10.20.0.1 --internal my-isolated-net
其中 --internal 参数会自动禁止该网络内容器访问外网,也阻止外部通过 IP 直连 - 启动容器时只加入该网络:
docker run --network my-isolated-net --name api-service nginx - 如需有限互通(如仅允许 API 容器访问 DB),用
docker network connect显式连接,并配合--ip固定地址,便于后续绑定策略
在 DOCKER-USER 链做最小化放行,堵死冗余出口
即使停用了 docker0,Docker 仍可能因遗留配置或 host 模式容器产生意外流量。DOCKER-USER 是唯一被 Docker 尊重且永不覆盖的用户链。
- 拒绝所有从 docker0 发出的外发流量(若保留 docker0):
iptables -I DOCKER-USER -i docker0 -o eth0 -j DROP - 禁止容器主动新建外连连接(防反弹 shell):
iptables -I DOCKER-USER -o docker0 -m state --state NEW -j REJECT - 只允许可信源访问特定服务端口(如只让 192.168.10.10 访问 MySQL 容器):
iptables -I DOCKER-USER -i eth0 -d 172.17.0.5 -p tcp --dport 3306 -s 192.168.10.10 -j ACCEPT - 保存规则并设开机加载(如 Debian/Ubuntu):
iptables-save > /etc/iptables/rules.v4,并启用netfilter-persistent服务
清理残留端口映射,杜绝静默绑定
很多“冗余端口”其实来自已停止但未删除的容器,它们仍占用宿主机端口却不提供服务。
- 列出所有映射端口(含已停止容器):
docker ps -a --format "table {{.Names}}\t{{.Ports}}" | grep ":" - 批量清理已停止容器:
docker container prune -f - 对运行中容器,关闭不需要的映射:
docker container update --publish-rm 8080:80 my-app - 避免使用
-p启动,改用--expose仅声明端口,再通过反向代理(如 Nginx、Traefik)统一暴露,实现端口收敛与访问审计










