利用ip netns创建命名空间并配veth链路可实现服务流量完全不经过宿主机默认网络栈,因其根本看不见其他网络设备、IP和路由;需依次创建命名空间、配置veth对、分配IP、启用接口、禁用转发与反向路径过滤,确保零可见性隔离。

直接用 ip netns 创建命名空间并配 veth 链路,就能让服务流量完全不经过宿主机默认网络栈——这不是“限制访问”,而是让它根本看不见其他网络设备、IP 和路由。
创建专用命名空间并确认干净隔离
每个业务或服务单独建一个命名空间,名称体现用途,比如 api-prod 或 db-staging:
- 执行
sudo ip netns add api-prod - 验证是否生效:
sudo ip netns exec api-prod ip link show→ 只显示未启用的lo,无eth0等任何外部接口 - 检查路由:
sudo ip netns exec api-prod ip route show→ 输出为空,说明无默认网关、无连通能力
配置 veth 对接宿主机(单点接入)
让命名空间能访问外网,但不与其他命名空间互通,推荐“veth + 宿主机子网”方式(比网桥更轻量、更可控):
- 创建虚拟网卡对:
sudo ip link add veth-api type veth peer name veth-api-host - 把 guest 端移入命名空间:
sudo ip link set veth-api netns api-prod - 在命名空间内启用并配 IP:
sudo ip netns exec api-prod ip link set veth-api up && sudo ip netns exec api-prod ip addr add 172.20.1.10/24 dev veth-api - 在宿主机侧启用另一端:
sudo ip link set veth-api-host up && sudo ip addr add 172.20.1.1/24 dev veth-api-host - 启用命名空间的回环:
sudo ip netns exec api-prod ip link set lo up
绑定服务进程并验证流量归属
服务必须在目标命名空间中启动,才真正运行在隔离网络下:
- 直接运行:
sudo ip netns exec api-prod /usr/bin/python3 -m http.server 8000 - 查监听地址:
sudo ip netns exec api-prod ss -tln | grep :8000→ 显示*:8000或172.20.1.10:8000,绝不会绑定到宿主机0.0.0.0:8000 - 从宿主机测试:
curl http://172.20.1.10:8000可通;curl http://127.0.0.1:8000必然失败(因为 localhost 在命名空间里指向它自己的lo) - 再开一个命名空间如
db-staging,执行同样curl→ 失败,证明跨空间零可见性
增强隔离:禁用转发与反向路径校验
防止意外路由泄露或 ARP 干扰,宿主机上做两处关键加固:
- 关闭该 veth 接口的 IP 转发:
sudo sysctl -w net.ipv4.conf.veth-api-host.forwarding=0 - 禁用反向路径过滤(避免因路由不对称丢包):
sudo sysctl -w net.ipv4.conf.veth-api-host.rp_filter=0 - 若需持久化,写入
/etc/sysctl.conf并执行sysctl -p
不复杂但容易忽略:命名空间本身是空的,所有网络能力都靠手动注入;只要不显式连接,它就真的和外界断联。这才是流量隔离的本质。


















