我有一个运行 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)。他们有可能改变了什么吗?
当您说您收到错误接口的 ARP 响应时,您实际上是在转储流量还是只是查看生成的 ARP 表?您可能会收到两个接口的 ARP 回复...
无论如何,我相信你的问题的答案在于正确操纵rp_filter和arp_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/