Arn*_*zel 5 kernel container namespace veth firejail
我正在寻找输入是否预期以下与网络命名空间到期相关的观察结果,或者应该报告为错误?
/proc/<pid>/net/dev它可以防止/延迟另一个进程的命名空间到期,直到它关闭此文件。这样做不需要成为该命名空间的一部分。这似乎是非常令人惊讶的行为。它允许本地用户访问适当的proc文件来延迟/防止网络命名空间的 veth 接口的破坏。一个有问题的监控工具打开文件/proc而不关闭它们也可能导致这种情况。
(在 Debian Buster - Linux 5.4.0-0.bpo.4-amd64 上)
1)创建网络命名空间:
$ unshare -n
$ echo $BASHPID
18807
Run Code Online (Sandbox Code Playgroud)
2)创建veth并将一端移动到上面创建的网络命名空间中
$ ip link add dev veth18807 type veth peer name eth18807
$ ip link set eth18807 netns 18807
$ ip addr | grep veth
14: veth18807@if13: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
Run Code Online (Sandbox Code Playgroud)
3)tail -f /proc/18807/net/dev在单独的终端中启动
$ tail -f /proc/18807/net/dev
...
tail: /proc/18807/net/dev: file truncated
...leave hanging...
Run Code Online (Sandbox Code Playgroud)
4)在1)中,退出命名空间,列出接口:
$ ip addr | grep veth
14: veth18807@if13: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
Run Code Online (Sandbox Code Playgroud)
之前创建veth的仍然存在。但是,在步骤 1) 中创建的网络命名空间没有明显的痕迹。lsns不显示它,没有进程在其/ns目录中,等等。
一旦tail -f中断,界面立即从 消失ip addr。它不需要是尾巴,只需打开它就open()足够了。
我怀疑从技术上讲这可能是有道理的,因为打开../net/dev可能会引用网络命名空间。只是令人惊讶的是,可以以这种方式保持命名空间的活动。
作为一种解决方法,veth在使用ip link del作品之前显式删除创建的。但是,我确实想知道这是否仍会保留命名空间。
触发此调查是因为 firejail 消息抱怨“已在使用”IP 地址。进入兔子洞后,最终似乎可以使用静态IP,如下所示:
1)开始监狱
$ /usr/local/bin/firejail --net=docker0 --ip=172.30.0.30 --noprofile
Parent pid 20890, child pid 20891
Interface MAC IP Mask Status
lo 127.0.0.1 255.0.0.0 UP
eth0 e2:87:2e:06:07:5b 172.30.0.30 255.255.0.0 UP
Default gateway 172.30.0.1
Child process initialized in 1491.22 ms
Run Code Online (Sandbox Code Playgroud)
2)在单独的终端打开net/dev孩子的:
$ tail -F /proc/20891/net/dev
Run Code Online (Sandbox Code Playgroud)
3)退出上面firejail并再次使用相同的参数重新启动。
$ /usr/local/bin/firejail --net=docker0 --ip=172.30.0.30 --noprofile
Error: IP address 172.30.0.30 is already in use
Run Code Online (Sandbox Code Playgroud)
上面的消息是因为 veth 继续响应firejailIP 的 ARP 检查。
我无法使用 docker 重现上述 Firejail 场景 - 容器停止后界面消失。也许Docker实际上实现了ip link del解决方法(?)。
在 linuxcontainers 上报告了类似的观察结果,并与内核错误有关。
这通常表明容器的网络命名空间从未过期,这通常表明内核存在问题。当最后一个使用网络命名空间的进程消失时,命名空间被销毁,这会导致所有虚拟接口被销毁,物理接口被移回主机网络命名空间。
| 归档时间: |
|
| 查看次数: |
310 次 |
| 最近记录: |