网络命名空间验证网络重叠现象

发布于:2025-04-03 ⋅ 阅读:(17) ⋅ 点赞:(0)

在这里插入图片描述

一、案例目标
  • 两个网络命名空间(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,避免外部冲突

六、注意事项
  1. ARP 表管理
    • 不同命名空间中的相同 IP 会导致 ARP 表冲突,需通过路由器隔离或 VLAN 划分避免。
  2. 防火墙规则
    • 在路由器中配置 iptables 规则,禁止不同命名空间的直接通信。
    sudo ip netns exec router iptables -A FORWARD -i veth-router1 -o veth-router1 -j DROP
    
  3. 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 地址重叠环境下的网络隔离与互联网访问,验证以下核心特性:

  1. 同一命名空间内通信正常:依赖网桥的二层转发。
  2. 不同命名空间 IP 重叠隔离:通过命名空间和路由器隔离。
  3. NAT 互联网访问:虚拟路由器实现地址转换。

此方案适用于多租户测试、网络协议验证等场景,是理解 Linux 网络虚拟化的高级实践。


网站公告

今日签到

点亮在社区的每一天
去签到