是否有针对在MacOS上设置net.inet.ip.scopedroute = 0导致的ARP条目损坏的解决方法?

ape*_*arr 9 macos routing arp

好的,这是我的问题.请原谅我,因为它有点复杂.我几乎100%肯定它是由MacOS 10.6内核错误造成的,但由于我们不能指望修复错误,我需要一个解决方法.

之前了解到"ipfw ... fwd"规则在MacOS 10.6上无法正常工作(它适用于10.5)除非你先做

sysctl -w net.inet.ip.scopedroute=0
Run Code Online (Sandbox Code Playgroud)

然而,事实证明这种解决方案也不完美; 在进行此更改后大约10到15分钟,我的Mac基本上停止与互联网通话.ping我本地网络外的任何东西开始说"没有到主机的路由",即使我绝对有一个有效的默认路由.我已将问题跟踪到错误的ARP条目.在运行上面的命令之前,我的arp表看起来像这样:

# arp -a
router (192.168.42.1) at 0:1c:10:b0:d4:79 on en1 ifscope [ethernet]
Run Code Online (Sandbox Code Playgroud)

运行上面的sysctl然后再做ping google.com,它看起来像这样:

# arp -a
dd-wrt (192.168.42.1) at 0:1c:10:b0:d4:79 on en1 [ethernet]
dd-wrt (192.168.42.1) at 0:1c:10:b0:d4:79 on en1 ifscope [ethernet]
Run Code Online (Sandbox Code Playgroud)

到目前为止,如此无害.但不久之后,原来的arp条目超时了,我们剩下的就是新的.MacOS尝试刷新旧条目,但它永远不会回来.tcpdump显示来自我的Mac的重复ARP请求,正确的ARP响应从路由器返回,但答案永远不会被放入ARP表.我怀疑答案只是更新同一IP 的其他 ARP条目,因为它们在某种哈希表中都有相同的密钥.

运行"arp -a -d"(或我试过的"arp -d"的任何变体)都不能成功删除这两个ARP条目 - 只有其中一个.而且显然不是正确的.

以下任何一种解决方法都会使问题消失,但这是不可取的:

  • 而不是在运行时更改sysctl,编辑sysctl.conf并重新启动.
  • 更改sysctl后,关闭界面并重新启动它.
  • 更改sysctl后,删除该接口的所有路由(使用该route命令)并重新创建它们.

但是,这些选项中的每一个都使系统暂时处于数据包不可路由的状态.此外,因为我实际上并不知道这个sysctl做了什么(有人能指出我的文档吗?)我真的希望我的程序能够在退出时将其恢复正常.但是,如果我这样做,那么下次我的程序开始时它会被打破.

我认为我真正需要做的就是清除ARP表,但也许我错过了一些明显的东西.有没有一种简单的方法来解决这个问题,还是我不得不求助于丑陋的事情?

(顺便说一句,我正在开发的程序是开源的,名为sshuttle.如果你在一台新的Mac上尝试将sysctl设置为默认值1,你应该能够轻松地复制问题.)

谢谢你的任何建议.

小智 1

你尝试过表格arp -d <ip> ifscope <interface>吗?从你的例子来看,尝试arp -d 192.168.42.1 ifscope en1

这就是我用来删除 ifscope 的 arp 条目的方法。请注意,您必须是 root(或使用 sudo)以避免权限错误。