Warum ARP Response nur bei Netzwerkadapter im Promiscuous-Modus?

801
Christian Ehrig

In meinem Heimnetzwerk (10.0.0.0/24) möchte ich einen Netzwerkdrucker bereitstellen, ohne ein Kabel vom Switch zu ihm zu verlegen. Also habe ich ein Raspberry Pi verwendet, das über WLAN mit meinem WLAN verbunden ist und seinen Ethernet-Port mit dem Drucker verbunden hat. Das Ziel war, so etwas wie eine Wifi-Ethernet-Brücke hier zu haben ...

RPi Ethernet IP (eth0): 10.0.0.32 RPi Wifi IP (wlan0): 10.0.0.31 Printer IP: 10.0.0.30 

Nachdem ich mit tcpdump herumgespielt hatte, stellte ich fest, dass das RPi auf ARP-Anfragen des Routers (10.0.0.1) nur dann reagiert, wenn ich es hatte

net.ipv4.ip_forward = 1 net.ipv4.conf.all.proxy_arp = 1 

aktiviert. Was kann ich beim Lesen der Manpages verstehen? Ich habe dies mit einfachen Pings vom Router zur IP des Druckers getestet.

Nun, wenn ich den ARP-Cache auf dem Router gelöscht habe, ohne dass tcpdump auf dem RPi geöffnet wurde, funktionierten die ARP-Antworten irgendwie nicht mehr. Also habe ich mich gefragt, warum es wieder funktioniert, sobald ich mit dem Tcpdump auf dem Pi begonnen habe. Es stellte sich heraus, dass tcpdump die WLAN-Schnittstelle des Raspberry Pi in den Promiscuous-Modus versetzt. Um richtig zu funktionieren, habe ich die WiFi-Schnittstelle des Pi im permanenten Promiscuous-Modus eingestellt

 ip link set wlan0 promisc on 

und alles funktioniert jetzt gut, aber da ich das Gefühl habe, dass diese Lösung "riecht", würde ich gerne wissen, was hier los ist und warum proxy_arp nicht ausreicht?

Da ich zwei Netzwerkschnittstellen hier habe, die im selben Subnetz arbeiten, habe ich außerdem mit einigen Routenrichtlinien sichergestellt, dass nur der Datenverkehr zum Drucker über eth0 geleitet wird.

localhost ~ # ip rule show 0: from all lookup local 32764: not from all to 10.0.0.30 lookup main 32765: from all to 10.0.0.30 lookup print 32766: from all lookup main 32767: from all lookup default   localhost ~ # ip route show table print 10.0.0.30 dev eth0 scope link 
2
Warum überbrücken Sie nicht die beiden Netzwerkschnittstellen? Sie haben dieses Keyword in Ihrer Frage markiert, tun dies aber nicht. Beseitigen Sie alle Routenregeln und überbrücken Sie die beiden Schnittstellen. Appleoddity vor 6 Jahren 0
Entschuldigung, ich habe nicht erwähnt, dass, wenn ich den WLAN-Adapter zu einer Bridge hinzufüge, das Betriebssystem mit nicht unterstützter Operation antwortet (IP-Link-Set dev wlan0 master br0). Ich werde das untersuchen, da "echtes" Bridging der Weg sein sollte ... Christian Ehrig vor 6 Jahren 0
Nur als Referenz: Ich habe Ihre Frage nicht gesehen, also habe ich fast das gleiche gemacht [Ist der Promiscuous-Modus für Proxy-Arp erforderlich?] (Https://unix.stackexchange.com/q/446795/243074). Ingo vor 5 Jahren 0

1 Antwort auf die Frage

2
kasperd

Es gibt grundsätzlich zwei Möglichkeiten, das zu tun, was Sie versuchen: Routing und Bridging.

Keiner von denen macht Gebrauch von proxy_arp. proxy_arpist ein Hack, den Sie verwenden können, wenn Teile Ihres Netzwerks denken, dass Sie routen, und andere Teile denken, dass Sie überbrücken. Dies ist ein letzter Ausweg, den Sie nur verwenden sollten, wenn Sie alle anderen Optionen ausgeschlossen haben.

Meine Empfehlung ist, dass Sie sowohl die Routing- als auch die Bridging-Lösung vollständig verstehen und verstehen sollten, warum keine der beiden Funktionen für Sie funktionieren wird, bevor Sie auf diese Option zurückgreifen proxy_arp.

Ihr Anwendungsfall hört sich nicht nach einem der Fälle an, wo proxy_arpdies erforderlich wäre.

Das Problem mit dem Überbrücken lösen

WiFi verwendet MAC-Adressen in zwei Schichten des Stapels. Sie haben ein Paar MAC-Adressen für die Endpunkte, wie in verkabeltem Ethernet. Sie haben ein Paar MAC-Adressen, die die Endpunkte der drahtlosen Verbindung anzeigen.

Leider ging der ursprüngliche WLAN-Standard davon aus, dass ein bestimmtes Paar dieser vier MAC-Adressen immer identisch ist, und diese Annahme trifft beim Überbrücken nicht zu. Daher wurde ein neuerer Standard namens WDS eingeführt, um dies zu beheben.

Um Bridging konfigurieren zu können, müssen Sie also sicherstellen, dass die Hardware an beiden Enden Ihrer WLAN-Verbindung WDS unterstützt und aktiviert ist. Als Nächstes müssen Sie die beiden vorgenommenen sysctlÄnderungen rückgängig machen, da diese nicht für das Bridging verwendet werden.

Schließlich müssen Sie eine Brücke auf dem Pi konfigurieren, die die drahtgebundenen und die drahtlosen Schnittstellen zu einer Brücke zusammenfasst. Wenn Sie möchten, dass der Pi auch IP spricht, konfigurieren Sie auf der Bridge-Schnittstelle nicht die zugrunde liegenden physischen Schnittstellen.

Dies ist eine Reihe von Dingen, die konfiguriert werden müssen, und es besteht die Gefahr, dass WDS von der Hardware nicht unterstützt wird.

Das Problem mit dem Routing lösen

Wenn Sie Routing durchführen möchten, müssen Sie die proxy_arpEinstellung immer noch rückgängig machen . Die net.ipv4.ip_forward = 1Einstellung ist jedoch für ein Routing-Setup korrekt.

Auf dem Pi müssen Sie die beiden Netzwerkschnittstellen mit unterschiedlichen Präfixen konfigurieren. Das WLAN, das Sie bereits mit 10.0.0.0/24Ihnen konfiguriert haben, kann wahrscheinlich so belassen werden, da dieser Teil bereits funktioniert.

Die kabelgebundene Schnittstelle muss jedoch mit einem anderen Präfix konfiguriert werden. Eine mögliche Wahl ist 10.0.1.0/24. Und Sie können 10.0.1.1die verdrahtete Schnittstelle auf dem Pi zuweisen .

Der Drucker kann entweder mit einer statischen IP-Adresse 10.0.1.2konfiguriert werden, z. B. mit einer dynamischen Konfiguration, bei der Sie einen DHCP-Server auf dem Pi installieren müssen, der die Adressen im 10.0.1.1Präfix ausgibt.

Schließlich müssen Sie Ihren vorhandenen Router über dieses neue Netzwerk informieren, indem Sie einen Routing-Tabelleneintrag hinzufügen. Fügen Sie in der Konfiguration Ihres vorhandenen Routers einen Routing-Tabelleneintrag für das Präfix 10.0.1.0/24(alternativ als geschrieben 10.0.1.0/255.255.255.0) mit einer Gateway-Adresse von hinzu 10.0.0.31. Sie müssen sicherstellen, dass die Adresse 10.0.0.31irgendwie statisch gehalten wird. Andernfalls wird der Eintrag in der Routing-Tabelle falsch.

Ich hatte die genaue Routing-Lösung installiert, aber mein Ziel war es, mit allen Geräten im gleichen Adressbereich zu bleiben. Ich werde die Überbrückungslösung noch einmal überprüfen, aber als ich den WLAN-Adapter zu einer Brücke hinzugefügt habe ... "ip link set dev wlan0 master br0" ... antwortet er mit nicht unterstützter Operation. Ich werde das untersuchen. Christian Ehrig vor 6 Jahren 0
Ich denke, die Lösung ist so etwas wie https://serverfault.com/a/554663/345934 Christian Ehrig vor 6 Jahren 0
@ChristianEhrig Klingt so, könnte es funktionieren. Persönlich habe ich immer den Routing-Ansatz für solche Setups verwendet, da ich die Konfiguration als einfacher als das Bridging über Funk fand. kasperd vor 6 Jahren 0
@ChristianEhrig All Raspberry Pis unterstützt * WDS * nicht. Geräte, die dies unterstützen, haben den unterstützten Befehl `set_wds_peer`. Sie werden es nicht mit sudo iw phy | finden grep set_wds_peer` auf einem RasPi. Ingo vor 5 Jahren 0