如何获取网桥中 veth 的 ip 地址?

如何获取网桥中 veth 的 ip 地址?

在我的环境中,桥上有三个 veth:

$ brctl show virbr1
bridge name     bridge id               STP enabled     interfaces
virbr1          8000.52540071337a       yes             eth1
                                                        virbr1-nic
                                                        vnet1

我可以得到它们的 mac 地址:

$ brctl showmacs virbr1          
port no mac addr                is local?       ageing timer
  3     52:54:00:25:7a:ab       yes                0.00
  3     52:54:00:25:7a:ab       yes                0.00
  3     52:54:00:99:67:68       no                 9.15
  2     52:54:00:99:d8:05       no                 8.48
  2     fe:54:00:99:d8:05       yes                0.00
  2     fe:54:00:99:d8:05       yes                0.00

但是我如何才能获得网桥中那些 veth 的 IP 地址呢?目前,我可以通过 获得 IP 地址arp;还有其他方法可以获取更多详细信息吗?

~$ sudo arp
Address                  HWtype  HWaddress           Flags Mask            Iface
192.168.252.246          ether   52:54:00:99:d8:05   C                     virbr1
192.168.252.254          ether   52:54:00:99:67:68   C                     virbr1
192.168.252.83           ether   52:54:00:99:d8:05   C                     virbr1
...

答案1

该地址不属于您的网桥或 veth。(网桥成员没有 IP 地址,甚至没有 MAC 地址;网桥的 IP 或 MAC 地址用于一切。)

这是主持人在另一端“veth”对(虚拟以太网电缆的另一端)实际上具有您在 ARP 缓存中看到的 IP 地址,或您在桥接缓存中看到的 MAC 地址。

因此,由于地址不属于本地接口,而是属于虚拟电缆“另一端”的完全独立的主机,因此没有本地可用的 API 来获取更多详细信息。您的网桥了解任何事情的唯一方法是从它从其他主机收到的数据包中学习。

尽管由于 veth 本质上是本地的(“另一端”是同一台机器上的容器),您可以作弊并直接从其他网络命名空间查找信息:

  1. 运行ip -d link ls vnet1以查找接口的“link-netnsid”(即对等 veth 的 netnsid)。看来它是不总是已分配,但就我而言它似乎存在。
  2. 运行sudo lsns -t net列出网络命名空间及其 ID,以及属于该命名空间的进程;查找具有匹配 netnsid 的进程。
  3. 运行nsenter --net -t <PID> ip addr以列出该命名空间内可见的地址。

如果您已经知道给定的 veth 属于哪个容器,则可以通过另一种方式找到它的 PID,例如从容器管理器(任何进程都可以,不一定是“init”进程)并跳至步骤 3。

相关内容