命名空間——網絡(net)
一、網絡命名空間:每個都是獨立的“網絡房間”
想象你的電腦是一棟大樓,每個網絡命名空間就是大樓里的一個“獨立房間”:
- 每個房間里有自己的“網線接口”(網卡)、“門牌號”(IP 地址)、“導航地圖”(路由表);
- 房間之間的網絡互不干擾:你在 A 房間插網線、設 IP,B 房間完全看不到;
- 要讓兩個房間通信,必須用“特殊的線”(比如虛擬網線)連接它們。
二、一步步理解材料中的操作
1. 創建網絡命名空間:建一個“新房間”
材料中用兩種方式創建網絡命名空間:
sudo unshare -n
:創建一個臨時的網絡命名空間(退出后自動銷毀);sudo ip netns add mynet
:創建一個“持久化”的網絡命名空間(名字叫mynet
),即使里面沒有進程運行也不會消失(相當于給房間掛了個牌子,不會被輕易拆掉)。
查看已有的命名空間:
sudo ip netns list # 會顯示剛才創建的 mynet
2. 進入命名空間操作:“走進房間”
要操作 mynet
這個“房間”里的網絡,需要用 ip netns exec
命令“進入房間”:
sudo ip netns exec mynet [命令] # 表示在 mynet 命名空間中執行某個命令
比如,查看 mynet
里的網卡:
sudo ip netns exec mynet ip link show
此時會看到一個叫 lo
的網卡(環回接口),這是每個網絡命名空間默認自帶的“內部回環接口”(相當于房間里的“內部電話”,用于進程自己跟自己通信)。
3. 啟用環回接口:“接通內部電話”
默認情況下,lo
接口是關閉的(就像內部電話沒插線),需要手動打開:
sudo ip netns exec mynet ip link set dev lo up
打開后,命名空間內的程序可以通過 127.0.0.1
訪問自己(比如本地服務)。
4. 創建 veth 對:拉一根“虛擬網線”
現在 mynet
這個房間是完全孤立的,和主機(默認命名空間)沒有連接。怎么讓它們通信?需要一根“虛擬網線”——veth 對(虛擬以太網接口對)。
veth 對是一對“捆綁在一起的虛擬網卡”:就像一根網線的兩端,一端插在主機(默認命名空間),另一端插在 mynet
房間,這樣兩邊就能傳數據了。
創建 veth 對:
sudo ip link add veth0 type veth peer name veth1
- 這會創建兩個虛擬網卡:
veth0
和veth1
,它們是“一對”——veth0
收到的數據會自動傳給veth1
,反之亦然。
5. 連接命名空間:把網線“插進房間”
現在 veth0
和 veth1
都在主機的默認命名空間里,我們需要把 veth1
移到 mynet
房間:
sudo ip link set veth1 netns mynet
此時:
- 主機(默認命名空間)里只剩
veth0
; mynet
房間里多了veth1
(相當于網線一端插進了房間)。
6. 配置 IP 地址:給“網線接口”分配門牌號
有了網線,還需要給兩端的接口分配 IP 地址(門牌號)才能通信:
-
給
mynet
房間里的veth1
分配 IP:172.2.0.1/24
sudo ip netns exec mynet ip addr add 172.2.0.1/24 dev veth1 sudo ip netns exec mynet ip link set dev veth1 up # 啟用這個接口
-
給主機的
veth0
分配 IP:172.2.0.2/24
sudo ip addr add 172.2.0.2/24 dev veth0 sudo ip link set dev veth0 up # 啟用這個接口
7. 測試通信:兩個“房間”能通話了
現在主機和 mynet
房間通過 veth 對連接,應該能互相 ping 通:
-
主機 ping
mynet
里的veth1
(IP:172.2.0.1):ping -c1 172.2.0.1 # 成功收到回復
-
mynet
房間 ping 主機的veth0
(IP:172.2.0.2):sudo ip netns exec mynet ping -c1 172.2.0.2 # 成功收到回復
8. 為什么訪問不了互聯網?
此時 mynet
房間只能和主機通信,但不能上互聯網(比如 ping 百度)。原因是:
mynet
房間的“導航地圖”(路由表)里,沒有“如何走到互聯網”的路線。
要解決這個問題,需要:
- 在主機上創建一個“網橋”(相當于路由器),連接主機的物理網卡(能上互聯網)和
veth0
; - 在
mynet
房間里設置“默認路由”:告訴房間里的設備“上網請找主機的veth0
(172.2.0.2)”; - 主機開啟 NAT 轉發(相當于路由器的“地址轉換”功能),讓
mynet
的流量能通過主機的網卡訪問互聯網。
三、總結:網絡命名空間的核心
- 每個網絡命名空間是一個“獨立的網絡環境”,有自己的網卡、IP、路由;
- veth 對是連接不同命名空間的“虛擬網線”,讓隔離的網絡能通信;
- 容器(如 Docker)的網絡隔離就是用網絡命名空間實現的:每個容器一個獨立的網絡命名空間,通過 veth 對和主機/其他容器通信。
簡單說,網絡命名空間讓進程“生活在不同的網絡世界里”,彼此獨立又能通過“虛擬設備”按需連接。