我需要明确地并且没有“整体”猜测地在另一个网络命名空间中找到veth 端的对等网络接口。
尽管有很多文档并且在 SO 上的回答也假设网络接口的 ifindex 索引在每个主机的网络命名空间中是全局唯一的,但这在许多情况下并不成立:ifindex/iflink
是模棱两可的。甚至环回已经显示出相反的情况,在任何网络命名空间中都有一个 ifindex 为 1。此外,根据容器环境,ifindex
数字会在不同的命名空间中重用。这使得跟踪 veth 布线成为一场噩梦,特别是有很多容器和一个带有 veth peers 的主机桥都以@if3 左右结尾......
link-netnsid
是0
启动一个 Docker 容器实例,只是为了获得一个新的 veth
从主机网络命名空间连接到新容器网络命名空间对......
$ sudo docker run -it debian /bin/bash
现在,在主机网络命名空间中列出网络接口(我已经省略了对这个问题不感兴趣的那些接口):
$ ip链接显示 1: lo: mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 链接/环回 00:00:00:00:00:00 brd 00:00:00:00:00:00 ... 4: docker0: mtu 1500 qdisc noqueue state UP mode DEFAULT group default 链接/以太 …
Linux 网络接口名称中允许的字符范围是多少?我四处搜索,但没有找到任何定义或说明。是否允许大写字符?大写字母和小写字母有区别吗?
网络命名空间(7)的 Linux 手册页说:
网络命名空间提供与网络相关的系统资源的隔离:[...]、/sys/class/net 目录、[...]。
但是,简单地切换到不同的网络命名空间似乎不会改变/sys/class/net
(有关如何重现,请参见下文)的内容。我只是误以为setns()
进入网络命名空间已经足够了吗?是否总是需要重新挂载/sys
才能正确/sys/class/net
匹配当前加入的网络命名空间?还是我在这里错过了其他东西?
拿一个*ubuntu系统,找到rtkit-daemon的PID,进入daemon的网络命名空间,显示它的网络接口,然后检查/sys/class/net
:
$ PID=`sudo lsns -t net -n -o PID,COMMAND | grep rtkit-daemon | cut -d ' ' -f 2`
$ sudo nsenter -t $PID -n
# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
# ls /sys/class/net
docker0 enp3s0 lo lxcbr0 ...
Run Code Online (Sandbox Code Playgroud)
请注意,虽然ip link show …