docker0网桥存在横向移动、无访问控制、无加密审计等高危风险。其默认允许同网段容器自由互访,易成攻击跳板;应禁用默认bridge、改用带隔离的自定义网络,并在DOCKER-USER链加固iptables规则。

明确 docker0 网桥的风险定位
docker0 是 Docker 启动时自动创建的默认桥接网桥,IP 通常为 172.17.0.1/16,所有未指定网络的容器默认接入它。它的本质是 Linux 内核级二层交换机,不自带访问控制、加密或日志审计能力。默认状态下,同一 docker0 网段内的容器可自由互访(如 172.17.0.2 → 172.17.0.3:22),且流量不经额外策略过滤,容易成为横向移动跳板。
禁用或隔离默认 bridge 网络
生产环境应避免让业务容器直接使用 docker0。可通过以下方式切断依赖:
- 启动守护进程时禁用默认网桥:在
/etc/docker/daemon.json中添加"bridge": "none",重启 Docker 后 docker0 不再自动启用 - 若必须保留 docker0(如兼容旧脚本),禁止新容器默认接入:添加
"default-runtime": "runc", "default-address-pools": [{"base":"192.168.0.0/16","size":24}]并配合--network none显式指定网络 - 对已运行的容器,可用
docker network disconnect bridge <container></container>主动剥离
用自定义桥接网络替代并启用通信约束
新建网络时开启内建隔离机制,比后期补 iptables 更可靠:
- 创建带子网和网关的自定义桥:
docker network create --driver bridge --subnet=10.10.1.0/24 --gateway=10.10.1.1 myapp-net - 容器启动时只加入该网络:
docker run --network=myapp-net ...,不同网络间默认不通 - 如需有限互通,用
docker network connect显式连接,并配合--ip固定 IP,便于后续策略绑定 - 禁用跨网络 DNS 解析:启动时加
--internal参数,阻止容器通过内置 DNS 访问其他网络中的服务名
在 DOCKER-USER 链中加固转发规则
Docker 自动管理 filter/DOCKER 和 nat/POSTROUTING 规则,但 filter/DOCKER-USER 是预留的用户自定义链,位于 Docker 规则之前,适合插入安全策略:
- 拒绝非授权跨网段转发:
iptables -I DOCKER-USER -i docker0 -o eth0 -j DROP(阻止 docker0 流量外发到物理网卡) - 限制容器主动外连:
iptables -I DOCKER-USER -o docker0 -m state --state NEW -j REJECT(默认禁止容器主动发起新连接) - 只允许可信源访问特定容器端口:
iptables -I DOCKER-USER -i eth0 -d 172.17.0.5 -p tcp --dport 3306 -s 192.168.10.0/24 -j ACCEPT - 所有规则需保存(如
iptables-save > /etc/iptables/rules.v4),并确保系统重启后加载
关闭冗余协议与强化日志追溯
精简协议面可减少潜在攻击入口,同时为异常行为提供线索:
- 禁用 IPv6(若业务不用):在宿主机执行
sysctl -w net.ipv6.conf.docker0.disable_ipv6=1,并写入/etc/sysctl.conf - 关闭 docker0 的 ARP 响应(防 IP 冲突/ARP 欺骗):
echo 0 > /proc/sys/net/ipv4/conf/docker0/arp_ignore - 启用容器网络操作审计:Docker 启动时加
--log-driver=syslog --log-opt syslog-address=udp://127.0.0.1:514,结合 rsyslog 收集网络相关事件 - 定期检查 docker0 转发状态:
cat /proc/sys/net/ipv4/ip_forward应为 0(除非你明确需要 NAT 转发)


















