核心是理清容器网络层、宿主机防火墙层、云平台安全组层三层控制面:docker依赖netfilter规则,ufw等宿主机防火墙若未协同会失效;推荐用ufw-docker集成ufw,显式管控映射端口,并叠加云安全组最小权限策略。

生产环境中配置 Docker 容器防火墙,核心不是“给容器加防火墙”,而是理清三层控制面:容器网络层、宿主机防火墙层、云平台安全组层。Docker 本身不提供独立防火墙服务,它依赖 Linux 内核的 netfilter(iptables/nftables)规则工作;而宿主机防火墙(如 UFW、firewalld)若未与 Docker 协同,反而会失效甚至引入漏洞。
明确防火墙职责边界
Docker 默认会在 iptables 的 nat 和 filter 表中插入规则,用于端口映射(-p)、容器间通信和默认桥接网络访问。这些规则优先级高,常绕过 UFW 等用户配置——这就是为什么“UFW 已 deny 所有入站,但容器 80 端口仍能被访问”的根本原因。
- 容器内不建议运行额外防火墙(如 iptables-service),既冗余又干扰 Docker 网络栈
- 宿主机防火墙应只管控“到达宿主机网络栈”的流量,而非干预容器内部或 Docker 自动管理的链
- 真正有效的防护点在:宿主机防火墙 + Docker 的
--userland-proxy=false+ 显式ufw-docker集成
Ubuntu 环境下用 UFW 安全管控容器端口
针对 Ubuntu(最常用生产发行版),推荐使用 ufw-docker 工具补全 UFW 与 Docker 的协同断层:
- 下载并安装脚本:
sudo wget -O /usr/local/bin/ufw-docker https://gitcode.com/gh_mirrors/uf/ufw-docker/raw/master/ufw-docker && sudo chmod +x /usr/local/bin/ufw-docker - 执行集成:
sudo ufw-docker install—— 它会自动修改/etc/ufw/after.rules,在 UFW 规则末尾注入专用 Docker 流量处理链 - 只开放必要端口:
sudo ufw-docker allow my-web-app 443/tcp,其他所有映射端口默认拒绝外网访问 - 验证效果:
sudo ufw status verbose中应看到类似Anywhere on docker0或172.17.0.0/16的允许条目,以及对外网接口(如 eth0)上对应端口的显式 deny
加固 Docker 守护进程与网络行为
防火墙只是最后一道防线,前置配置更能降低攻击面:
- 禁用 Docker 自动创建的宽松 iptables 规则:在
/etc/docker/daemon.json中添加"iptables": false(需配合手动维护规则,适合高级场景);更稳妥做法是保留iptables: true,但启用ufw-docker做精细化覆盖 - 限制默认网桥 IP 范围,避免与内网冲突:
"default-address-pools": [{"base":"172.30.0.0/16","size":24}] - 强制启用用户命名空间重映射(userns-remap),从根源隔离容器 root 权限,防止逃逸后直接控制系统用户表
- 业务容器启动时避免使用
--privileged,非必要不挂载/proc、/sys或宿主机敏感路径
云环境必须叠加安全组策略
在 AWS、阿里云、腾讯云等 IaaS 平台部署时,宿主机防火墙只是基础,**安全组才是第一道网关**:
- 安全组规则应严格遵循最小权限:仅放行 443、22(跳板机)、必要健康检查端口;数据库、Redis、内部 API 端口一律禁止公网入向
- 安全组出向规则也需收紧:容器不应默认允许任意外连,可限制为仅访问 CDN、日志服务、许可的第三方 API
- 若使用 Kubernetes,安全组只需放通节点间通信(如 6443、10250、NodePort 范围),具体服务暴露交由 Ingress Controller + NetworkPolicy 控制











