网络命名空间(Network Namespace)是Linux内核从2.6版本开始引入的一种资源隔离机制,它把原本全局共享的网络资源切分成多个独立的实例。每个命名空间内部都拥有自己的网卡设备、IP地址、路由表、防火墙规则、socket端口占用情况以及/proc/net目录下的网络状态信息。Fedora由于内核版本更新激进,对命名空间相关特性的支持一直走在各大发行版前列,是学习和实践网络隔离技术的理想平台。理解网络命名空间的工作方式,也是后续掌握Docker、Podman、Kubernetes容器网络的必经之路。

网络命名空间到底隔离了哪些资源
要理解网络命名空间,关键在于明白它“隔离了什么”以及“没有隔离什么”。当一个进程被放入一个新的网络命名空间后,它看到的网络世界是完全独立的:ifconfig或ip addr命令只会显示该命名空间内的网卡,路由表是独立的,甚至TCP的80端口可以在不同命名空间内被多个进程同时监听而互不冲突。iptables规则同样按命名空间划分,这为安全隔离提供了基础。
具体来说,网络命名空间隔离的资源包括:网络设备接口(只显示归属本空间的接口,环回口lo也是每个空间独立一份)、IPv4和IPv6协议栈、路由表和路由规则、netfilter防火墙规则集、socket的端口号资源、sysctl中的网络参数(如ip_forward开关)、以及/proc/net和/sys/class/net目录下呈现的网络信息。但需要注意,它并不隔离文件系统、进程列表和用户权限,这些分别属于mount namespace、pid namespace和user namespace的管辖范围。多种命名空间组合起来,才构成了完整的容器技术基础。
从内核实现角度看,网络命名空间的数据结构net_namespace中保存了各类网络子系统的私有数据。创建新命名空间时,内核会为其初始化一套全新的网络栈,除了lo接口外没有任何设备,且lo默认处于down状态——这是新手最容易踩的第一个坑,后面实战部分会专门处理。
在Fedora中创建和管理网络命名空间
Fedora默认安装的iproute2工具包提供了ip netns系列命令,这是操作网络命名空间最主流的方式。确保系统已安装iproute2后,就可以开始动手实践。下面是一套完整的操作流程。
首先创建两个命名空间并让它们内部的基础网络可用:
# 创建两个命名空间 ip netns add ns1 ip netns add ns2 # 查看当前所有命名空间 ip netns list # 每个新命名空间只有lo且默认down,必须手动启用 ip netns exec ns1 ip link set lo up ip netns exec ns2 ip link set lo up # 进入命名空间查看其内部网络状态 ip netns exec ns1 ip addr
ip netns exec是核心命令,它的作用是在指定命名空间内执行任意命令。比如ip netns exec ns1 bash会启动一个运行在ns1内部的shell,在其中执行的所有网络操作都只影响ns1。物理机上命名为ns1的命名空间,其配置文件实际上存放在/var/run/netns/ns1路径下,ip netns正是通过bind mount到该路径来实现的。
删除命名空间使用ip netns del ns1。需要注意,删除操作只移除命名空间本身,如果里面有veth设备对的一端,该端会被销毁,但另一端所在命名空间不受影响。如果发现删除后ip netns list仍有残留项,通常是/var/run/netns下的挂载文件异常,手动删除该文件即可。
用veth pair和网桥实现命名空间互通
独立的命名空间彼此之间默认是隔绝的,要让它们通信,最常用的手段是veth(Virtual Ethernet)设备对。veth pair是一对虚拟网卡,从其中一端进入的数据包会原样从另一端出来,把一端放入命名空间A、另一端放入命名空间B,再分别配置IP,两个空间就能直接通信。
# 创建veth设备对 veth0-veth1 ip link add veth0 type veth peer name veth1 # 把veth1移入ns1并重命名 ip link set veth1 netns ns1 ip netns exec ns1 ip link set veth1 name eth0 # 配置IP并启用接口 ip addr add 10.0.0.1/24 dev veth0 ip link set veth0 up ip netns exec ns1 ip addr add 10.0.0.2/24 dev eth0 ip netns exec ns1 ip link set eth0 up # 测试连通性 ip netns exec ns1 ping 10.0.0.1
当命名空间数量增多时,veth两两互联会变得难以管理,这时网桥(bridge)是更优雅的方案:在宿主机上创建一个bridge,把每个veth的宿主机一端都插到bridge上,相当于组建了一台虚拟交换机。Fedora中可以用ip link add br0 type bridge创建,也可以使用NetworkManager的nmcli工具管理。此外,开启宿主机的ip_forward并配合iptables做SNAT(伪装),命名空间内的虚拟机就能借道宿主机访问外网,这正是Docker默认bridge网络的实现原理。
# 创建网桥并接入veth ip link add br0 type bridge ip link set br0 up ip link set veth0 master br0 ip addr add 10.0.0.254/24 dev br0 # 开启转发并配置SNAT让ns1上网 sysctl -w net.ipv4.ip_forward=1 iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE # ns1内配置默认网关 ip netns exec ns1 ip route add default via 10.0.0.254
典型应用场景与常见坑点
网络命名空间在生产中有大量实际用途。第一个场景是容器网络:Podman、Docker等容器运行时为每个容器创建独立的网络命名空间,再通过CNIT插件接入虚拟网络。第二个场景是网络沙箱调试:可以在命名空间内运行抓包工具或不明的网络程序,即使行为异常也不会污染主机网络环境。第三个场景是协议栈开发测试,Open vSwitch、各类SDN方案的开发者常用命名空间模拟多台主机组网,在一台Fedora机器上就能搭建出复杂的拓扑。此外,服务器多租户环境中也可以用命名空间为不同服务分配独立的监听端口空间和防火墙策略。
实践中有几个常见坑值得注意。一是前面提到的lo接口默认down,不启用会导致命名空间内部进程连localhost都访问不了。二是抓包时tcpdump必须在目标命名空间内执行,即ip netns exec ns1 tcpdump -i eth0,在宿主机上直接抓是看不到流量的。三是SELinux在Fedora默认 enforcing 模式下,可能对某些跨命名空间的操作产生拦截,遇到莫名的权限拒绝时可以用ausearch -m avc查日志判断。四是veth对在命名空间删除后可能出现悬挂设备,排查时用ip -d link show type veth确认状态。
最后提一个实用技巧:如果想让某个长期运行的服务固定在指定命名空间中,可以编写systemd服务单元,在ExecStart前通过ip netns exec包装命令,或者使用systemd原生的NetworkNamespacePath选项,后者是更规范的做法,能与Fedora的服务管理体系无缝集成。掌握这套机制后,再回头看容器网络、Kubernetes CNI等内容,很多设计就会豁然开朗。
总结
网络命名空间以极低的成本提供了强大的网络隔离能力,是Linux网络虚拟化的基石。在Fedora上借助iproute2工具链,配合veth设备、bridge网桥和iptables路由转发,可以搭建出从简单两节点互联到模拟完整数据中心拓扑的各种网络环境。建议读者在虚拟机中亲手完成上述实验,理解数据包在不同命名空间之间的流转路径,这种动手经验对学习容器编排、服务网格等上层技术大有裨益。
Fedora网络命名空间网络隔离ip netns命令修改时间:2026-09-06 17:24:39