ARP回复包含错误的MAC地址


14

我有一个运行带有有线和无线适配器的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)

相关路线输出:

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

这是一个非常精简的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摆弄,提到这里,但无济于事。

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

编辑:这在OS的早期版本(基于openembedded)上运行良好。他们有可能改变了什么吗?


5
也许图表很酷,并且您可以在其中放一个机器人...额外
— 的好处

有线和无线适配器都在同一IP子网中吗?您从哪里“发出ARP请求”?包含“ ifconfig”的结果并显示路由表可能会有所帮助。
— 戴夫

这个解决了吗?我看到了类似的问题,并且完全找不到解决方法。
— 柯克,

1
我相信无线网卡的内核模块坏了。
— Jayen

1
问题是为什么要这么做...我猜您想要它,以便当机器人移动时它可以说话,但是当您插入以太网电缆时,您可以获得很高的传输速度吗?如果是这样,您是否考虑过将有线和无线接口绑定在一起,将它们都放在同一个IP上,然后进行配置,以便在有线连接正常时获得优先权,但如果流量不是通过无线来的呢?我曾经以这种方式设置笔记本电脑,并且效果很好,但是现在我拥有300Mbps的无线网络,而不是2Mbps的无线网络,所以我不再这样做了。
— 肖恩·赖夫施耐德

Answers:


12

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


设置arp_filter无效。为什么不?
— Jayen

1
由于两个接口都有到本地网络的路由,因此linux将从两个接口中的任何一个IP发送数据包。因此,它将从两个接口回答针对您的IP的ARP请求。要更改此设置,您不仅必须将arp_filter设置为1,还必须启用基于源的路由并设置路由表,以确保每个IP的流量都流出所需的接口。与您的情况稍有不同,但是wlug.org.nz/SourceBasedRouting可能会为您提供帮助。
— sciurus

4

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

无论如何,我相信您问题的答案在于正确地操作rp_filter和arp_filter。每个文档都包含在下面。

我建议先尝试一下:

echo 1 > /proc/sys/net/ipv4/conf/all/arp_filter

您可能还需要进行此更改:

echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
rp_filter-BOOLEAN
    1-按照RFC1812中的规定通过反向路径进行源验证
        单宿主主机和存根网络的推荐选项
        路由器。可能引起麻烦的复杂问题(并非无循环)
        运行缓慢的不可靠协议(某种RIP)的网络,
        或使用静态路由。

    0-无源验证。

    conf / all / rp_filter也必须设置为TRUE来进行源验证
    在界面上

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

arp_filter-BOOLEAN
    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/


1
我正在转储流量并查看ARP表。192.168.0.110的ARP请求返回包含24:3C:20:06:3E:6D的ARP应答。数据包的源MAC也是24:3C:20:06:3E:6D。我已经尝试了两个建议的过滤器设置,但均无济于事。我也试图与_ignore和_announce玩,提到这里。
— Jayen

4

我知道这是一个老问题,但是最近我在嵌入式设备上遇到了完全相同的情况。该设备同时具有以太网和wifi接口,并且要求两个接口都可以随时处于活动状态并且在同一网络上,但是网络流量必须通过“首选”接口进行路由。

大多数用户不会以这种方式配置那里的设备,但从理论上讲应该是可以的。

我们首先解决了Netgear路由器的问题,因为它们会报告IP地址冲突-2个MAC地址共享一个IP。显然,在这种情况下,路由器将开始表现异常,并弄乱用户网络。

我创建了一个仅包含路由器(以太网+ wifi),Windows笔记本电脑(仅以太网)和嵌入式设备(以太网+ wifi)的专用网络。使用wireshark,设备上的tcpdump和Windows上的arp,我可以看到以下行为:

  1. 设备上的ifconfig显示不同的wln和以太网IP以及不同的MAC地址
  2. 有时(很少),并且来自Windows的arp –a显示正确的IP-MAC组合。
  3. 大多数情况下,来自Windows的arp –a显示wln和eth0具有相同的MAC地址
  4. 从窗口ping wln或eth0时,ping响应来自wln,很少来自eth0。tcpdump显示wln仅对4个ping中的1个做出响应(例如)
  5. 当Windows为eth0 IP发送arp“谁拥有”消息时– eth0和wln接口都响应说他们拥有该IP

我认为第3项是由第5项引起的。arp表被弄乱了,因为wln响应的是只有eth0应该响应的arp消息。我相信第4项也是由第5项引起的。Ping是基于MAC地址发送的,并且由于收到的最后一个arp消息是从wln接收的,表明它具有eth0 IP,因此ping会错误地路由到wln接口。

经过大量的挖掘和测试,该解决方案实际上非常简单。看到这篇文章-http://blog.cj2s.de/archives/29-Preventing-ARP-flux-on-Linux.html

Linux内核网络驱动程序的配置方式是,当收到针对已知接口的arp请求(即使在另一个接口上收到)时,它将响应arp。

此设置解决了该问题:

echo 1 > /proc/sys/net/ipv4/conf/wln/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore

说明:

arp_ignore - INTEGER
Define different modes for sending replies in response to
received ARP requests that resolve local target IP addresses:
0 - (default): reply for any local target IP address, configured
on any interface
1 - reply only if the target IP address is local address
configured on the incoming interface
2 - reply only if the target IP address is local address
configured on the incoming interface and both with the
sender's IP address are part from same subnet on this interface
3 - do not reply for local addresses configured with scope host,
only resolutions for global and link addresses are replied

内容非常丰富,但正如OP所说,他尝试过并链接到类似的答案serverfault.com/a/30648/57200
— Jayen 2015年

1

由于在以前版本的操作系统(基于openembedded)上运行良好,我的解决方案是等待下一个版本的OS。我最好的猜测是无线内核模块有故障。


不太可能,因为您遇到的行为是预期的,如@sciurus所述。可能是它“可以正常工作”的先前发行版有错误,并且他们已修复它:-)。实际上,响应的最后一个是粘贴在远端ARP表中的那个。由于无线可能比有线慢,因此您将获得无线。
— 肖恩·赖夫施耐德

0

跟进Insyte的评论。

让我们做一些命名:

  • PC1-右上
  • PC2-左上方
  • PC3-左下

您可以通过有线和无线媒体从3台PC上访问机器人。而且由于它们在同一子网中,因此您无法确定是否知道有线媒体的arp请求以哪种方式通过。我的意思是,当交换机广播一个arp请求时,您的机器人会在两个接口上都收到它(请参见您的图表),因此它也会在无线媒体上的有线媒体上收到对IP的arp请求。它回复了无线媒体的物理地址,因为该盒子中确实配置了该IP

我过去曾遇到过这个问题,虽然与您的问题不完全相同,但是类似。缺省情况下,Linux会以其接收arp请求的接口的物理地址作为答复,而不管IP配置在哪个接口上。因此,在您的情况下,将PC3直接连接到机械手的eth0接口,并对192.168.0.101发出arp请求,它将以eth0接口的物理地址而不是ra0答复您。

我的部署方案是:

[RTR] | ------------ eth0 --- [服务器]
| -------- | switch1 | ----- eth1 ----- [服务器]

两个接口都连接到同一交换机。希望对您有所帮助。

路由器在其接口上为服务器上两个不同接口上的两个不同网络配置了主要和辅助IP地址。但是在eth1上收到对eth0的IP地址的arp请求时,它确实用eth1的物理地址进行了回复

为防止这种情况,到目前为止,以下对我有用

# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
# echo 2 > /proc/sys/net/ipv4/conf/ra0/arp_announce
# echo 1 > /proc/sys/net/ipv4/conf/ra0/arp_ignore

将其放在机器人上的某个位置,以便可以在启动时应用它。

建议:我建议您配置两个不同的子网(例如ra0上的192.168.1.x / 24和eth0上的192.168.2.x / 24),您可以在PC上使用IP别名,并且可以通过任何计算机访问机器人两个IP中的一个。同一主机上的同一子网不能有两个出站路径。除非有某种使您的机器人比其他机器人更喜欢的东西。您的机器人只能采用一条路径来发送数据包。

一些读数: arp_announce, arp_ignore


arp_announce和arp_ignore对我不起作用。请参阅我对insyte解决方案的评论。不幸的是,不能选择两个不同的子网。另外,根据我对问题的最后修改,此方法在OS的早期版本上运行良好,因此我可以在同一主机上为同一子网设置两个出站路径。
— Jayen

-2

我认为您的无线AP和交换机之间存在配置错误。交换机和AP混淆了将数据包发送到何处。虽然对此不确定。另外,我认为您应该尝试定义一个网关,程序可以在其中知道将数据包发送到哪里。就像是

route add default gw 192.168.0.1


有线和无线笔记本电脑都可以正常工作,因此不是AP或交换机。另外,只有当我尝试进入子网之外时,才需要网关。(无论如何,我都尝试过,它没有任何改变。将网关添加到eth0或ra0都没有关系。)
— Jayen

eth0上没有RX / TX,表示已进行一些配置。错误?
— fmysky 2011年

嗯,我想是真的。eth0至少应该收到ARP请求,因为它是广播,对吗?
— Jayen

是的,那就是我的想法
— fmysky

该lwn文章中的arp问题似乎仅影响2.4.x内核
— fmysky 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.