“/sys/class/net/eth0/iflink”如何在容器中拥有系统范围的信息

“/sys/class/net/eth0/iflink”如何在容器中拥有系统范围的信息

我正在寻找 tcpdump Kubernetes pod 的方法。每个 Pod 都会创建一个虚拟接口,很难知道哪个接口属于实际的 Pod。我找到了一种有助于识别系统范围接口索引的方法。基本上,可以cat /sys/class/net/eth0/iflink在目标 Pod 中运行的容器内部,并且它将显示主机网络接口索引。这样你就可以知道属于 pod 的 veth 了。

所以,它有效,但它让我思考......如果我应该位于容器中的网络命名空间中,为什么我可以在网络上获取系统范围的信息。因此,我不应该访问系统范围的索引,我应该只看到虚拟接口的虚拟“命名空间”索引。

有没有解释一下它/sys/class/net/eth0/iflink与 K8s 内的网络命名空间有何关系?

答案1

iflink值不是系统范围的值。它是对等网络 nsid 中​​有效的值,例如显示为 all ip link show dev eth0(因为它是veth与其他网络命名空间中的对等方的接口)。对于小细节,对等网络 nsid 不是系统范围的值,而是仅在当前的将(系统范围的)对等网络链接到此(系统范围的)网络名称空间的网络名称空间,因为有时会移动相关的接口。

这是一个示例,使用ip netns addand ip netns exec(它也正确(重新)挂载/sys在其自己的挂载命名空间中,以便能够使用 中的网络条目/sys)。

# ip netns add n1
# ip netns add n2
# ip netns add n3
# ip netns add n4

# ip -n n1 link add name ton2 index 42 type veth peer netns n2 name eth0
# ip -n n3 link add name ton4 index 42 type veth peer netns n4 name eth0


# ip netns exec n2 cat /sys/class/net/eth0/iflink
42
# ip -n n2 link show dev eth0
2: eth0@if42: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 0e:27:6f:19:05:02 brd ff:ff:ff:ff:ff:ff link-netns n1
# ip netns exec n4 cat /sys/class/net/eth0/iflink
42
# ip -n n4 link show dev eth0
2: eth0@if42: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether fe:09:53:11:84:d6 brd ff:ff:ff:ff:ff:ff link-netns n3

两个接口都有一个索引值为 42 的对等链路,但这并不代表同一个接口:一个值 42 是ton2netns n1 中的索引值,另一个是ton4netns n3 中的索引值。如果现代版本ip link没有将 link-nsid 解析为对ip netns add等命名空间指定的实际名称,它们都会显示如下link-netnsid 0(因为这是唯一的对等网络命名空间,并且 link-nsid 默认从 0 开始,除非设置否则,在每个网络命名空间中),同样 0 不是系统范围的。

# stat -f -c %T /run/netns/n1 /run/netns/n3
nsfs
nsfs
# stat -c %i /run/netns/n1 /run/netns/n3
4026533318
4026533590

对等点的实际系统范围值是网络命名空间 + 索引。这里是 4026533318:42 和 4026533590:42 。但是,如果不知道它是如何创建的(此处ip netns在 中留下了已安装的引用) ,那么当它恰好不是初始网络命名空间(如本示例中所示)时,简单地弄清楚该网络命名空间可能会非常具有挑战性/run/netns

有关此内容的更多信息,请参见这个答案我做了。

相关内容