network namespace 是 linux 内核原生支持的进程级网络协议栈隔离机制,每个 namespace 拥有独立的网络设备、ip 地址、路由表、防火墙规则、端口空间和 /proc/net 视图,通过 ip netns 创建后默认仅含 down 状态的 lo 接口,需手动启用并配置 veth pair 等才能实现跨命名空间通信。

直接用 Network namespace 就能实现进程级网络协议栈隔离。它不是模拟,而是内核原生支持的独立网络栈实例——每个 namespace 拥有自己的一套网络设备、IP 地址、路由表、防火墙规则、端口空间和 /proc/net 视图。
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 内的信息
快速创建并验证隔离环境
终端中执行以下命令即可完成最小闭环验证:
# 步骤1:创建新 network namespace(命名为 net1) sudo ip netns add net1 <h1>步骤2:进入该 namespace 执行命令(查看初始状态)</h1><p>sudo ip netns exec net1 ip link show</p><h1>输出仅含 lo,且 state DOWN</h1><p>sudo ip netns exec net1 ip route show</p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill5158" title="linux-sysadmin"><img src="https://img.php.cn/upload/skill/000/000/081/179038985443610.jpg" alt="linux-sysadmin" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill5158" title="linux-sysadmin" class="overflowclass">linux-sysadmin</a> <p class="overflowclass">Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...</p> </div> <a rel="nofollow" href="/xiazai/skill5158" title="linux-sysadmin" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div><h1>输出为空,无默认路由</h1><p>sudo ip netns exec net1 cat /proc/net/dev</p><h1>只有 lo 接口统计</h1><h1>步骤3:启用 lo 并测试本地通信</h1><p>sudo ip netns exec net1 ip link set lo up sudo ip netns exec net1 ping -c 1 127.0.0.1 </p>
让隔离环境与宿主机连通(常用实践)
纯隔离无法通信,实际中常通过 veth pair 搭建“虚拟网线”:
- 在宿主机创建一对 veth 设备:
ip link add veth-host type veth peer name veth-net1 - 将
veth-net1移入目标 namespace:ip link set veth-net1 netns net1 - 为两端配置 IP 并启用:
宿主机侧:ip addr add 192.168.100.1/24 dev veth-host && ip link set veth-host up
namespace 内:sudo ip netns exec net1 ip addr add 192.168.100.2/24 dev veth-net1 && sudo ip netns exec net1 ip link set veth-net1 up - 添加路由(如需跨网段)或直接 ping 测试连通性:
sudo ip netns exec net1 ping 192.168.100.1
绑定进程到指定 Network namespace
有两种主流方式:
-
启动时指定:用
ip netns exec运行程序,例如sudo ip netns exec net1 python3 -m http.server 8000
此时服务只监听192.168.100.2:8000,宿主机curl 127.0.0.1:8000无法访问 -
运行中迁移:对已有进程 PID 使用
nsenter切换上下文,例如sudo nsenter -t $PID -n --preserve-credentials /bin/bash
进入后即处于该进程所属的 Network namespace,可调试网络行为
不复杂但容易忽略:Network namespace 本身不提供外部可达性,是否能上网、被访问,完全取决于你如何配置 veth、路由、NAT 或防火墙。隔离是前提,连通是设计结果。










