Linux 和 docker 中的 ifindex

问题来自于 ip 命令的一个官方文档的解释(http://www.policyrouting.org/...)。如下所示:

kuznet@alisa~:$ ip link ls dummy

2: dummy: <BROADCAST,NOARP> mtu 1500 qdisc noop

link/ether 000000000000 brd ffffffffffff

这里就不贴英文的原解释了。中文大致意思如下:

上述中数字 2 即 ifindex 为 2,唯一标识该网络接口。


我的问题场景如下

这时,我使用 docker 启动了一个容器为 test1。在我本机中,我使用 ip link show 命令查看到的部分内容如下:

4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default 
    link/ether 02:42:a0:25:e1:e1 brd ff:ff:ff:ff:ff:ff
87: veth8652f17@if86: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default 
    link/ether 6e:de:e1:98:24:a1 brd ff:ff:ff:ff:ff:ff

这里会显示一个 veth8652f17@if86。按照刚刚贴出的文档的链接解释,这里的 @ 符符号的意思为:

The interface name may also have another name or the keyword NONE appended after an "@" sign. This signifies that this device is bound to another device in a master/slave device relationship. Thus packets sent through this device are encapsulated and forwarded on via the master device.

而针对docker 的网络,大概的理解为 docker 启动一个容器,默认的网络为 bridge,即
docker0,并且会创建两个 veth 设备,连接到网桥上,一个在主机的网络命名空间中,就是上述的 veth8652f17@if86,其 ifindex87。而另一个 veth 设备成为容器 test1 中的 eth0,并且该设备的 ifindex86。并且此时我可以在 /var/log/sys/log 查看到一条日志如下:

eth0: renamed from veth3aa2be5

这时切换到容器 test 中,使用 ip link 命令如下所示:

root@djkb8e92667d:/# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
86: eth0@if87: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default 
    link/ether 02:42:c0:a8:00:02 brd ff:ff:ff:ff:ff:ff

这里显示的是 eth0@if87。针对刚刚的 veth8652f17@if86

我是不是可以简单的理解为容器中的 eth0@if87 网络接口的 ifindex 为 86,而这里的 @if87,表明其对应的 veth 设备为 ifindex 为 87 的设备,即刚刚的 veth8652f17@if86 。通过这样的方式来表明这两个接口是一对对应的 veth ?

对于这里的 eth0@if87 和刚刚的 veth8652f17@if86 为一对 veth 设备,并且 docker 通过其来实现与外部网络的通信与隔离。这一点很容易通过各种资料查找到相应的解释。

但是因为在容器中显示的是 eth0,而不是 veth3aa2be5。并且在主机的网络上也查看不到该 eth0@if87 的相关信息。。所以我该如何证明上述的结论?或者有什么办法能够让我在主机上查看到容器 test 的相关的网络信息?

阅读 5k
1 个回答
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题