1 dnsmasq iproute namespace hostapd
我想知道在哪里查找应用于自定义命名空间的更改。假设我有一个命名空间“ns1”,里面有虚拟接口“vpeer”和“lo”,我想通过 dnsmasq 或 hostapd 修改接口“vpeer”的配置,然后我知道我可以这样做,例如
$ ip netns exec ns1 bash
$ dnsmasq --interface=vpeer-ns1 --dhcp-range=192.168.0.100,192.168.0.200,255.255.255.0
Run Code Online (Sandbox Code Playgroud)
并且 netns 正在通过为我安装它并管理任何任务来完成其余的工作,我对此表示感谢。但是,在全局命名空间中,我可以监视在相应文件中所做的更改或直接将它们应用到文件中。例如在/etc/dnsmasq.conf或/etc/hostapd/hostapd.conf 中。
所以我的问题是,如何在某个 netns 命名空间中复制默认命名空间行为。我真的需要知道我已经做了什么以及“ns1”中接口的当前配置是什么。尤其是因为大多数教程都解释了这样的过程。该IP netns手册页说,配置文件位于
$ /etc/netns/ns1/
Run Code Online (Sandbox Code Playgroud)
但在创建命名空间“ns1”后,甚至目录 /etc/netns 都不存在。新命名空间仅在 /var/run/netns/ns1 中表示。该文件始终为空 - 即使在应用上述 dnsmasq 命令之后 - 并且 nano 显示为空文件,但在文件关闭后给我一些奇怪的错误说
ns1: Argument is invalid.
Run Code Online (Sandbox Code Playgroud)
所以我切换到命名空间“ns1”并再次尝试。结果一样。所以我关闭了新命名空间中的每个设备
$ ip netns exec ns1 ip link set dev lo down
$ ip netns exec ns1 ip link set dev vpeer down
Run Code Online (Sandbox Code Playgroud)
同样的结果。
那么如何访问与给定命名空间相关的配置文件,因为应用程序根本不知道非默认命名空间?先感谢您。
A.B*_*A.B 10
你有两个问题合二为一:
/var/run/netns/
?/etc/netns/
甚至不存在的?/var/run/netns/
?需要对命名空间有一些了解。我不能在这里详细解释。只要有东西在使用,命名空间一旦创建就足够了(对某些内核资源进行分区,例如网络和)。主要有两件事会使用它:进程或特殊伪文件系统中的挂载点nsfs
。一旦他们停止使用或消失,命名空间也会消失。
ip netns
(专门研究网络名称空间)选择通过挂载对网络名称空间的引用来保留网络名称空间。这些引用都可以/proc/<pid>/net/
作为符号链接使用。例子:
$ 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
Run Code Online (Sandbox Code Playgroud)
ip netns add
只需将它们绑定安装到/var/run/netns/<NAME>
. 请注意,虽然您通常在目录上绑定挂载目录,但您也可以在文件上绑定挂载文件。另请注意,此文件是文件nsfs
系统中的伪文件。它不是为阅读而设计的,也不可能是。它主要用于作为参考传递,通过打开(但不读取或写入)或安装它:
# 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]
Run Code Online (Sandbox Code Playgroud)
Sosleep 99
的网络命名空间是来自挂载点的命名空间/var/run/netns/ns1
。例如,使用这种方法,可以将网络命名空间与具有veth
接口的其他命名空间链接起来,并且不运行任何进程,因为不需要任何进程。
您可以手动删除通过ip netns
以下方式创建的命名空间:
# umount /var/run/netns/ns1
# rm /var/run/netns/ns1
# ip netns list
#
Run Code Online (Sandbox Code Playgroud)
当然,网络命名空间只会在最后一个使用它的引用(例如:进程)也消失时才会消失。如果之前的 sleep 命令仍在运行,您甚至可以将其放回原处:
# touch /var/run/netns/ns1
# mount --bind /proc/19620/ns/net /var/run/netns/ns1
# ip netns
ns1
Run Code Online (Sandbox Code Playgroud)
这可用于“复制”完整容器的网络命名空间部分,您只需要知道主机端的一些 pid(例如:lxc-info -Hp -n container
or docker inspect --format '{{.State.Pid}}' container
)并挂载其网络命名空间。方便运行容器内不可用的调试命令 ( tcpdump
...)。
上面的一切都是短暂的,例如它在重新启动后消失。
/etc/netns/
甚至不存在的?手册ip netns
页告诉(粗体强调我的):
对于知道网络命名空间的应用程序,约定是首先在
/etc/netns/
NAME/ 中查找全局网络配置文件, 然后在/etc/
. 例如,如果您想要/etc/resolv.conf
用于隔离您的 vpn 的网络命名空间的不同版本,您可以将其命名为/etc/netns/myvpn/resolv.conf
.
现在,dnsmasq
“知道”网络名称空间了吗?如果是(使用ip netns
的定义),它会以/etc/netns/
某种方式检查。在其联机帮助页中没有提到“netns” 。当前 Debian 的(类似于 Raspberry 的)源代码没有在netns
任何地方包含这个词:它不知道网络命名空间。
这就是为什么ip netns
联机帮助页的以下句子说明:
ip netns exec
能自动化处理这种配置,文件约定的网络命名空间不知道应用程序,通过创建一个命名空间安装和绑定安装所有的每个网络名称空间配置文件到其传统位置/etc
。
没有真正解释过,但是与上一句一起,这确实意味着ip netns exec
将绑定挂载,如果源和目标都存在,则/etc/netns/<NAME>/whatever
在/etc/whatever
. /etc/netns
以及内部选择的网络命名空间名称,其中将包含必须首先手动创建的配置,实际配置内容可能会复制到内部并进行编辑:ip netns exec
如果找到,将使用它们,但不会创建它们。
例子:
# 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
Run Code Online (Sandbox Code Playgroud)
后面真正发生的事情:
# 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
Run Code Online (Sandbox Code Playgroud)
当然,这对于里面的目录/etc/netns/ns1
而不是文件也是一样的:整个目录将直接出现在/etc/
屏蔽同名主机的目录中,只有当它存在时。
所以,如果的dnsmasq的默认配置除非特别指出是/etc/dnsmasq.conf
,您可以创建一个备用配置ns1
作为/etc/netns/ns1/dnsmasq.conf
和ip netns exec
将使它看起来/etc/dnsmasq.conf
到dnsmasq
,如果已经存在也是一个/etc/dnsmasq.conf
文件,即使它是空的。因为它在/etc
这不是短暂的,并且在您重新创建相同的网络 namspace 名称时将被重用。与hostapd
整个/etc/hostapd/
目录相同,可以复制为/etc/netns/ns1/hostapd/
它的文件,然后在里面修改。小心指向外部的符号链接。您现在可以像往常一样在里面运行命令ip netns exec ns1
:它们将使用新的配置文件。
归档时间: |
|
查看次数: |
2596 次 |
最近记录: |