net namespace实现进程级网络协议栈隔离,每个netns拥有独立网络设备、ip、路由表、iptables规则和端口空间,进程进入后仅感知所属命名空间的网络资源。

直接用 net namespace 就能实现进程级的网络协议栈隔离。它不是模拟,而是内核原生支持的逻辑隔离:每个 netns 拥有自己独立的网络设备、IP 地址、路由表、ARP 表、iptables 规则和 socket 绑定空间。一个进程一旦进入某个 netns,它看到的整个网络世界就只属于那个命名空间。
创建并关联网络命名空间到进程
最常用的方式是用 unshare 启动一个带新 netns 的 shell:
-
sudo unshare --net --fork --mount-proc /bin/bash—— 创建新 netns 并挂载专属/proc,后续所有网络操作(如ip addr、ss -tln)都只作用于该空间 - 此时
ip link show只能看到lo(回环),没有其他网卡;ip route show也为空,说明完全干净独立 - 若想让已有进程进入指定 netns,可用
nsenter -t <pid> -n</pid>,比如调试某个容器内的网络行为
配置网络连通性(关键实操步骤)
纯 netns 默认是“孤岛”,要让它与外界通信,必须手动建立连接通道。最常用的是 veth pair:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 在宿主机创建一对虚拟网卡:
ip link add veth0 type veth peer name veth1 - 把一端移入目标 netns:
ip link set veth1 netns ns1 - 在 netns 内启用并配 IP:
ip netns exec ns1 ip link set veth1 up && ip netns exec ns1 ip addr add 10.0.0.2/24 dev veth1 - 在宿主机配另一端:
ip link set veth0 up && ip addr add 10.0.0.1/24 dev veth0 - 开启 IP 转发并加 NAT(如需访问外网):
echo 1 > /proc/sys/net/ipv4/ip_forward,再用iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j MASQUERADE
验证隔离是否生效
隔离是否真正起作用,不能只看命令是否成功,要看跨空间是否“不可见”:
- 在 netns 内运行
nc -l 8080,宿主机执行telnet 10.0.0.2 8080可通,但telnet 127.0.0.1 8080必然失败——因为 localhost 在 netns 里指它自己的lo,与宿主机无关 - 在 netns 中执行
ss -tln,只能看到绑定在veth1或lo上的监听端口;宿主机上ss -tln | grep :8080查不到该端口 - 修改 netns 内的 iptables 规则,不影响宿主机或其他 netns;删除某个 netns,其所有网络设备、路由、连接状态自动清理
组合其他命名空间增强隔离强度
单靠 netns 还不够彻底。真实场景中常配合其他命名空间使用,避免信息泄露或干扰:
-
sudo unshare --user --pid --net --mount --uts --ipc --fork --mount-proc /bin/bash:一次启用全部核心隔离,进程 PID=1、主机名可自设、用户 ID 映射独立、IPC 不互通、挂载点私有 - 特别注意
--user+--map-root-user:能让普通用户在无 root 权限下安全使用 netns,避免 CAP_SYS_ADMIN 提权风险 - 用
lsns -t net可查看当前系统所有 netns 及其所属进程,便于排查残留或调试










