我的 Linux 路由器有一个奇怪的问题。
设置是这样的:
host1 === Linux router === host2
a.b.c.d --- a.b.c.e/g.h.i.j --- g.i.h.k
Run Code Online (Sandbox Code Playgroud)
每五分钟 host1 尝试访问 host2。
如果host2 关闭,Linux 路由器会在地址为ghij 的左侧网络(即来自右侧的网络)上向abcd 发出ARP 请求。从主机 1 接收到 MAC 地址后,路由器发送一个 ICMP-unreachable 数据包,其中 ghij 作为发送者地址。
如果 host2 已启动,则一切正常。路由器使用其地址 abce 发出 ARP 请求
在路由器上我有
$ uname -a
Linux pfc 3.6.9-voyage #1 SMP Tue Dec 11 09:53:27 HKT 2012 i586 GNU/Linux
Run Code Online (Sandbox Code Playgroud)
不涉及 proxy_arp。
问题是:在我看来,路由不应该使用来自右侧网络的 IP 地址来进行 ARP 请求。还是我在这里遗漏了什么?
默认情况下,Linux 内核不会强制自己使用分配给特定接口的 IP 地址,以便在该接口上的 ARP 请求中使用。在我看来,合理性是分配给同一主机上任何接口的所有 IP 地址都属于该主机,因此在 ARP 请求中使用哪个地址无关紧要。
尝试sysctl -w net.ipv4.conf.all.arp_announce=2
查看相应的内核文档:
arp_announce - INTEGER
[...]
2 - Always use the best local address for this target. [...]
Run Code Online (Sandbox Code Playgroud)