容器内网防火墙隔离的核心在于利用独立 network namespace 实现自治:每个容器拥有专属网络协议栈和 nftables 规则空间,规则须在对应 namespace 内加载,宿主机规则不继承,推荐启动时注入或通过 nsenter 操作指定 netns。

容器内部网络防火墙隔离,核心不是在宿主机上加规则,而是让每个容器拥有独立、自治的防火墙策略空间——这依赖于 network namespace 的天然隔离能力,再配合 nftables 在对应命名空间内加载专属规则。
确认容器已运行在独立 network namespace
这是所有隔离的前提。Docker 默认启用 --network=bridge,会为每个容器创建新 netns。验证方法:
- 进容器执行:
readlink /proc/1/ns/net,输出类似net:[4026532567] - 在宿主机执行相同命令,ID 不同即已隔离
- 同一台机器上不同容器的 netns ID 必然互异
nftables 规则只作用于当前命名空间
nftables 本身不感知命名空间,但它的操作对象是当前进程所处的 netns。这意味着:
- 在宿主机执行
nft list ruleset,看到的是宿主机规则 - 在容器内执行,看到的是该容器自己的规则(初始为空)
- 容器启动后不会自动继承宿主机的防火墙策略
所以,想让某个容器有“自己的防火墙”,必须把规则加载到它自己的 netns 里。
向容器注入 nftables 规则的实用方式
推荐方式:容器启动时注入
- 启动时加权限:
--cap-add=NET_ADMIN - 在容器 entrypoint 脚本中加载规则,例如:
nft add chain inet filter input { type filter hook input priority 0 \; policy drop \; }
nft add rule inet filter input iifname "lo" accept
nft add rule inet filter input ct state established,related accept
nft add rule inet filter input tcp dport { 80, 443 } ct state new accept
注意:确保镜像含 nft 命令,且未覆盖 /etc/nftables.conf。
运维调试方式:从宿主机用 nsenter 操作指定 netns
- 先建立 netns 符号链接:
ln -sf /proc/<pid>/ns/net /run/netns/<name></name></pid> - 再执行:
nsenter -n -t <pid> nft add table inet filter</pid>
配合 Docker 网络策略强化隔离效果
仅靠容器内 nftables 不足以覆盖全部边界。建议叠加以下配置:
- 使用自定义 bridge 网络代替默认
bridge:docker network create app-net,启动时指定--network app-net - Docker 27+ 可启用严格模式,在
daemon.json中设置:"network-sandbox-mode": "strict",默认拒绝跨网络通信 - 宿主机层面补充
DOCKER-USER链规则,拦截原始入口流量(如限制源 IP、防端口扫描)











