CentOS 6.5 是一款广泛使用的 Linux 发行版,尽管其生命周期已结束,但在某些遗留系统或特定环境中仍可能被使用,网络命名空间(ip netns)是 Linux 内核提供的一种网络虚拟化技术,允许在单个主机上创建多个独立的网络空间,每个空间拥有独立的网络栈、路由表、防火墙规则等,本文将详细介绍在 CentOS 6.5 系统上如何使用 ip netns 工具进行网络命名空间的管理,包括创建、删除、配置以及实际应用场景。

网络命名空间简介
网络命名空间是 Linux 内核从 2.6.24 版本开始引入的功能,它通过隔离网络资源实现了虚拟网络环境,每个命名空间都拥有独立的网络设备、IP 地址、路由表、ARP 表、iptables 规则等,使得不同命名空间之间的网络互不影响,在 CentOS 6.5 系统中,ip netns 是 iproute2 包的一部分,通常默认已安装,若未安装,可通过 yum install iproute 命令进行安装。
检查系统环境
在使用 ip netns 之前,需要确保系统内核支持网络命名空间功能,可以通过以下命令检查:
ls /var/run/netns
如果输出为空或目录不存在,说明系统尚未启用网络命名空间支持,还需确认 ip 命令是否可用:
ip --version
若显示版本信息,则 iproute2 工具已正确安装。
创建网络命名空间
创建网络命名空间是使用 ip netns 的第一步,假设我们需要创建一个名为 ns1 的命名空间,可以使用以下命令:
ip netns add ns1
执行成功后,会在 /var/run/netns/ 目录下生成一个名为 ns1 的文件,该文件代表了命名空间的上下文,可以通过以下命令验证命名空间是否创建成功:
ip netns list
输出中应包含 ns1。

将网络接口移入命名空间
默认情况下,物理网络接口(如 eth0)属于默认的命名空间,为了在命名空间中使用独立的网络接口,需要将接口移动到目标命名空间,将 eth0 移动到 ns1:
ip link set eth0 netns ns1
移动后,原命名空间中将无法再看到 eth0 接口,可以通过以下命令在 ns1 命名空间中查看接口:
ip netns exec ns1 ip link show
配置命名空间中的网络接口
将接口移动到命名空间后,需要为其配置 IP 地址和启用接口,以下是在 ns1 中为 eth0 配置静态 IP 的示例:
ip netns exec ns1 ip addr add 192.168.1.100/24 dev eth0 ip netns exec ns1 ip link set eth0 up
还可以配置默认网关:
ip netns exec ns1 ip route add default via 192.168.1.1
创建虚拟以太网对(VETH)
在某些场景下,可能需要命名空间与外部网络通信,可以创建虚拟以太网对(VETH)来实现连接,创建一对名为 veth0 和 veth1 的虚拟接口:
ip link add veth0 type veth peer name veth1
将 veth1 移动到 ns1 命名空间,并为 veth0 和 veth1 分配 IP 地址:
ip link set veth1 netns ns1 ip addr add 10.0.0.1/24 dev veth0 ip netns exec ns1 ip addr add 10.0.0.2/24 dev veth1 ip link set veth0 up ip netns exec ns1 ip link set veth1 up
ns1 命名空间可以通过 veth1 与外部的 veth0 通信。

删除网络命名空间
当不再需要某个命名空间时,可以通过以下命令删除:
ip netns del ns1
删除后,/var/run/netns/ 目录下的对应文件也会被移除,需要注意的是,删除命名空间前应确保其中的所有接口已被清理或移回默认命名空间。
实际应用场景
网络命名空间在多个场景中具有实用价值,在容器技术(如 Docker)中,每个容器通常运行在独立的命名空间中,以实现网络隔离,网络命名空间还可用于网络测试、防火墙规则隔离以及虚拟网络环境的搭建。
常见问题与解决
在使用 ip netns 时,可能会遇到一些常见问题,移动接口后无法 ping 通外部网络,可能是由于路由配置或防火墙规则导致的,可通过 ip netns exec ns1 ip route show 检查路由表,或使用 ip netns exec ns1 iptables -L 查看防火墙规则。
相关问答 FAQs
问题 1:如何验证两个命名空间之间的网络连通性?
解答:可以通过在两个命名空间中分别分配 IP 地址,并创建 VETH 接口连接它们,在 ns1 中配置 0.0.2/24,在 ns2 中配置 0.0.3/24,然后使用 ping 命令测试连通性:
ip netns exec ns1 ping 10.0.0.3
问题 2:删除命名空间时提示“Device or resource busy”,如何解决?
解答:通常是因为命名空间中仍有活跃的接口或进程,需先使用 ip netns exec ns1 ip link del <interface> 删除接口,或终止相关进程后,再尝试删除命名空间。