docker防火墙白名单核心是分层控制:优先用docker-user链做前置过滤,结合firewalld trusted zone按网卡或子网放行,再通过iptables精确限制端口、源ip和出向目标,并配合容器启动参数(如--cap-add、--network)从源头收紧权限。

配置 Docker 网络的防火墙白名单,核心是分层控制:既要让容器通信正常,又要阻止非法流量。关键不在“一刀放开”,而在于明确信任边界——比如只放行特定网卡、特定子网或特定端口,且优先利用 Docker 自身链(如 DOCKER-USER)做前置过滤。
用 firewalld 按网卡或源网段设 trusted zone
这是最常用也最稳妥的方式,尤其适用于物理机或云主机部署多个容器的场景。
- 识别宿主机上 Docker 使用的网卡(如
docker0、br-*或自定义 bridge 对应的 veth 主机侧接口) - 将该网卡加入
trusted区域:firewall-cmd --zone=trusted --add-interface=docker0 --permanent - 若容器网络使用独立子网(如
172.18.0.0/16),可直接按源地址添加:firewall-cmd --zone=trusted --add-source=172.18.0.0/16 --permanent - 执行
firewall-cmd --reload生效。注意:trusted区域默认 target 是ACCEPT,不建议全开;生产环境更推荐用public区域 + 显式放行端口
在 iptables 的 DOCKER-USER 链中加白名单规则
Docker 官方明确推荐使用 DOCKER-USER 链——它在 Docker 自动规则之前执行,且不会被 Docker 重启覆盖。
- 只允许指定 IP 访问容器某端口(如 Web 服务):
iptables -I DOCKER-USER -s 203.0.113.50 -p tcp --dport 80 -j ACCEPT - 拒绝所有其他来源访问该端口:
iptables -I DOCKER-USER -p tcp --dport 80 -j DROP - 限制容器对外发起连接的目标(如只允许访问 DNS 和上游 API):
iptables -I DOCKER-USER -o eth0 -d 8.8.8.8 -p udp --dport 53 -j ACCEPT - 规则持久化需配合
iptables-save或系统服务(如iptables-persistent)
结合容器启动参数限制网络能力
白名单不仅是“放什么进来”,更是“不让它做什么”。从源头收紧权限能大幅降低风险。
- 禁用容器操作主机防火墙的能力:不要用
--privileged,除非绝对必要 - 如需容器内管理网络,仅授予最小权限:
--cap-add=NET_ADMIN --cap-add=NET_RAW - 用
--network=none或自定义 network 隔离非必要容器,再通过显式--link或自定义 bridge 控制通信路径 - 对敏感容器启用 seccomp 白名单策略,禁止
ptrace、mount等高危系统调用
验证与日常维护要点
配置完不等于生效,必须验证真实流量路径和规则匹配逻辑。
- 用
firewall-cmd --list-all-zones或iptables -L DOCKER-USER -n -v查看规则是否加载、计数是否增长 - 测试时用
curl -v或telnet从不同源 IP 发起请求,观察是否被正确放行或拦截 - 注意 NAT 时机:在
DOCKER-USER链中看到的是容器 IP 和端口,原始客户端 IP 需用conntrack --ctorigdst匹配(但慎用,有性能开销) - 定期审查白名单条目,删除已下线服务对应的规则,避免策略膨胀











