我有一台运行 Debian Linux (Buster) 的设备,该设备通过 VLAN 接口连接到邻居设备。邻居通过该 VLAN 接口向我的设备发送 ICMP 回显回复,但 Linux 设备未发送 ICMP 回显请求。Linux 设备是否可以通过一些内置的 Linux 配置设置从这些 ICMP 消息中了解邻居的 MAC 地址并在邻居表 ( ip -4 neigh show
) 中为它们创建条目(通过一些配置调整)?
编辑:邻居设备没有向 Linux 设备发送任何 ARP/GARP 数据包,并且我无法对其进行配置以执行此操作。
我在这里提供了缩写的ip addr show
输出,其中包含更多信息:
284: Ethernet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9100 qdisc pfifo_fast master Bridge state UP group default qlen 1000
link/ether 94:8e:d3:04:eb:28 brd ff:ff:ff:ff:ff:ff
inet6 fe80::968e:d3ff:fe04:eb28/64 scope link
valid_lft forever preferred_lft forever
279: Vlan1000@Bridge: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9100 qdisc noqueue state UP group default qlen 1000
link/ether 00:aa:bb:cc:dd:ee brd ff:ff:ff:ff:ff:ff
inet 192.168.0.1/21 brd 192.168.7.255 scope global Vlan1000
valid_lft forever preferred_lft forever
inet6 fc02:1000::1/64 scope global
valid_lft forever preferred_lft forever
inet6 fe80::2aa:bbff:fecc:ddee/64 scope link
valid_lft forever preferred_lft forever
ICMP 回显回复正在发送到Vlan1000
(目标 MAC 是 VLAN 的 MAC 地址)。tcpdump
显示Vlan1000
ICMP 回显回复,我能够看到邻居 MAC 作为目标 MAC。是否有某种方法可以自动了解 ARP 表中的邻居 MAC?
答案1
仅通过调整配置,您无法实现想要的效果。这里的问题是,只有当内核收到发送数据包的请求时,才会创建 arp 条目。在这种情况下,如果目标的 MAC 地址未知,内核将发送 ARP 请求并解析答案。
当包裹(除了对 ARP 请求的响应)到达时,不会添加任何 arp 条目,更不用说您的情况下的包裹实际上是垃圾,因为没有人请求它们。
您需要的更多是黑客技术,而不是常规操作。您需要编写一个程序来拦截发送的 ICMP 数据包,并以某种方式从中提取 MAC 地址,然后将其插入 ARP 表中。
“简单”的方法是监听 ICMP 回复包,提取 IP,然后尝试连接到该 IP。这样内核就会询问设备的 MAC 地址并将其插入到 ARP 表中。
如果设备拒绝发送 ARP 数据包(即使有 ARP 请求),那么解决方案就变得更加糟糕。在这种情况下,您需要监听原始数据包,自己提取标头,找到源 MAC,然后使用ioctl
(SIOCSARP) 调用将其插入 ARP 表中。