linux網(wǎng)絡(luò)命名空間通過veth pair實(shí)現(xiàn)隔離與通信,管理步驟如下:1. 使用ip netns add/delete創(chuàng)建/刪除命名空間;2. 用ip link set啟用默認(rèn)lo接口;3. 創(chuàng)建veth pair并分配到命名空間;4. 分別配置兩端ip并啟用;5. 主機(jī)側(cè)開啟ip轉(zhuǎn)發(fā)和nat以實(shí)現(xiàn)跨命名空間通信;6. 可結(jié)合橋接設(shè)備統(tǒng)一管理多個(gè)命名空間路由;7. 利用ip netns exec執(zhí)行命名空間內(nèi)命令,通過nsenter調(diào)試進(jìn)程所在命名空間。
linux的網(wǎng)絡(luò)命名空間(Network Namespace)是實(shí)現(xiàn)網(wǎng)絡(luò)隔離的重要機(jī)制,尤其在容器技術(shù)中應(yīng)用廣泛。如果你需要為不同應(yīng)用或服務(wù)創(chuàng)建獨(dú)立的網(wǎng)絡(luò)環(huán)境,網(wǎng)絡(luò)命名空間是一個(gè)非常實(shí)用的工具。
下面從幾個(gè)常見使用場(chǎng)景出發(fā),講講怎么管理Linux網(wǎng)絡(luò)命名空間來配置隔離的網(wǎng)絡(luò)環(huán)境。
創(chuàng)建和刪除網(wǎng)絡(luò)命名空間
最基本的兩個(gè)操作就是創(chuàng)建和刪除命名空間。
- 使用 ip netns add 命令創(chuàng)建一個(gè)新的網(wǎng)絡(luò)命名空間:
ip netns add ns1
- 刪除一個(gè)不再使用的命名空間:
ip netns delete ns1
每個(gè)新創(chuàng)建的命名空間默認(rèn)只有一個(gè)本地回環(huán)接口(lo),但這個(gè)接口是down狀態(tài),你需要手動(dòng)啟用它:
ip netns exec ns1 ip link set lo up
命名空間的名字必須是唯一的,并且不能包含特殊字符。建議用有意義的名稱,比如對(duì)應(yīng)的服務(wù)名或用途。
配置命名空間中的網(wǎng)絡(luò)連接
創(chuàng)建好命名空間之后,下一步通常是讓它能與其他網(wǎng)絡(luò)通信。常用方式是通過veth pair(虛擬以太網(wǎng)設(shè)備對(duì))將命名空間連接到主機(jī)或其他命名空間。
步驟如下:
-
創(chuàng)建一對(duì)veth設(shè)備:
ip link add veth0 type veth peer name veth1
-
把其中一端放到命名空間里:
ip link set veth1 netns ns1
-
給兩端分別配置IP地址并啟用:
ip addr add 192.168.1.1/24 dev veth0 ip link set veth0 up ip netns exec ns1 ip addr add 192.168.1.2/24 dev veth1 ip netns exec ns1 ip link set veth1 up
這樣,主機(jī)上的veth0和命名空間內(nèi)的veth1就形成了點(diǎn)對(duì)點(diǎn)連接。你可以在這個(gè)基礎(chǔ)上進(jìn)一步配置路由、NAT或者橋接。
需要注意的是:veth pair的兩端必須有一端留在默認(rèn)命名空間(即主機(jī))才能作為對(duì)外連接的入口。
跨命名空間通信與路由設(shè)置
如果多個(gè)命名空間之間需要互相通信,可以通過中間命名空間做路由轉(zhuǎn)發(fā),也可以使用橋接設(shè)備統(tǒng)一管理。
舉個(gè)例子,假設(shè)ns1和ns2都要訪問外部網(wǎng)絡(luò),可以考慮:
- 創(chuàng)建一個(gè)bridge設(shè)備br0,把主機(jī)側(cè)的veth接口加入進(jìn)去
- 分別給ns1和ns2分配不同的子網(wǎng)IP
- 在主機(jī)上開啟IP轉(zhuǎn)發(fā),并設(shè)置NAT規(guī)則:
sysctl -w net.ipv4.ip_forward=1 iptables -t nat -A POSTROUTING -o br0 -j MASQUERADE
這種結(jié)構(gòu)適合模擬多租戶網(wǎng)絡(luò)或者搭建輕量級(jí)虛擬化測(cè)試環(huán)境。不過要注意防火墻規(guī)則和路由表的正確性,否則會(huì)出現(xiàn)“通不了”的問題。
另外,你可以在每個(gè)命名空間里運(yùn)行不同的服務(wù)監(jiān)聽不同端口,配合iptables還能做更細(xì)粒度的控制。
實(shí)際使用中的一些小技巧
-
查看所有命名空間列表:
ip netns list
-
執(zhí)行命令時(shí)記得加 ip netns exec [namespace],否則命令會(huì)作用在主機(jī)默認(rèn)網(wǎng)絡(luò)空間。
-
如果希望某個(gè)命名空間開機(jī)自動(dòng)啟動(dòng)并配置好網(wǎng)絡(luò),可以把相關(guān)命令寫進(jìn) /etc/network/interfaces 或者systemd服務(wù)文件中。
-
使用 nsenter 工具可以從進(jìn)程進(jìn)入其所在的命名空間,方便調(diào)試。
基本上就這些。網(wǎng)絡(luò)命名空間雖然功能強(qiáng)大,但操作起來并不復(fù)雜,關(guān)鍵是理解veth pair和路由的關(guān)系。只要把基礎(chǔ)拓?fù)涓闱宄耍竺鏀U(kuò)展起來就容易多了。