LINUXMAKER, OpenSource, Tutorials

Der richtige Umgang mit dem ARP-Flux auf Linux Multi-NIC-Interfaces

Der Linux-Kernel ist bei einem Linux-Host so implementiert, dass per Default ein Weak Host Model umgesetzt wird. Damit ist gemeint, dass der Host jedes lokal zugestellte IP-Paket akzeptiert, unabhängig von dem Netzwerk-Interface, an der das Paket empfangen wurde. Genauso unabhängig versendet er das Paket wieder über eine seiner Netzwerk-Interfaces.
Das ist ein Verhalten, dass zu Komplikationen in der Netzwerkkomunikation führen kann. Denn jeder IP-Adresse ist auch eine MAC-Adresse des jeweiligen Netzwerk-Interface zugeordnet. Unter bestimmten Fällen generiert ARP Flux allerdings ein unerwartetes Verhalten von Anwendungen aufgrund einer inkorrekten Zuordnung zwischen IPv4-Adressen und MAC-Adressen. Beispiele hierfür können Anwendungen wie Firewalls oder FreeRadius sein, die exakt zu der IP-Adresse auch die richtige MAC-Adresse in der Antwort erwarten und die Verbindung beenden, sobald diese Zuordnung nicht mehr stimmig ist. Zur MAC-Adressauflösung kommt ARP zum Einsatz, das hier ausführlich beschrieben wird.

Vermeidung des ARP-Flux

Da standardmäßig im Linux-Kernel das Weak-Host-Model umgesetzt wird, ist es ratsam, dieses in ein Strong-Host-Model umzusetzen. Das Verhalten im Kernel durch folgende Parameter initialisiert.

systctl -w net.ipv4.conf.all.arp_announce=1
systctl -w net.ipv4.conf.all.arp_ignore=2

arp_announce = 1
Versuchen Sie, lokale Adressen zu vermeiden, die sich nicht im Subnetz des Ziels für diese Schnittstelle befinden. Dieser Modus ist nützlich, wenn Zielhosts, die über diese Schnittstelle erreichbar sind, die Quell-IP-Adresse in ARP-Anforderungen als Teil ihres logischen Netzwerks benötigen, das auf der empfangenden Schnittstelle konfiguriert ist. Beim Generieren der Anfrage werden alle Subnetze überprüft, die die Ziel-IP enthalten, und wird die Quelladresse beibehalten, wenn sie aus einem solchen Subnetz stammt. Wenn es kein solches Subnetz gibt, wird die Quelladresse gemäß den Regeln für Level 2 gewählt.

arp_ignore = 2
Es wird nur geantwortet, wenn die Ziel-IP-Adresse die lokale Adresse ist, die auf der eingehenden Schnittstelle konfiguriert ist, und beide mit der IP-Adresse des Absenders Teil desselben Subnetzes auf dieser Schnittstelle sind.

Zusätzlich macht es Sinn, auch diese beiden Kernel-Parameter zu setzten.

systctl -w net.ipv4.conf.default.arp_filter=1
systctl -w net.ipv4.conf.all.arp_filter=1

Denn in die Kernel-Dokumentation schreibt deutlich,
arp_filter - BOOLEAN
1 - Allows you to have multiple network interfaces on the same
    subnet, and have the ARPs for each interface be answered
    based on whether or not the kernel would route a packet from
    the ARP'd IP out that interface (therefore you must use source
    based routing for this to work). In other words it allows control
    of which cards (usually 1) will respond to an arp request.

Um das Ganze auch nach einem Reboot wieder zur Verfügung zu haben, sollten diese Parameter in der Konfigurattionsdatei /etc/sysctl.conf gespeichert werden.

Ergänzend dazu macht eine Priorisierung des Netzwerk-Interfaces einen Sinn. Durch den Parameter "metric 1" in der Datei /etc/network/interfaces bei der bevorzugten Netzwerkkarte und ein "metric 0" bei den weniger bevorzugten Netzwerk-Interfaces, lässt sich eine Priorisierung erreichen. Um diese Priorisierung umsetzen zu können, bedarf es der Installation des Paketes "ifmetric"

apt-get install ifmetric

Einstellungen bei den Clients

Wenn die Linux-Clients ebenfalls mindestens zwei Netzwerk-Interfaces besitzen, und ist bei Laptops mit dem WiFi- und der LAN-Interfaces meistens gegeben, dann kann man Linux auch wieder so konfigurieren, dass ein Interface bevorzugt behandelt wird.

Folgendes Szenario soll hierbei angestrebt werden:
Wenn der Benutzer an seinem Laptop sein LAN-Kabel einsteckt, soll das LAN-Interface aktiviert werden, respektive deaktiviert werden, wenn es nicht mehr eingesteckt ist. Dementsprechend soll das Routing über das LAN-Interface bevorzugt werden oder über das WLAN-Interface, aber nicht über beide.

Auch dazu benötigen wir explizt die Pakete "ifmetric" und für den Hotplug-Daemon "ifplugd"

apt-get install ifmetric ifplugd

Die Konfiguration der Interfaces in /etc/networking/interfaces erfolgt dann auf diese Art und Weise

# The primary network interface
allow-hotplug eth0
iface eth0 inet dhcp
    metric 0

iface wlan0 inet dhcp
    metric 1

Dabei gilt generell die niedrigere Metrik als die Bevorzugtere. Alternativ kann man auch wie in diesem Artikel dargestellt, den Versuch starten und beiden Netzwerk-Interfaces ein eigenes Default-Gateway konfigurieren, um das Ziel zu erreichen.