我在 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
知道可能出现什么问题吗?
答案1
为了记录在案,我在这里发布答案。
由于桥接器 MAC 地址的计算方式,添加或删除接口可能会触发 MAC 地址的重新计算(功能br_stp_recalculate_bridge_id从br_stp_if.c)。
因此,由于网桥没有固定的 MAC 地址,它可能会被重新生成,从而导致 ARP 丢弃。
要解决此问题,只需修复 MAC 地址,然后:
sudo vim /etc/sysconfig/network-scripts/ifcfg-br0
[...]
MACADDR=xx:xx:xx:xx:xx:xx
sudo ifdown br0
sudo ifup br0