veth实现跨命名空间加固的核心是依托命名空间天然隔离与精准通信路径控制,而非额外防护;它仅提供直连虚拟通道,需配合私有ip、路由精简、nftables规则及逃逸路径封堵等措施实现安全可控通信。

用 veth 实现跨命名空间网络加固,核心不是“加额外防护”,而是**依托隔离本身+精准通信路径控制**来提升安全性。veth 本身不加密、不过滤,但配合命名空间的天然隔离和合理配置,能有效阻断非预期访问、缩小攻击面。
veth 是通信通道,不是防火墙
veth pair 只负责把两个命名空间“直连”起来,像一根虚拟网线。它不自带访问控制或加密能力。所谓“加固”,其实是通过以下方式让通信更可控、更可审计:
- 只在需要通信的命名空间之间创建 veth,避免全通式连接
- 关闭不必要的接口(如 lo 以外的默认路由、冗余 IP)
- 在命名空间内部启用 iptables/nftables,基于 veth 接口做细粒度规则
- 不给 veth 接口分配全局可路由地址(例如不用公网段、不用主机所在子网)
关键加固操作步骤
以 ns1 和 ns2 为例,目标是让它们仅能通过 veth 互访,且禁止访问主机或其他命名空间:
- 创建 veth 时使用私有网段(如 172.20.0.0/24),避免与宿主机或容器网络冲突
- 为每个命名空间的 veth 接口配置 仅一个 IP 地址,不配网关、不加默认路由
- 执行
ip netns exec ns1 ip route flush table main清空路由表,再只加必要路由:ip netns exec ns1 ip route add 172.20.0.2/32 via 172.20.0.1 dev veth0 - 在 ns1 中启用 nftables,只允许 ESTABLISHED/RELATED 流量和明确目的 IP 的 ICMP/TCP:
ip netns exec ns1 nft add rule ip filter output ip daddr 172.20.0.2 ct state established,related counter accept - 确保两个命名空间中都禁用 IPv6(除非必需):
ip netns exec ns1 sysctl -w net.ipv6.conf.all.disable_ipv6=1
防止逃逸:切断命名空间到主机的隐性通路
很多安全问题源于“以为隔离了,其实还能绕过”。需主动堵住常见逃逸路径:
- 检查并禁用命名空间内的
lo接口上的非 127.0.0.1 地址(避免绑定 0.0.0.0 或主机地址) - 确认未挂载主机目录(如 /proc/sys/net)到命名空间内,否则可能动态修改网络参数
- 不在命名空间中运行特权进程(
--privileged或cap_net_admin),防止重配网络栈 - 用
ip netns exec ns1 cat /proc/self/ns/net验证是否真正进入目标命名空间(对比主机的 inode 号)
进阶:用网桥+ebtables 增强二层控制
如果多个命名空间需互联(不止两个),建议引入网桥,并用 ebtables 在数据链路层过滤:
- 创建网桥
br-veth并启用 STP(防环) - 将各 veth 对的一端接入网桥,另一端留在对应命名空间
- 用
ebtables -t broute拦截非预期 MAC 地址或协议类型(如阻止 ARP 扫描、限制 DHCP 请求源) - 结合 cgroups 限制命名空间的 socket 创建数或带宽,防 DoS 类攻击











