場景描述
假設我們需要在同一臺物理機上模擬兩臺獨立的主機(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 1000link/ether 12:34:56:78:9a:bc brd ff:ff:ff:ff:ff:ff link-netns ns2inet 10.0.0.1/24 scope global veth-avalid_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/端口沖突。
- 安全沙箱:限制不可信應用僅能訪問指定網絡資源。
- 網絡協議開發:在隔離環境中測試新協議或路由策略。
通過此案例,您已掌握網絡命名空間的核心操作,并能夠將其應用于實際網絡隔離與通信場景。