首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ip网命名空间管理(iproute2)

ip网命名空间管理(iproute2)
EN

Unix & Linux用户
提问于 2018-09-24 15:51:53
回答 1查看 4K关注 0票数 1

我想知道在哪里查找应用于自定义命名空间的更改。假设我有一个名称空间"ns1“,里面有虚拟接口"vpeer”和"lo“,我想通过dnsmasq或hostapd修改接口"vpeer”的配置,然后我知道我可以用以下方法进行修改。

代码语言:javascript
复制
$ ip netns exec ns1 bash
$ dnsmasq --interface=vpeer-ns1 --dhcp-range=192.168.0.100,192.168.0.200,255.255.255.0

而netns通过为我安装并管理任何任务来完成剩下的工作,这是我所感激的。但是,在全局命名空间中,我可以监视相应文件中所做的更改,或者将它们直接应用于文件中。例如,在/etc/dnsmasq.conf/etc/hostapd/hostapd.conf中。

因此,我的问题是,如何在某个netns命名空间中复制默认的命名空间行为。我真的需要知道我已经做了什么,以及"ns1“中接口的当前配置是什么。尤其是因为大多数教程都解释了这样的过程。ip网手册页表示配置文件位于

代码语言:javascript
复制
$ /etc/netns/ns1/

但是在创建名称空间"ns1“之后,即使是目录/etc/netns也不存在。新的命名空间仅在/var/run/netns/ns1中表示。这个文件始终是空的,即使在像上面那样应用dnsmasq命令之后,nano也会出现在空文件中,但是当文件被关闭时,它会给我一些奇怪的错误。

代码语言:javascript
复制
ns1: Argument is invalid.

所以我切换到命名空间"ns1“,然后再试一次。同样的结果。所以我把新命名空间中的每一个设备都关闭了

代码语言:javascript
复制
$ ip netns exec ns1 ip link set dev lo down
$ ip netns exec ns1 ip link set dev vpeer down

同样的结果。

那么,对于给定的命名空间,我如何访问文件,因为afaik应用程序根本不知道非默认名称空间?提前谢谢你。

EN

回答 1

Unix & Linux用户

发布于 2018-09-25 01:24:27

你有两个问题在一个:

  • /var/run/netns/中的空文件是什么?
  • 如何使用根本不存在的/etc/netns/

/var/run/netns/中的空文件是什么?

需要对命名空间有一定的了解。我无法在这里详细解释。只需说一个名称空间一旦创建就会存在(分割一些内核资源,比如网络,和),只要有东西在使用它。主要有两种情况:进程,或特殊伪文件系统nsfs中的挂载点。一旦它们停止使用或消失,名称空间也会消失。

ip netns (专门研究网络名称空间)通过挂载对它们的引用来选择保留网络名称空间。这些引用在/proc//net/中都是可以作为符号链接雪崩的。示例:

代码语言:javascript
复制
$ ls -l /proc/$/ns/net
lrwxrwxrwx. 1 user user 0 Sep 25 01:05 /proc/19120/ns/net -> net:[4026531992]
$ stat -L -f -c %T /proc/19120/ns/net # filesystem type. "df" on this would be confused and point to the wrong mountpoint anyway.
nsfs
$ stat -L -c %i /proc/19120/ns/net # inode
4026531992

ip netns add只是绑定--将它们安装在/var/run/netns/中。注意,虽然通常在目录上绑定挂载目录,但也可以将文件绑定到文件上。还请注意,该文件是nsfs文件系统中的伪文件。它不是为阅读而设计的,也不可能。它通常通过打开(但不是读或写)或挂载来传递,作为参考:

代码语言:javascript
复制
# strace -e unshare,mount  ip netns add ns1
mount("", "/var/run/netns", 0x5625f6ca80e3, MS_REC|MS_SHARED, NULL) = 0
unshare(CLONE_NEWNET)                   = 0
mount("/proc/self/ns/net", "/var/run/netns/ns1", 0x5625f6ca80e3, MS_BIND, NULL) = 0
+++ exited with 0 +++
# ip netns list
ns1
# ls -l /var/run/netns/ns1
-r--r--r--. 1 root root 0 Sep 25 01:08 /var/run/netns/ns1
# cat /var/run/netns/ns1
cat: /var/run/netns/ns1: Invalid argument
# stat -f -c %T /var/run/netns/ns1
nsfs
# stat -c %i /var/run/netns/ns1
4026532824
# ip netns exec ns1 sleep 99 &
[1] 19620
# ls -l /proc/19620/ns/net
lrwxrwxrwx. 1 root root 0 Sep 25 01:23 /proc/19620/ns/net -> net:[4026532824]

因此,sleep 99的S网络名称空间是来自挂载点/var/run/netns/ns1的名称空间。例如,使用这种方法,就有可能拥有一个具有桥接器的网络名称空间,该名称空间具有veth接口,并且不运行任何进程,因为不需要任何进程。

您可以使用以下方法手动删除ip netns创建的命名空间:

代码语言:javascript
复制
# umount /var/run/netns/ns1 
# rm /var/run/netns/ns1
# ip netns list
#

当然,网络名称空间只有在最后一次使用它的引用(例如: process)也将消失之后才会真正消失。如果前面的睡眠命令仍在运行,甚至可以将其放回:

代码语言:javascript
复制
# touch /var/run/netns/ns1
# mount --bind /proc/19620/ns/net /var/run/netns/ns1
# ip netns
ns1

这可以用来“复制”整个容器的网络名称空间的部分,您只需要知道主机端的一些pid (例如:lxc-info -Hp -n containerdocker inspect --format '{{.State.Pid}}' container)并挂载它的网络命名空间。方便地运行容器中不可用的调试命令(tcpdump .)。

上面的一切都是短暂的(如重新启动后消失的)。

如何使用根本不存在的/etc/netns/

ip netns命令页告诉(粗体强调的是我的):

知道网络名称空间的For应用程序,其约定是先以/etc/netns/名称/然后在/etc/中查找全局网络配置文件。例如,如果您希望为用于隔离vpn的网络命名空间提供不同版本的/etc/resolv.conf,则可以将其命名为/etc/netns/myvpn/resolv.conf

现在,dnsmasq是否“知道”网络名称空间?如果是的话(用ip netns的S定义),它会以某种方式检查/etc/netns/它的命令中没有提到"netns“。目前的Debian(类似于Raspberry的)源代码中没有netns这个词:它不知道网络名称空间。

这就是为什么ip netns手册的下面这句话告诉我们:

ip netns exec通过创建挂载命名空间并绑定将每个网络名称空间配置文件绑定到它们在/etc中的传统位置,从而自动处理此配置文件、文件约定<#>for网络命名空间未知应用程序

这一点并没有得到真正的解释,但再加上前一句,这实际上意味着如果源和目标都存在,ip netns exec将绑定到/etc/whatever上的/etc/netns//whatever/etc/netns和所选的网络命名空间名称(其中将包含配置)必须首先手动创建,实际的配置内容可能在内部复制和编辑:如果找到,ip netns exec将使用它们,而不是创建它们。

示例:

代码语言:javascript
复制
# mkdir -p /etc/netns/ns1
# echo something > /etc/netns/ns1/whatever
# : > /etc/whatever
# ip netns add ns1
# cat /etc/whatever
# ip netns exec ns1 cat /etc/whatever
something

背后到底发生了什么:

代码语言:javascript
复制
# strace -e open,unshare,setns,mount,umount2 ip netns exec ns1 cat /etc/whatever 2>&1 |egrep '^(open.*/etc/netns|unshare|setns|mount|umount|something)'
setns(5, CLONE_NEWNET)                  = 0
unshare(CLONE_NEWNS)                    = 0
mount("", "/", 0x55947eb550e3, MS_REC|MS_SLAVE, NULL) = 0
umount2("/sys", MNT_DETACH)             = 0
mount("ns1", "/sys", "sysfs", 0, NULL)  = 0
open("/etc/netns/ns1", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 5
mount("/etc/netns/ns1/whatever", "/etc/whatever", 0x55947eb550e3, MS_BIND, NULL) = 0
something

当然,这对于/etc/netns/ns1中的目录也是一样的,而不是文件:整个目录将直接出现在/etc/中,只有在存在的情况下,才能屏蔽主机的同名目录。

因此,如果dnsmasq的默认配置(除非被告知是/etc/dnsmasq.conf ),您可以为ns1创建一个备用配置,因为/etc/netns/ns1/dnsmasq.confip netns exec将使其显示为/etc/dnsmasq.conf to dnsmasq,即使该文件是空的,也可以将其显示为D62toD63。因为它是在/etc中,所以这不是昙花一现,只要您重新创建相同的网络名称,就会重用它。对于hostapd和整个/etc/hostapd/目录也是如此,该目录可以复制为/etc/netns/ns1/hostapd/及其文件,然后在其中进行修改。要注意外部的符号链接。现在您可以在ip netns exec ns1中像往常一样运行这些命令:它们将使用新的配置文件。

票数 12
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/471122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档