宿主机防火墙与容器网络隔离需协同配置:通过docker-user链做第一道过滤入口,禁用userland-proxy使iptables规则生效,按业务划分自定义桥接网络,并结合ufw分层管控流量。

宿主机防火墙和容器网络隔离要协同配置,不能只靠 Docker 默认行为。核心思路是:宿主机 iptables 控制进出流量边界,Docker 网络模式与自定义策略控制容器间通信粒度。
用 DOCKER-USER 链做第一道过滤入口
Docker 启动时会自动创建 DOCKER-USER 链,这是用户可安全添加规则的起点——它在 Docker 自身规则之前执行,且重启 Docker 不会清空。
- 禁止所有容器访问外网(仅限测试或高敏环境):
iptables -I DOCKER-USER -i docker0 -j DROP - 只允许容器访问特定域名出口(需配合 DNS+IP 规则):
先用dig example.com +short获取 IP,再加规则:iptables -A DOCKER-USER -i docker0 -d 93.184.216.34 -p tcp --dport 443 -j ACCEPTiptables -A DOCKER-USER -i docker0 -j DROP - 限制外部对映射端口的访问源:
iptables -A INPUT -p tcp --dport 8080 -s 10.0.10.0/24 -j ACCEPTiptables -A INPUT -p tcp --dport 8080 -j DROP
按业务划分自定义桥接网络
默认 bridge 网络(docker0)下所有容器默认可互通,风险高。应为不同用途创建隔离网络:
- 前端服务网络(允许 HTTP 入站):
docker network create --driver bridge --subnet 172.21.0.0/16 --gateway 172.21.0.1 frontend-net - 后端服务网络(禁止外部访问,仅限内部调用):
docker network create --driver bridge --internal --subnet 172.22.0.0/16 backend-net - 数据库专用网络(完全内网,不连外、不暴露端口):
docker network create --driver bridge --internal --subnet 172.23.0.0/16 db-net
启动容器时显式指定网络:docker run -d --name api --network backend-net my-apidocker run -d --name db --network db-net postgres
禁用 userland-proxy,让 iptables 直接接管端口转发
Docker 默认启用 userland-proxy(一个 Go 进程),它会绕过 iptables 规则,造成策略失效。关闭后,所有端口映射由内核 netfilter 处理,防火墙规则才真正生效。
- 编辑
/etc/docker/daemon.json,加入:{"userland-proxy": false} - 重启 Docker:
sudo systemctl restart docker - 验证是否生效:
ss -tlnp | grep :8080—— 若无docker-proxy进程,说明已切换成功
结合 UFW 管理宿主机层访问控制
UFW 是 iptables 的易用封装,适合运维人员日常维护。注意:UFW 默认不管理 DOCKER-USER 链,需手动启用支持。
- 启用 UFW 对 Docker 的感知:
echo 'INSERT_MODULES="nf_nat_ipv4 nf_nat_iptable"' | sudo tee -a /etc/default/ufw - 开放必要服务端口,其余默认拒绝:
sudo ufw allow OpenSSHsudo ufw allow 443/tcpsudo ufw enable - UFW 不会干扰 DOCKER-USER 中的规则,二者分层协作:UFW 控制宿主机入口,DOCKER-USER 控制容器流量走向
关键原则是默认拒绝、按需放开、分层设防。容器不是防火墙,宿主机 iptables 和网络划分才是真正的安全边界。











