linux网络命名空间(netns)通过为每个业务创建独立网络协议栈,实现设备、ip、路由、iptables及连接状态的完全隔离;需用veth pair桥接并配专用网桥,禁用ip转发与反向路径过滤,确保业务间真正不可见、不可连、不可干扰。

用虚拟网络命名空间(netns)实现多业务应用的完全独立网络隔离,核心在于为每个业务分配专属的网络协议栈,并切断默认通信路径。它不是靠防火墙封端口,而是让不同业务根本“看不见彼此”的网络设备、IP、路由和连接状态——这才是真正的隔离。
一、创建并初始化独立业务命名空间
每个业务对应一个命名空间,名称建议体现用途,如 prod-api、dev-db、monitor-sys:
- 创建命名空间:
sudo ip netns add prod-api - 验证存在:
ls /var/run/netns/或ip netns list - 进入命名空间执行命令:
sudo ip netns exec prod-api ip link show→ 只看到未启用的lo,说明网络栈已清空,无任何外部接口
二、配置跨命名空间通信链路(veth pair + 网桥)
纯 netns 默认无法连外网或互通。需用虚拟以太网对(veth pair)桥接,但关键是要避免所有业务共享同一桥接点——否则仍可能通过 ARP 或广播干扰。推荐为每组有通信需求的业务单独建链路:
- 创建一对 veth:
sudo ip link add veth-prod type veth peer name veth-prod-br - 将 guest 端移入命名空间:
sudo ip link set veth-prod netns prod-api - 在命名空间内重命名并配置 IP:
sudo ip netns exec prod-api -- ip link set veth-prod name eth0 && sudo ip netns exec prod-api ip addr add 10.10.1.10/24 dev eth0 && sudo ip netns exec prod-api ip link set eth0 up - 主机侧启用并加入专用网桥(不复用已有 bridge):
sudo brctl addbr br-prod && sudo brctl addif br-prod veth-prod-br && sudo ip link set veth-prod-br up && sudo ip addr add 10.10.1.1/24 dev br-prod && sudo ip link set br-prod up
三、绑定业务进程到指定命名空间
服务启动必须在目标 netns 内运行,否则会回退到默认命名空间:
- 直接启动(推荐):
sudo ip netns exec prod-api /usr/bin/python3 -m http.server 8000 - 后台运行(加
&并保持 shell 分离):sudo ip netns exec prod-api nohup /usr/bin/node app.js >/dev/null 2>&1 & - 若服务已运行,可用
nsenter迁移(仅限支持 cgroup v1 的旧环境,不推荐生产使用)
四、验证隔离效果(三步必测)
真正隔离不是“能通”,而是“不通该不通的”:
-
查监听端口:在 host 执行
ss -tln | grep :8000应无输出;进prod-api后执行才有 -
测跨命名空间访问:在
dev-db命名空间中curl http://10.10.1.10:8000→ 必须失败(除非显式配置路由或桥接) -
测外部可见性:从局域网另一台机器
curl http://10.10.1.1:8000→ 失败;只有经 NAT 或端口映射(如 iptables DNAT)才可对外暴露
不复杂但容易忽略:命名空间本身不提供安全边界,必须配合关闭 IP 转发(echo 0 > /proc/sys/net/ipv4/ip_forward)、禁用反向路径过滤(net.ipv4.conf.all.rp_filter=0),并确保宿主机 iptables 不意外放行跨 netns 流量。做到这一步,prod-api、dev-db、monitor-sys 就真的像跑在三台物理机上一样互不可见。











