案例目标
- 模拟一个路由器,连接两个子网(
192.168.1.0/24
和10.0.0.0/24
),实现以下功能:- 子网间互通。
- 子网通过路由器访问外部网络(需配置 NAT)。
- 路由器支持基础防火墙规则(如禁止 ICMP 流量)。
实现步骤
一、网络拓扑设计
+---------------------+
| Router (ns0) |
| |
| veth0: 192.168.1.1 |
| veth1: 10.0.0.1 |
+----------+----------+
|
|
+-----------------+-----------------+
| |
+-------+-----------+ +---------+---------+
| Subnet A (ns1) | | Subnet B (ns2) |
| vethA:192.168.1.2| | vethB:10.0.0.2 |
+-------------------+ +-------------------+
二、具体实现步骤
1. 创建网络命名空间
# 创建路由器命名空间
sudo ip netns add ns0
# 创建子网命名空间
sudo ip netns add ns1 # 子网 A (192.168.1.0/24)
sudo ip netns add ns2 # 子网 B (10.0.0.0/24)
2. 创建虚拟设备并连接命名空间
# 创建 veth pair:veth0(路由器端) <-> vethA(子网 A)
sudo ip link add veth0 type veth peer name vethA
# 创建 veth pair:veth1(路由器端) <-> vethB(子网 B)
sudo ip link add veth1 type veth peer name vethB
# 将设备分配到命名空间
sudo ip link set veth0 netns ns0
sudo ip link set veth1 netns ns0
sudo ip link set vethA netns ns1
sudo ip link set vethB netns ns2
3. 配置 IP 地址并启用设备
# 配置路由器(ns0)
sudo ip netns exec ns0 ip addr add 192.168.1.1/24 dev veth0
sudo ip netns exec ns0 ip addr add 10.0.0.1/24 dev veth1
sudo ip netns exec ns0 ip link set veth0 up
sudo ip netns exec ns0 ip link set veth1 up
# 配置子网 A(ns1)
sudo ip netns exec ns1 ip addr add 192.168.1.2/24 dev vethA
sudo ip netns exec ns1 ip link set vethA up
sudo ip netns exec ns1 ip route add default via 192.168.1.1 # 默认网关指向路由器
# 配置子网 B(ns2)
sudo ip netns exec ns2 ip addr add 10.0.0.2/24 dev vethB
sudo ip netns exec ns2 ip link set vethB up
sudo ip netns exec ns2 ip route add default via 10.0.0.1 # 默认网关指向路由器
4. 启用路由器的 IP 转发
# 在路由器命名空间启用 IP 转发
sudo ip netns exec ns0 sysctl -w net.ipv4.ip_forward=1
5. 配置子网间路由
# 路由器已自动添加直连路由,无需额外配置
# 查看路由表
sudo ip netns exec ns0 ip route
6. 验证子网间通信
# 从子网 A ping 子网 B
sudo ip netns exec ns1 ping -c 3 10.0.0.2
# 从子网 B ping 子网 A
sudo ip netns exec ns2 ping -c 3 192.168.1.2
三、扩展功能:配置 NAT 访问外部网络
1. 连接路由器到宿主机物理网络
# 创建一对 veth 连接路由器和宿主机
sudo ip link add veth-out type veth peer name veth-out-router
sudo ip link set veth-out-router netns ns0
# 配置路由器端
sudo ip netns exec ns0 ip addr add 172.16.0.2/24 dev veth-out-router
sudo ip netns exec ns0 ip link set veth-out-router up
sudo ip netns exec ns0 ip route add default via 172.16.0.1 # 假设宿主机网关为 172.16.0.1
# 配置宿主机端
sudo ip addr add 172.16.0.1/24 dev veth-out
sudo ip link set veth-out up
2. 配置 NAT 规则
# 在路由器命名空间添加 NAT 规则(假设物理接口为 eth0)
sudo ip netns exec ns0 iptables -t nat -A POSTROUTING -o veth-out-router -j MASQUERADE
3. 验证外部网络访问
# 在子网 A 中测试访问外网(如 8.8.8.8)
sudo ip netns exec ns1 ping -c 3 8.8.8.8
四、配置防火墙规则(可选)
1. 禁止子网 A 到子网 B 的 ICMP 流量
# 在路由器命名空间添加 iptables 规则
sudo ip netns exec ns0 iptables -A FORWARD -s 192.168.1.0/24 -d 10.0.0.0/24 -p icmp -j DROP
2. 验证防火墙规则
# 子网 A ping 子网 B 应失败
sudo ip netns exec ns1 ping -c 3 10.0.0.2
总结
实现的核心逻辑
- 网络隔离:通过命名空间隔离子网和路由器。
- 虚拟设备互联:使用
veth pair
连接不同命名空间。 - 路由配置:在路由器启用 IP 转发并设置默认网关。
- NAT 与防火墙:通过
iptables
实现地址转换和流量控制。
应用场景
- 网络实验:模拟企业内网、多租户隔离环境。
- 开发测试:验证路由协议或防火墙策略。
- 教育演示:理解路由器工作原理和 Linux 网络栈。
验证要点
- 连通性:子网间、子网与外网的通信。
- 隔离性:宿主机无法直接访问子网 IP。
- 防火墙:规则是否按预期阻断流量。
通过本案例,您已掌握如何利用 Linux 网络命名空间构建一个功能完整的虚拟路由器!