如何以非特权用户身份将接口移至非标准网络命名空间

如何以非特权用户身份将接口移至非标准网络命名空间

我有一个 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 的情况下运行。

答案1

unshare -mrn # which implies -U

除非另有说明,否则下面的所有内容都从上面输入的命名空间运行。


不使用ip netns

touch $HOME/mynamespace
unshare --net=$HOME/mynamespace true

到此true结束,丢失了任何 PID 引用,但保留了挂载引用,允许该命名空间仍然存在。

ip link set ... netns命令可以获取挂载点或者进程 id 作为参考:

网络网络名称|PID

将设备移动到与名称 NETNSNAME 关联的网络命名空间或过程PID

ip link add veth0 type veth peer name veth1

在不使用的情况下,ip netns我们仍然可以使用临时命令创建 PID,sleep以使用该命令获取 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
    
  • if/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> 

相关内容