
案例目标
- 隔离性:在同一台物理机上创建两个独立的网络命名空间(模拟两台主机),确保其网络配置完全隔离。
- 内部通信:允许两个命名空间通过虚拟设备直接通信。
- 外部访问:通过宿主机的网桥和 NAT 规则,使两个命名空间能够访问外部互联网。
核心要求
- 使用
ip netns
和 veth pair
实现网络隔离。 - 通过网桥(Bridge)连接命名空间与宿主机物理网络。
- 配置 NAT 实现外网访问。
- 验证隔离性、内部通信及外部连通性。
实现步骤
步骤 1:清理旧配置(如有)
sudo ip netns delete ns1 2>/dev/null
sudo ip netns delete ns2 2>/dev/null
sudo ip link delete br0 2>/dev/null
sudo ip link delete veth1-host 2>/dev/null
sudo ip link delete veth2-host 2>/dev/null
步骤 2:创建网络命名空间
sudo ip netns add ns1
sudo ip netns add ns2
步骤 3:创建网桥并连接物理网络
sudo ip link add br0 type bridge
sudo ip link set br0 up
sudo ip link set eth0 master br0
sudo dhclient br0
步骤 4:为每个命名空间创建 veth pair 并连接网桥
sudo ip link add veth1-host type veth peer name veth1-ns
sudo ip link set veth1-host master br0
sudo ip link set veth1-host up
sudo ip link add veth2-host type veth peer name veth2-ns
sudo ip link set veth2-host master br0
sudo ip link set veth2-host up
sudo ip link set veth1-ns netns ns1
sudo ip link set veth2-ns netns ns2
步骤 5:配置命名空间的网络
sudo ip netns exec ns1 ip addr add 192.168.1.101/24 dev veth1-ns
sudo ip netns exec ns1 ip link set veth1-ns up
sudo ip netns exec ns1 ip route add default via 192.168.1.1
sudo ip netns exec ns2 ip addr add 192.168.1.102/24 dev veth2-ns
sudo ip netns exec ns2 ip link set veth2-ns up
sudo ip netns exec ns2 ip route add default via 192.168.1.1
步骤 6:配置 NAT 允许外网访问
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i br0 -o eth0 -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o br0 -m state --state RELATED,ESTABLISHED -j ACCEPT
步骤 7:验证网络功能
sudo ip netns exec ns1 ping -c 3 192.168.1.102
sudo ip netns exec ns2 ping -c 3 192.168.1.101
sudo ip netns exec ns1 ping -c 3 8.8.8.8
sudo ip netns exec ns2 ping -c 3 8.8.8.8
ping -c 3 192.168.1.101
最终网络拓扑
宿主机网桥 br0 (IP: 自动获取或手动配置)
│
├─ eth0 (物理网卡,通过 DHCP/NAT 访问外网)
├─ veth1-host (连接到 ns1 的 veth1-ns, IP: 192.168.1.101)
└─ veth2-host (连接到 ns2 的 veth2-ns, IP: 192.168.1.102)
总结
实现目标回顾
- 隔离性:通过
ip netns
创建独立命名空间,确保 ns1 和 ns2 的网络配置互不影响。 - 内部通信:通过 veth pair 和网桥,两个命名空间可直接通信(同一子网)。
- 外部访问:通过网桥绑定物理网卡并配置 NAT,命名空间可访问外网。
关键技术点
- 网络命名空间:隔离网络协议栈(IP、路由表、设备)。
- veth pair:跨命名空间通信的虚拟“网线”。
- 网桥:连接多个网络接口,模拟物理交换机。
- NAT:通过 iptables 实现地址转换,允许内网访问外网。
应用场景
- 容器网络:Docker/Kubernetes 使用类似机制为容器提供网络。
- 多租户测试:为不同租户分配独立网络环境。
- 安全实验:隔离测试环境,防止实验影响宿主机网络。