直接用 Linux 的 network namespace 就能实现进程级网络协议栈安全隔离,它基于内核原生支持,为每个 namespace 提供独立的网络设备、IP 地址、路由表、防火墙规则、端口空间和 /proc/net 视图,进程仅能访问本 namespace 内的网络资源。

直接用 Linux 的 network namespace 就能实现进程级网络协议栈安全隔离。它不是模拟,而是内核原生支持的独立网络栈实例——每个 namespace 拥有自己的一套网络设备、IP 地址、路由表、防火墙规则、端口空间和 /proc/net 视图,进程一旦进入某个 network namespace,就只能看到、绑定、访问该 namespace 内的网络资源。
network namespace 的核心隔离能力
创建一个 network namespace 后,该空间内:
- 自带一个
lo环回接口,但默认处于DOWN状态,需手动启用(ip link set lo up) - 完全看不到宿主机或其他 namespace 中的网卡(如
eth0、docker0) - 路由表、ARP 表、邻居缓存、iptables/nftables 规则全部为空或独立初始化
- 绑定在该 namespace 中的进程,只能监听/访问属于该 namespace 的 IP 和端口
-
netstat -tuln、ss -tuln、cat /proc/net/tcp等命令只显示本 namespace 内的信息
快速创建并验证最小隔离环境
终端中执行以下命令即可完成闭环验证:
-
创建命名空间:
sudo ip netns add net1 -
查看内部网络接口:
sudo ip netns exec net1 ip link show→ 仅输出lo且状态为DOWN -
检查路由表:
sudo ip netns exec net1 ip route show→ 输出为空(无默认路由) -
确认网络设备视图:
sudo ip netns exec net1 cat /proc/net/dev→ 仅含lo统计数据
实现跨 namespace 安全通信(veth pair 方案)
单靠一个 namespace 是封闭的;要让隔离环境与外部通信,又不破坏隔离性,推荐使用 veth 虚拟以太网设备配对:
- 创建一对 veth 接口:
sudo ip link add veth0 type veth peer name veth1 - 将
veth1移入net1:sudo ip link set veth1 netns net1 - 为主机侧配置 IP 并启用:
sudo ip addr add 192.168.100.1/24 dev veth0 && sudo ip link set veth0 up - 在
net1内配置另一端:sudo ip netns exec net1 ip addr add 192.168.100.2/24 dev veth1 && sudo ip netns exec net1 ip link set veth1 up && sudo ip netns exec net1 ip link set lo up - 添加路由(如需访问外部网络):
sudo ip netns exec net1 ip route add default via 192.168.100.1
此时 net1 内进程可访问主机网络,但无法直接触达宿主机其他网卡或全局端口;所有流量经 veth pair 受控转发,iptables/nftables 规则也可按 namespace 单独设置,形成明确边界。
绑定进程到指定 network namespace
隔离最终服务于进程。有两类常用方式:
-
启动新进程时指定:
sudo ip netns exec net1 /bin/bash→ 启动 shell 并继承net1网络视图 -
将已有进程迁移进去(需进程未设置
CLONE_NEWNET):sudo nsenter -t <pid> -n /bin/bash</pid>,其中-n表示进入目标进程的 network namespace - 实际部署服务时,常配合
unshare创建并进入新 namespace:sudo unshare --net=/var/run/netns/net1 --user --map-root-user --fork --pid /bin/bash
注意:普通用户默认无权操作 network namespace,需 root 权限或配置 user namespace 映射提升安全性。


















