我在 CentOS 上的 ARP 表有问题。有时,当我创建 TAP 接口并将其添加到网桥时,ARP 表会被清除。
例如,当我执行此命令时:
sudo ip tuntap add dev tap-device-u98 mode tap; sudo ip link set dev tap-device-u98 master br0
ARP 表下降到只有几个条目。
当我这样做时也会发生这种情况:
sudo ip link set dev tap-device-u98 nomaster
ARP 表中的大多数条目都是永久性的,由自制的专用应用程序管理(满足我们的特定需求)。它们最多可以容纳 12k 条目,但数量无关紧要(大表(12k)和小表(10)一样)。
这发生在我们的大部分服务器上,从 CentOS6.2 到 CentOS7.8。
生产中出现的确切问题不是上述命令,而是 openvpn(创建 TAP 接口)和 brctl(将接口添加到网桥)。但这似乎无关紧要,因为问题也发生在“ip”上。带有“ip”命令的 PoC 在 CentOS 7.4.1708 上执行,内核为 3.10.0-693.2.2.el7.x86_64 #1 SMP Tue Sep 12 22:26:13 UTC 2017
/var/log/messages 没有多大帮助:
--- (Create interface and mount it on br0)
Nov 26 15:52:51 localhost NetworkManager[733]: <info> [1606402371.7604] manager: (tap-device-u98): new Tun device (/org/freedesktop/NetworkManager/Devices/2723)
Nov 26 15:52:51 localhost kernel: br0: port 7(tap-device-u98) entered blocking state
Nov 26 15:52:51 localhost kernel: br0: port 7(tap-device-u98) entered disabled state
Nov 26 15:52:51 localhost kernel: device tap-device-u98 entered promiscuous mode
--- (Remove interface from br0 and delete it)
Nov 26 15:52:51 localhost kernel: device tap-device-u98 left promiscuous mode
Nov 26 15:52:51 localhost kernel: br0: port 7(tap-device-u98) entered disabled state
Nov 26 15:52:51 localhost NetworkManager[733]: <info> [1606402371.8909] device (tap-device-u98): released from master device br0
关于可能出错的任何想法?
为了记录,我在这里发布答案。
由于网桥的 MAC 地址的计算方式,向/从它添加或删除接口可以触发 MAC 地址的重新计算(来自br_stp_if.c 的函数 br_stp_recalculate_bridge_id )。
因此,由于网桥没有固定的 MAC 地址,它可能会被重新生成,从而导致 ARP 丢弃。
要解决此问题,只需修复 MAC 地址,然后: