如何以非特權使用者身份將介面移動到非標準網路命名空間
我有一個 Linux 網路命名空間綁定安裝在
~/mynamespace
如下位置:unshare -mrn; touch ~/mynamespace; # executed in the console opened by the first command unshare --net=~/mynamespace true; # executed in the console opened by the first command
如何將介面從命令 #1 創建的匿名網路命名空間移動到安裝在的命名空間綁定中
~/mynamespace
?請注意,
/var/run/netns
在我的情況下,綁定安裝內部命名空間或其副本不是一個選項,甚至暫時也不是。我認為ip ... netns
相關命令將只接受綁定安裝在更標準/var/run/netns/
目錄中的網路命名空間。所以我認為該ip
命令在這種情況下不起作用。另請注意,以上所有命令均以非特權使用者身份在沒有 root 的情況下執行。
unshare -mrn # which implies -U
除非另有說明,否則下面的所有其他內容都是從上面輸入的命名空間執行的。
不使用
ip netns
touch $HOME/mynamespace unshare --net=$HOME/mynamespace true
到此
true
結束,失去了任何 PID 引用,但保留了一個掛載引用,允許該命名空間仍然存在。該
ip link set ... netns
命令可以使用掛載點或程序 ID 作為參考:netns NETNSNAME | PID
將設備移動到與名稱 NETNSNAME或程序PID關聯的網路命名空間。
ip link add veth0 type veth peer name veth1
在不使用的情況
ip netns
下,我們仍然可以使用臨時sleep
命令創建 PID,以使用該命令獲取 PID 引用ip link
並使用它:nsenter --net=$HOME/mynamespace sleep 99 & pid=$! ip link set veth1 netns $pid
得到:
# ip -br link lo DOWN 00:00:00:00:00:00 <LOOPBACK> veth0@if2 DOWN 86:c2:bc:ba:1a:01 <BROADCAST,MULTICAST> # nsenter --net=$HOME/mynamespace ip -br link lo DOWN 00:00:00:00:00:00 <LOOPBACK> veth1@if3 DOWN 86:e3:a1:ce:48:4e <BROADCAST,MULTICAST>
使用
ip netns
ip netns
需要使用共享掛載/run/netns
才能工作,或者如果尚未掛載(第一次使用時發生)將創建並掛載一個。如果它檢測到一個已經掛載,它不會創建它,並且稍後會失敗(Cannot create namespace file "/run/netns/foo": Permission denied
),因為它屬於真正的初始使用者命名空間根,因此無法寫入。如果沒有創建它就無法創建它,因為它不能寫入/run
屬於真正初始使用者命名空間根的哪個。等等,在所有各種情況下,ip netns
從沒有權限的使用者命名空間執行時都會失敗。只需在前一個上手動安裝一個,所以
ip netns
會很高興:
- 如果存在並且出於某種原因
/run/netns
想要保持目前狀態:/run
mount -t tmpfs --make-rshared tmpfs /run/netns
- 如果
/run/netns
甚至不存在,或者即使它存在,也可以覆蓋整個/run
:無法在目前創建目錄,
/run
因此它也必須被掛載,失去對其他一些有用資訊的訪問權限,但可以訪問其他失敗的工具(就像iptables-legacy -w
否則會告訴的那樣Fatal: can't open lock file /run/xtables.lock: Permission denied
)。mount -t tmpfs tmpfs /run
現在每個標准
ip netns
或ip link
命令ip -n foo ...
都將在使用者命名空間中照常工作:ip netns add mynamespace ip link add name veth0 type veth peer netns mynamespace name veth1
得到:
# ip -br link lo DOWN 00:00:00:00:00:00 <LOOPBACK> veth0@if2 DOWN 2a:98:7f:83:bf:9e <BROADCAST,MULTICAST> # ip -n mynamespace -br link lo DOWN 00:00:00:00:00:00 <LOOPBACK> veth1@if2 DOWN 96:3c:5e:a6:a4:4a <BROADCAST,MULTICAST>