Linux 不为我提供代理 arp,尽管文档表明它确实如此

Linux 不为我提供代理 arp,尽管文档表明它确实如此

我正在开发 PDP-10 模拟器(请参阅https://github.com/Rhialto/klh10)。安装在其中的操作系统可能希望通过 IPv4 与外界通信(当这些机器流行时,IPv4 才刚刚开始使用)。为此,仿真器在主机上打开数据包过滤器(或者,tap 设备)。

假设您位于本地网络 10.0.0.x 上。模拟操作系统可能使用 IPv4 地址,例如 10.0.0.51。

为了使同一网络上的其他主机能够与虚拟主机通信,它们会发送针对 10.0.0.51 的 ARP 请求。我希望 Unix 内核用一个合理的以太网地址(称为代理 ARP)来回答我的这些请求。

为了让 Unix 执行此操作,模拟器会执行(相当于)“arp -s 10.0.0.51 01:23:45:56:78:9A pub”,其中使用主机操作系统的以太网地址。

在 Linux 以外的其他 Unixen 上,这达到了预期的效果。如果我尝试 telnet 或 ping 到 10.0.0.51,我会看到模拟主机发出 ARP 请求,并返回回复:

23:13:42.391941 ARP, Request who-has 10.0.0.51 tell 10.0.0.16, length 46
23:13:42.391954 ARP, Reply 10.0.0.51 is-at f6:2b:a4:a0:76:b0 (oui Unknown), length 28

但是,在 Linux 上(我有 Ubuntu 15.10),这不起作用。该条目确实以“arp -a”的形式出现在 ARP 表中,尽管方式很奇怪:

? (10.0.0.51) at <from_interface> PERM PUB on eth0

我尝试了一些看似相关的sysctls来尝试启用代理ARPing,例如

net.ipv4.conf.all.proxy_arp = 1
net.ipv4.conf.default.proxy_arp = 1
net.ipv4.conf.eth0.proxy_arp = 1

乃至

net.ipv4.ip_forward = 1

但这些都没有帮助。我缺少什么?

我可以仅使用 Linux 机器上的 arp 命令、用于观察的 tcpdump 和另一个用于发起 ARP 请求的机器来测试这一点。当我让它工作时,我可以将任何必要的额外设置步骤安装到模拟器中。

编辑:如果您在同一网络上有两台机器,其中之一是Linux,那么这里有一个简单的尝试场景:

  1. 在 Linux 机器上,执行sudo arp -s 10.0.0.51 01:23:45:56:78:9A pub.如果您使用不同的本地网络,则可能需要替换不同的 IP 地址;该地址不应该存在,但适合您的网络。192.168.0.51可能是一种可能性。另外,我注意到 Ubuntu 拒绝接受随机以太网地址,因此您可能需要替换 eth0 接口的以太网地址。
  2. 在同一个或其他盒子上,sudo tcpdump -i eth0 arp.这将显示网络上的所有 ARP 请求和回复。
  3. 在其他一些机器上,可能是完全不同的操作系统,执行此操作ping 10.0.0.51(当然,或者您使用的地址)。预期结果:运行 tcpdump 命令应显示 ARP 请求和 ARP 回复。如果没有,我想知道需要什么设置才能实现它。如果这是 Ubuntu 特有的。最终会ping失败(该 IP 地址没有可用的主机),但这在此测试中并不重要。如果它说ping: sendto: Host is down这意味着它知道没有 ARP 回复。

答案1

我曾经也有过一样的问题。事实证明 Rui F Ribeiro 是对的,我错过了应该代理的 IP 地址的路由。

arp -i eth0 -sD 192.168.8.10 eth0 pub
ip route add 192.168.8.10 via tun5

只有在执行 ip route 命令后,arp 请求才会得到回复。

我还没有找到明确提到这一点的文档(我正在关注https://help.ubuntu.com/community/SSH_VPN, 基本上)。

相关内容