ARP 回复包含错误的 MAC 地址

Jay*_*yen 15 linux arp bridge

我有一个运行 linux 的机器人,带有有线和无线适配器。当我启动时,它连接到无线网络正常。当我为有线(静态或使用 DHCP)分配 IP 时,它看起来可以正常工作。如,ifconfig显示正确的 IP 并route显示正确的路由。但是,当我对有线 IP 进行 ARP 请求时,ARP 回复包含无线 MAC。

???机器人上没有桥接器,为什么我没有有线MAC???

断线时,有线IP回复ping...

为什么机器人通过无线接口回复有线 IP 请求???

编辑:同一 IP 子网上的有线和无线适配器。我从同一 IP 子网上的一台计算机(用不同的计算机尝试过)发出 ARP 请求。

相关的 ifconfig 输出:

eth0      Link encap:Ethernet  HWaddr 00:01:C0:04:BD:F7  
          inet addr:192.168.0.110  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
ra0       Link encap:Ethernet  HWaddr 24:3C:20:06:3E:6D  
          inet addr:192.168.0.101  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:59 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:31023598 (29.5 MiB)  TX bytes:85640627 (81.6 MiB)
Run Code Online (Sandbox Code Playgroud)

相关路由输出:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 ra0
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
Run Code Online (Sandbox Code Playgroud)

这是一个非常精简的 linux,所以我没有像 artptables、iptables、sysctl、brctl 等工具。

编辑:按要求图表

网络图

编辑:我正在转储流量并查看 ARP 表。192.168.0.110 的 ARP 请求返回包含 24:3C:20:06:3E:6D 的 ARP 回复。ARP回复包的源MAC也是24:3C:20:06:3E:6D。我试过摆弄 _filter、_ignore 和 _announce,正如这里提到的,但无济于事。

编辑:设置网关(在任一接口上)没有区别(因为它不应该)。

编辑:这在以前版本的操作系统上运行良好(基于 openembedded)。他们有可能改变了什么吗?

sci*_*rus 12

当您在同一网络上有两个接口时,您看到的是正常行为。这篇 LWN 文章对此进行了描述。


Ins*_*yte 4

当您说您收到错误接口的 ARP 响应时,您实际上是在转储流量还是只是查看生成的 ARP 表?您可能会收到两个接口的 ARP 回复...

无论如何,我相信你的问题的答案在于正确操纵rp_filterarp_filter。下面包含了它们各自的文档。

我建议首先尝试这个:

echo 1 > /proc/sys/net/ipv4/conf/all/arp_filter
Run Code Online (Sandbox Code Playgroud)

可能还需要进行此更改:

echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
Run Code Online (Sandbox Code Playgroud)
rp_filter - 布尔值
    1 - 按 RFC1812 中指定的反向路径进行源验证
        单宿主主机和存根网络的推荐选项
        路由器。可能会导致复杂的麻烦(不是无循环)
        运行缓慢且不可靠的协议(类似于 RIP)的网络,
        或使用静态路由。

    0 - 没有源验证。

    conf/all/rp_filter 还必须设置为 TRUE 才能进行源验证
    在界面上

    默认值为 0。请注意,某些发行版启用它
    在启动脚本中。

arp_filter - 布尔值
    1 - 允许您在同一网络接口上拥有多个网络接口
    子网,并应答每个接口的 ARP
    基于内核是否将从以下位置路由数据包
    ARP 的 IP 出该接口(因此您必须使用源
    基于路由的工作)。换句话说,它允许控制
    其中的卡(通常是 1 个)将响应 arp 请求。

    0 - (默认)内核可以用地址响应 arp 请求
    从其他接口。这可能看起来是错误的,但它通常会使
    有意义,因为它增加了成功沟通的机会。
    IP 地址由 Linux 上的整个主机拥有,而不是由
    特定的接口。仅适用于更复杂的设置,例如加载
    平衡,这种行为会导致问题吗?

    如果至少满足以下条件之一,则将启用接口的 arp_filter
    conf/{all,interface}/arp_filter 设置为 TRUE,
    否则它将被禁用

如需更彻底的治疗,请参阅这篇文章:

http://www.embedded-bits.co.uk/tag/rp_filter/