iptables规则运行在宿主机root netns,而netns无独立iptables表,其流量触发规则取决于协议栈hook点及接口归属;需在宿主机按网桥、子网或连接状态锚定netns流量,并辅以netns内sysctl参数强化隔离。

iptables 与网络命名空间(NetNS)协同配置的关键,在于理解两者作用域的边界:iptables 规则默认运行在宿主机(root netns)的内核上下文中,而每个 NetNS 拥有独立的网络栈(含路由表、ARP 表、/proc/net),但 不自带独立的 iptables 规则集。也就是说,NetNS 本身不保存 filter/nat 表,所有规则仍由宿主机内核统一维护,只是匹配和生效时会结合当前数据包所处的命名空间上下文(如入接口、出接口所属 netns)。
NetNS 中的流量如何触发 iptables 规则?
数据包是否进入某条 iptables 链,取决于它在网络协议栈中经过的 hook 点,而该路径由其所属命名空间决定:
- 从容器或自定义 NetNS 发出的包,经
veth进入宿主机后,走的是FORWARD链(若目标非本机)或INPUT链(若目标为宿主机) - 从宿主机发出、目标为 NetNS 内 IP 的包,走
OUTPUT→POSTROUTING - NetNS 内部通信(如
eth0到lo)不经过宿主机 iptables,完全在该命名空间内部完成 - 关键判断依据是接口归属:veth 对的一端在 NetNS,另一端在 root netns;iptables 规则中的
-i或-o指定的是 root netns 下可见的设备名(如veth-prod-br、br-prod)
为 NetNS 流量设置精准过滤规则
不能直接“在 NetNS 里加 iptables”,而是要在宿主机上,用接口、IP 段、连接状态等特征锚定属于该 NetNS 的流量:
- 按桥接网卡限定:若业务 NetNS 通过
veth接入专用网桥br-prod,可写iptables -A FORWARD -i br-prod -j ACCEPT控制进出 - 按子网限定:给 NetNS 分配固定网段(如
10.10.1.0/24),用-s 10.10.1.0/24或-d 10.10.1.0/24匹配源/目的 - 按连接状态收紧:对返回流量只放行已建立连接,
-m state --state RELATED,ESTABLISHED -j ACCEPT可大幅减少开放端口需求 - 禁用跨网桥转发:防止不同业务 NetNS 间意外互通,
iptables -A FORWARD -i br-prod -o br-marketing -j DROP
注意 NetNS 自身的防火墙能力限制
虽然 NetNS 没有独立 iptables 表,但它支持部分内核网络参数控制,可作为补充手段:
- 关闭反向路径过滤:
ip netns exec prod-api sysctl -w net.ipv4.conf.all.rp_filter=0,避免因不对称路由丢包 - 禁用 IP 转发:
ip netns exec prod-api sysctl -w net.ipv4.ip_forward=0,确保该 NetNS 不充当路由器 - 这些设置需在 NetNS 内执行,影响仅限该命名空间,是隔离性的重要一环
Docker 场景下的实际映射关系
Docker 容器本质是带 network namespace 的进程,其网络行为完全遵循上述机制:
-
docker0网桥对应 root netns 中的虚拟设备,所有默认 bridge 网络容器流量都经此桥出入 - Docker 自动生成的
DOCKER-USER链位于filter/FORWARD前端,专供用户插入自定义规则,优先级高于 Docker 自身规则 - 使用
docker network create --driver bridge创建的自定义网络,背后就是独立网桥 + veth pair + NetNS,iptables 规则也需按桥名或子网单独管理











