一、案例目标
- 在 两个网络命名空间(ns1 和 ns2) 中各创建 两个模拟主机,共 4 个主机,均使用 相同 IP 网段(如
192.168.1.0/24
)。 - 同一命名空间内的主机可通信,不同命名空间的主机 IP 重叠但隔离。
- 通过 虚拟路由器 连接两个命名空间,并提供 NAT 访问互联网 的能力。
二、网络拓扑
+---------------------+
| Virtual Router |
| |
| eth1: 192.168.1.254|
| eth2: 10.0.1.254 |
+----------+----------+
|
|
+-----------------+-----------------+
| |
+-------+-----------+ +---------+---------+
| Bridge br1 | | Bridge br2 |
| IP: 192.168.1.1| | IP: 192.168.1.1|
+-------+-----------+ +---------+---------+
| |
| |
+-------+-----------+ +---------+---------+
| ns1-host1 (192.168.1.2) | | ns2-host1 (192.168.1.2) |
| ns1-host2 (192.168.1.3) | | ns2-host2 (192.168.1.3) |
+-----------------------+ +-------------------------+
三、实现步骤
1. 创建命名空间与网桥
# 创建命名空间
sudo ip netns add ns1
sudo ip netns add ns2
# 创建网桥 br1 和 br2
sudo ip link add br1 type bridge
sudo ip link add br2 type bridge
sudo ip link set br1 up
sudo ip link set br2 up
2. 配置虚拟路由器
# 创建虚拟路由器的网络命名空间
sudo ip netns add router
# 创建两对 veth 接口连接路由器和网桥
sudo ip link add veth-router1 type veth peer name veth-br1
sudo ip link add veth-router2 type veth peer name veth-br2
# 将 veth 接口分配到命名空间
sudo ip link set veth-router1 netns router
sudo ip link set veth-router2 netns router
sudo ip link set veth-br1 master br1
sudo ip link set veth-br2 master br2
# 配置路由器接口 IP
sudo ip netns exec router ip addr add 192.168.1.254/24 dev veth-router1
sudo ip netns exec router ip addr add 10.0.1.254/24 dev veth-router2
sudo ip netns exec router ip link set veth-router1 up
sudo ip netns exec router ip link set veth-router2 up
# 启用 IP 转发和 NAT
sudo ip netns exec router sysctl -w net.ipv4.ip_forward=1
sudo ip netns exec router iptables -t nat -A POSTROUTING -o veth-router2 -j MASQUERADE
3. 在 ns1 和 ns2 中创建模拟主机
# 在 ns1 中创建两个主机(使用相同网段)
sudo ip netns exec ns1 ip link add h1-eth0 type veth peer name h1-br1
sudo ip netns exec ns1 ip link add h2-eth0 type veth peer name h2-br1
sudo ip link set h1-br1 master br1
sudo ip link set h2-br1 master br1
sudo ip netns exec ns1 ip addr add 192.168.1.2/24 dev h1-eth0
sudo ip netns exec ns1 ip addr add 192.168.1.3/24 dev h2-eth0
sudo ip netns exec ns1 ip link set h1-eth0 up
sudo ip netns exec ns1 ip link set h2-eth0 up
# 在 ns2 中创建两个主机(IP 与 ns1 重叠)
sudo ip netns exec ns2 ip link add h1-eth0 type veth peer name h1-br2
sudo ip netns exec ns2 ip link add h2-eth0 type veth peer name h2-br2
sudo ip link set h1-br2 master br2
sudo ip link set h2-br2 master br2
sudo ip netns exec ns2 ip addr add 192.168.1.2/24 dev h1-eth0
sudo ip netns exec ns2 ip addr add 192.168.1.3/24 dev h2-eth0
sudo ip netns exec ns2 ip link set h1-eth0 up
sudo ip netns exec ns2 ip link set h2-eth0 up
4. 配置路由与默认网关
# ns1 中的主机设置默认网关指向路由器
sudo ip netns exec ns1 ip route add default via 192.168.1.254
# ns2 中的主机设置默认网关指向路由器
sudo ip netns exec ns2 ip route add default via 192.168.1.254
四、验证功能
1. 同一命名空间内通信
# ns1-host1 ping ns1-host2
sudo ip netns exec ns1 ping -c 3 192.168.1.3 # 成功
# ns2-host1 ping ns2-host2
sudo ip netns exec ns2 ping -c 3 192.168.1.3 # 成功
2. 不同命名空间隔离验证
# ns1-host1 ping ns2-host1(相同 IP,但隔离)
sudo ip netns exec ns1 ping -c 3 192.168.1.2 # 失败(因 IP 冲突,路由器无法正确路由)
3. 通过路由器访问互联网
# 在虚拟路由器中连接外部网络(假设 veth-router2 连接物理接口)
sudo ip link set veth-router2 netns router
sudo ip netns exec router ip route add default via 10.0.1.1 # 假设外部网关为 10.0.1.1
# 测试从 ns1-host1 访问外网
sudo ip netns exec ns1 ping -c 3 8.8.8.8 # 成功(通过 NAT)
五、关键机制说明
组件 | 作用 |
---|---|
网络命名空间 | 隔离网络栈,允许相同 IP 子网独立存在 |
网桥 | 连接同一命名空间内的主机,提供二层通信能力 |
虚拟路由器 | 处理跨命名空间流量,实现 NAT 和路由转发 |
NAT | 将内部重叠 IP 转换为唯一公网 IP,避免外部冲突 |
六、注意事项
- ARP 表管理:
- 不同命名空间中的相同 IP 会导致 ARP 表冲突,需通过路由器隔离或 VLAN 划分避免。
- 防火墙规则:
- 在路由器中配置
iptables
规则,禁止不同命名空间的直接通信。
sudo ip netns exec router iptables -A FORWARD -i veth-router1 -o veth-router1 -j DROP
- 在路由器中配置
- MAC 地址唯一性:
- 确保所有接口的 MAC 地址唯一,避免二层冲突。
七、扩展优化
- VLAN 隔离:
为每个命名空间的网桥分配不同 VLAN,彻底隔离广播域。sudo ip link set br1 type bridge vlan_filtering 1 sudo ip link set br2 type bridge vlan_filtering 1
- 动态路由协议:
在虚拟路由器中配置 OSPF 或 BGP,模拟复杂网络环境。
总结
通过此设计,可以实现 IP 地址重叠环境下的网络隔离与互联网访问,验证以下核心特性:
- 同一命名空间内通信正常:依赖网桥的二层转发。
- 不同命名空间 IP 重叠隔离:通过命名空间和路由器隔离。
- NAT 互联网访问:虚拟路由器实现地址转换。
此方案适用于多租户测试、网络协议验证等场景,是理解 Linux 网络虚拟化的高级实践。