案例:网络命名空间模拟隔离主机场景
场景描述
假设我们需要在同一台物理机上模拟两台独立的主机(Host A 和 Host B),它们分别位于不同的网络命名空间中,并通过虚拟以太网对(veth pair)进行通信。目标是展示网络命名空间的隔离性和跨命名空间的通信能力。
步骤 1:创建网络命名空间
创建两个命名空间 ns1
和 ns2
,分别代表 Host A 和 Host B 的网络环境。
sudo ip netns add ns1 # 创建命名空间 ns1(Host A)
sudo ip netns add ns2 # 创建命名空间 ns2(Host B)
# 查看所有命名空间
ip netns list
输出:
ns1
ns2
步骤 2:创建虚拟以太网对(veth pair)
创建一对虚拟以太网设备 veth-a
和 veth-b
,用于连接两个命名空间。
# 创建 veth pair(veth-a 和 veth-b)
sudo ip link add veth-a type veth peer name veth-b
# 将设备分配到命名空间
sudo ip link set veth-a netns ns1 # veth-a 分配给 ns1
sudo ip link set veth-b netns ns2 # veth-b 分配给 ns2
步骤 3:配置 IP 地址并启用设备
为每个命名空间中的虚拟设备分配 IP 地址,并启用它们。
# 在 ns1 中配置 veth-a
sudo ip netns exec ns1 ip addr add 10.0.0.1/24 dev veth-a
sudo ip netns exec ns1 ip link set veth-a up
sudo ip netns exec ns1 ip link set lo up # 启用回环接口
# 在 ns2 中配置 veth-b
sudo ip netns exec ns2 ip addr add 10.0.0.2/24 dev veth-b
sudo ip netns exec ns2 ip link set veth-b up
sudo ip netns exec ns2 ip link set lo up
# 查看 ns1 的网络配置
sudo ip netns exec ns1 ip addr show veth-a
# 查看 ns2 的网络配置
sudo ip netns exec ns2 ip addr show veth-b
输出示例:
2: veth-a@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 12:34:56:78:9a:bc brd ff:ff:ff:ff:ff:ff link-netns ns2
inet 10.0.0.1/24 scope global veth-a
valid_lft forever preferred_lft forever
步骤 4:测试网络连通性
验证两个命名空间之间的通信能力。
# 从 ns1(Host A)ping ns2(Host B)
sudo ip netns exec ns1 ping -c 3 10.0.0.2
# 从 ns2(Host B)ping ns1(Host A)
sudo ip netns exec ns2 ping -c 3 10.0.0.1
成功输出:
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.047 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=0.036 ms
64 bytes from 10.0.0.2: icmp_seq=3 ttl=64 time=0.041 ms
步骤 5:验证网络隔离性
测试默认命名空间(宿主机)与 ns1
/ns2
的隔离性。
# 宿主机无法 ping 通 ns1 和 ns2
ping -c 3 10.0.0.1 # 失败
ping -c 3 10.0.0.2 # 失败
# ns1 和 ns2 也无法访问宿主机外部网络(如 8.8.8.8)
sudo ip netns exec ns1 ping -c 3 8.8.8.8 # 失败(除非配置路由/NAT)
步骤 6:清理环境
实验完成后,删除命名空间和虚拟设备。
sudo ip netns delete ns1
sudo ip netns delete ns2
sudo ip link delete veth-a # 如果设备未自动清理
sudo ip link delete veth-b # 如果设备未自动清理
应用场景
- 容器网络:Docker/Kubernetes 使用网络命名空间隔离容器的网络栈。
- 多租户测试:为不同租户分配独立命名空间,避免 IP/端口冲突。
- 安全沙箱:限制不可信应用仅能访问指定网络资源。
- 网络协议开发:在隔离环境中测试新协议或路由策略。
通过此案例,您已掌握网络命名空间的核心操作,并能够将其应用于实际网络隔离与通信场景。