Linux

如何以非特權使用者身份將介面移動到非標準網路命名空間

  • August 8, 2021

我有一個 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 netnsip 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> 

引用自:https://unix.stackexchange.com/questions/663793