在我的环境中,桥上有三个 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 本质上是本地的(“另一端”是同一台机器上的容器),您可以作弊并直接从其他网络命名空间查找信息:
- 运行
ip -d link ls vnet1
以查找接口的“link-netnsid”(即对等 veth 的 netnsid)。看来它是不总是已分配,但就我而言它似乎存在。 - 运行
sudo lsns -t net
列出网络命名空间及其 ID,以及属于该命名空间的进程;查找具有匹配 netnsid 的进程。 - 运行
nsenter --net -t <PID> ip addr
以列出该命名空间内可见的地址。
如果您已经知道给定的 veth 属于哪个容器,则可以通过另一种方式找到它的 PID,例如从容器管理器(任何进程都可以,不一定是“init”进程)并跳至步骤 3。