网络命名空间(Network Namespace)是Linux内核提供的一种网络隔离机制,它允许不同命名空间拥有独立的:
网络设备接口
IP地址和路由表
防火墙规则(iptables/nftables)
端口号范围
这种技术被广泛应用于容器化(Docker/K8s)、虚拟化等场景,是实现网络隔离的重要基础。
# 清空已有测试命名空间(避免冲突)
ip netns del test1 2>/dev/null
ip netns del test2 2>/dev/null
# 创建两个隔离的网络命名空间
ip netns add test1
ip netns add test2
# 激活每个命名空间的lo接口(基础网络服务需要)
ip netns exec test1 ip link set lo up
ip netns exec test2 ip link set lo up
# 创建成对的虚拟网卡(类似网线直连)
ip link add veth-test1 type veth peer name veth-test2
# 将虚拟网卡分别放入不同命名空间
ip link set veth-test1 netns test1
ip link set veth-test2 netns test2
# 为test1的veth接口分配IP
ip netns exec test1 ip addr add 192.168.1.1/24 dev veth-test1
# 为test2的veth接口分配IP
ip netns exec test2 ip addr add 192.168.1.2/24 dev veth-test2
# 启用两端网卡
ip netns exec test1 ip link set veth-test1 up
ip netns exec test2 ip link set veth-test2 up
# 从test1 ping test2
ip netns exec test1 ping -c 3 192.168.1.2
# 从test2 ping test1
ip netns exec test2 ping -c 3 192.168.1.1
预期结果:
PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.
64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.037 ms
64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.046 ms
64 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=0.045 ms
组件 | 作用说明 |
---|---|
veth pair | 成对出现的虚拟网卡,实现跨命名空间数据通道 |
ip netns 命令 | 管理网络命名空间的核心工具 |
网络命名空间 | 隔离的网络协议栈实例 |
test1命名空间 test2命名空间
+----------------+ +----------------+
| veth-test1 | <------> | veth-test2 |
| 192.168.1.1/24 | | 192.168.1.2/24 |
+----------------+ +----------------+
# 查看test1的网络接口
ip netns exec test1 ip addr show
# 查看test2的路由表
ip netns exec test2 ip route show
可通过创建Linux网桥,将veth一端连接到网桥,实现:
跨多个命名空间通信
访问宿主机网络
通过NAT访问外网
网络命名空间配置在重启后会丢失,如需持久化可以:
将命令写入/etc/rc.local
使用systemd unit文件管理
通过网络管理工具(如nmcli)配置
权限要求:所有操作需要root权限
命名冲突:命名空间名称和veth名称需唯一
IP地址规划:确保不同命名空间的IP不冲突
清理残留:实验完成后建议执行:
ip netns del test1
ip netns del test2
ip link delete veth-test1 2>/dev/null
通过本文实践,我们实现了:
✅ 创建隔离的网络环境
✅ 配置虚拟网络设备
✅ 验证跨命名空间通信
✅ 理解底层网络隔离原理