Gibt es einen Workaround für kaputte ARP-Einträge, die durch das Setzen von net.inet.ip.scopedroute = 0 auf MacOS verursacht wurden?

9

Okay, hier ist mein Problem. Bitte vergib mir, es ist ein bisschen kompliziert. Ich bin fast 100% sicher, dass es durch einen MacOS 10.6-Kernel-Bug verursacht wird, aber da wir nicht darauf zählen können, dass der Fehler behoben wurde, brauche ich eine Abhilfe.

Ich früher gelernt , dass" ipfw ... fwd "-Regeln unter MacOS 10.6 (es funktioniert auf 10.5) nicht richtig funktionieren, es sei denn, Sie machen es zuerst

%Vor%

Es stellt sich jedoch heraus, dass diese Lösung auch nicht perfekt ist; Etwa 10 bis 15 Minuten nachdem ich diese Änderung vorgenommen habe, hört mein Mac im Grunde auf, mit dem Internet zu sprechen. Wenn ich irgendetwas außerhalb meines lokalen Netzwerks pinge, sage ich "no route to host", obwohl ich absolut eine gültige Standardroute habe. Ich habe das Problem auf falsche ARP-Einträge zurückgeführt. Bevor ich den obigen Befehl ausführe, sieht meine Arp-Tabelle wie folgt aus:

%Vor%

Nach dem Ausführen der obigen sysctl und dann ping google.com , sieht es so aus:

%Vor%

So weit, so harmlos. Aber eine Weile später ist der ursprüngliche Arp-Eintrag abgelaufen und alles, was wir noch haben, ist der Neue. MacOS versucht, den alten Eintrag zu aktualisieren, aber er kommt nie zurück. tcpdump zeigt wiederholte ARP-Anfragen, die von meinem Mac stammen, mit korrekten ARP-Antworten vom Router, aber die Antwort wird nie in die ARP-Tabelle aufgenommen. Ich vermute, dass die Antwort ist nur den anderen ARP-Eintrag für die gleiche IP zu aktualisieren, da sie beide den gleichen Schlüssel in einer Art von Hash-Tabelle haben.

Das Ausführen von "arp -a -d" (oder einer beliebigen Variante von "arp -d", die ich versucht habe) löscht nicht beide ARP-Einträge - nur einen von ihnen. Und anscheinend nicht die richtige.

Jede der folgenden Problemumgehungen beseitigt das Problem, ist aber unerwünscht:

  • editieren Sie sysctl.conf und rebooten Sie, anstatt die sysctl zur Laufzeit zu ändern.
  • nachdem Sie die sysctl geändert haben, bringen Sie die Schnittstelle herunter und bringen Sie sie wieder hoch.
  • Löschen Sie nach dem Ändern der sysctl alle Routen durch diese Schnittstelle (mit dem Befehl route ) und erstellen Sie sie erneut.

Jede dieser Optionen lässt jedoch das System vorübergehend in einem Zustand, in dem Pakete nicht routingfähig sind. Außerdem, da ich nicht weiß, was diese sysctl tut (kann mir jemand auf Dokumentation dafür hinweisen?) Ich würde wirklich gerne mein Programm in der Lage sein, es beim Beenden wieder auf normal zu ändern. Aber wenn ich das tue, wird es beim nächsten Programmstart wieder kaputt gehen.

Ich denke, was ich wirklich tun muss, ist nur die ARP-Tabelle zu löschen, aber vielleicht vermisse ich etwas Offensichtliches. Gibt es eine einfache Möglichkeit, dieses Problem zu lösen, oder muss ich auf etwas Hässliches zurückgreifen?

(Übrigens, das Programm, an dem ich arbeite, ist Open Source namens sshuttle . Wenn Sie es auf einem neuen Mac mit Wenn sysctl auf den Standardwert 1 gesetzt ist, sollten Sie das Problem problemlos replizieren können.)

Danke für Anregungen.

    
apenwarr 03.02.2011, 11:20
quelle

1 Antwort

1

Hast du das Formular arp -d <ip> ifscope <interface> ausprobiert? Versuchen Sie in Ihrem Beispiel arp -d 192.168.42.1 ifscope en1

Dies ist, was ich benutze, um die ifscope'd arp Einträge zu entfernen. Beachten Sie, dass Sie root sein müssen (oder sudo verwenden), um Zugriffsfehler zu vermeiden.

    
Erik 25.04.2011, 18:59
quelle

Tags und Links