跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

针对容器化环境如何配置宿主机防火墙与容器网络的安全隔离

宿主机防火墙与容器网络隔离需协同配置:通过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 ACCEPT
iptables -A DOCKER-USER -i docker0 -j DROP
限制外部对映射端口的访问源:
iptables -A INPUT -p tcp --dport 8080 -s 10.0.10.0/24 -j ACCEPT
iptables -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-api
docker 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 OpenSSH
sudo ufw allow 443/tcp
sudo ufw enable
UFW 不会干扰 DOCKER-USER 中的规则,二者分层协作:UFW 控制宿主机入口,DOCKER-USER 控制容器流量走向 关键原则是默认拒绝、按需放开、分层设防。容器不是防火墙,宿主机 iptables 和网络划分才是真正的安全边界。

相关文章