Link Aggregation unter Linux

Heute mal ein praktisches Tutorial zum Thema Link Aggregation, auch bekannt als Bonding, Trunking, Teaming, Etherchannel etc. Sinn des Ganzen ist es, Netzwerkkomponenten mit mehreren parallelen Netzwerkverbindungen zu verbinden mit dem Ziel, mehr Durchsatz oder/und Redundanz zu schaffen. Typischerweise wird dies bei Switches gemacht, in diesem Tutorial befassen wir uns allerdings mit Bonding zwischen einem Switch (sowohl ein handelsüblicher Layer2-Switch als auch Layer3 mit IEEE 802.3ad) und einem Linux-System (in meinem Fall nutze ich Debian 7).

Im Gegensatz zu Windows (wo Teaming erst ab Windows Server 2012 nativ unterstützt wird) genügt es unter Linux das tool ifenslave zu installieren. Dieses gaukelt dem Kernel dann eine virtuelle Netzwerkkarte vor und teilt intern den Datenverkehr unter den angeschlossenen Karten auf.

apt-get install ifenslave-2.6

Um den Kernel zu testen, ob er auch Bonding unterstützt gebt folgendes ein und prüft, ob das Modul angezeigt wird:

modprobe --list | grep -i bonding

Im Anschluss muss nur noch die Datei /etc/network/interfaces angepasst werden in der alles Weitere eingestellt wird. Hierzu schalten wir vorher alle für das Bonding vorgesehenden Interfaces ab und stoppen anschließend den Netzwerkdaemon:

ifconfig ethx down # x für die jeweiligen Interfaces
/etc/init.d/networking stop

Die folgende interfaces-Datei konfiguriert die Interfaces eth0 und eth1 im DHCP-Modus. Analog dazu funktioniert auch Static wie gehabt für feste IP-Adressen. Das neue Interface heisst bond0.  Die lo-Verbindung sollte in eurer Config unangetastet bleiben, für die betroffenen Interfaces müsst ihr alle anderen Einstellungen die ihr in der Config vorgenommen habt, auskommentieren oder löschen.

auto bond0

iface bond0 inet dhcp
slaves eth0 eth1
bond-mode 0
bond-miimon 100
bond-downdelay 200
bond-updelay 200
hwaddress 00:11:22:33:44:55

Bedeutung der bond-Einträge:

  • slaves: für Bonding genutzte Interfaces
  • bond-mode: es gibt die Modi 0-6 (siehe Tabelle unten)
  • bond-miimon: Zeit in Millisekunden, nach der der Bonding-Treiber die gebündelten Links prüft
  • bond-downdelay: wird eine Schnittstelle (wieder) als aktiv erkannt, wartet der Bonding-Treiber x Millisekunden ab, ehe er den Link wieder in den Bonding-Verbund aufnimmt
  • bond-updelay: bei einem Verbindungsabbruch wird der Link erst nach x Millisekunden aus dem Bonding-Verbund entfernt
  • hwaddress: da in einigen Bond-Modi beide Netzwerkkarten unter der selben MAC erscheinen, kann man hier festlegen, welche der beiden interface-MACs verwendet werden soll

Weitere Grundeinstellungen kann man der Manpage von ifenslave entnehmen. Zum starten des Interfaces wird das neue Interface online gebracht und der Network-Manager wieder gestartet:

ifconfig bond0 up
/etc/init.d/networking start

Unter Umständen ist es noch nötig, die jeweiligen Interfaces wieder auf dem selben Weg zu aktivieren wie das bond0.

Die Installation unter Centos ist etwas anders. Dazu sind folgende Dateien zu konfigurieren/erstellen:

/etc/sysconfig/network-scripts/ifcfg-bond0:
# Bonding interface
DEVICE=bond0
BOOTPROTO=none
ONBOOT=yes
IPADDR=192.168.15.34
NETMASK=255.255.255.0
USERCTL=no

/etc/sysconfig/network-scripts/ifcfg-eth0:
# erste Netzwerkkarte
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0
SLAVE=yes

/etc/sysconfig/network-scripts/ifcfg-eth:
# zweite Netzwerkkarte
DEVICE=eth1
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0
SLAVE=yes

Die Namen der Netzwerkinterfaces können auch em1 etc. heissen und müssen ggf. angepasst werden.

Zum Schluss können noch Einstellungen (wie der Bonding-Mode) in /etc/modprobe.conf geschrieben werden:

alias bond0 bonding
options bond0 miimon=80 mode=4

Nach einem Neustart des Netzwerks sollte der bond aktiv sein:

service networking restart

Die Einstellungen können direkt überprüft werden.


Ubuntu: ifconfig
Centos: ip addr

Bonding-Modi

Das Programm ifenslave beherrscht sieben verschiedene Bonding-Modi welche ich alle einmal kurz erklären möchte. Durch ändern des „bond-mode“ in der interfaces-Datei könnt ihr die verschiedenen Modi auswählen. Danach muss einmal das Netzwerk neugestartet werden.

Modus 0 – balance-rr – Lastverteilung & Redundanz

Die Pakete werden im Rount-Robin Verfahren auf die verfügbaren Netzwerkkarten aufgeteilt. In Empfangsrichtung kann für eine Verbindung maximal die Geschwindigkeit einer Netzwerkkarte erreicht werden. Dieser Modus kann auch mit einem einfachen Layer2-Switch im Heimnetz verwendet werden.

Modus 1 – active-backup – Redundanz

Nur eine Schnittstelle ist aktiv, im Fehlerfalle wird eine der anderen im Verbund genutzt. die Netzwerkkarten können über verschiedene Switches angebunden werden.

Modus 2 – balance-xor – Lastverteilung & Redundanz

Es wird für jede Gegenstelle im Netzwerk eine zu nutzende Netzwerkschnittstelle zugewiesen, die Zuordnung geschieht über den Modulo der Division zwischen der Formel (Quell-MAC-Adresse XOR Ziel-MAC-Adresse) und der Anzahl der Slave-Schnittstellen.

Modus 3 – broadcast – Redundanz

Daten werden auf allen Netzwerkschnittstellen gesendet. Die Nutzung mehrerer Switches ist möglich.

Modus 4 – 802.3ad – Lastverteilung & Redundanz

802.3ad ist ein Standard der IEEE, der die Bündelung mehrerer Schnittstellen mit gleichen Übertragungseinstellungen (Geschwindigkeit und Duplex-Einstellungen) erlaubt, um eine höhere Bandbreite zu erhalten. Es kann nur ein Layer3-Switch verwendet werden, dieser muss 802.3ad unterstützen (wenn ihr nicht wisst, was das ist, habt ihr höchstwahrscheinlich auch keinen 😉 ).

Modus 5 – balance-tlb – Lastverteilung

Es wird für jede Gegenstelle im Netzwerk eine zu nutzende Netzwerkschnittstelle zugewiesen. Das Verfahren hierzu ist jedoch komplexer und effizienter als bei balance-xor.

Modus 6 – balance-alb – Lastverteilung

Erweitertes balance-tlb, zusätzlich zur MAC-basierten Zuordnung der Schnittstellen für ausgehende Verbindungen werden eingehende Verbindungen auf die Schnittstellen verteilt. Das Programm ethtool wird benötigt.

Für Nutzer eines (smart-)managed Switches, welcher 802.3ad unterstützt, würde ich klar Modus 4 empfehlen, da dieses ein zertifiziertes Protokoll ist, welches sowohl Computer als auch Switch sprechen. Für alle Nutzer normaler Heimswitches würde ich für maximalen Durchsatz Modus 0 oder 2 empfehlen. Wer auf zusätzliche Bandbreite verzichten möchte ist mit 1 am besten beraten.

Zusatz zu 802.3ad LACP

Für eine optimale Nutzung von LACP ist es wichtig zu wissen, wie es genau funktioniert. Das verteilen der Pakete erfolgt nach verschiedenen Algorithmen, welche die Qualität des Bonds beeinflussen können. Jedes Gerät, das diesen Standard unterstützt, beherrscht mindestens das Load-Balancing auf OSI-Schicht 2 (der Datenschicht). Dabei wird die MAC-Adresse eines Datenpakets genommen (je nach Einstellung die MAC des Senders, Empfängers oder Beide), ein Hash gebildet und abhängig davon das Paket auf einen der verfügbaren Links gesendet. Zwei Computer werden sich also immer über das selbe Kabel des Bonds unterhalten, nie über ein anderes. Selbiges gilt für ein Load-Balancing auf ISO-Schicht 3 (Netzwerk-Schicht), bei dem jedoch auf IP-Ebene unterschieden wird. Hat ein physikalisches Interface mehrere IP-Adressen könnte das einen Vorteil bringen, es ist in der Praxis jedoch eher unüblich. Bei beiden Einstellungen kann es passieren, dass zwei zugreifende Clients über das selbe Kabel gehen, während die zweite ungenutzt bleibt, da LACP ausschließlich auf Hash-Ebene die Verteilung berechnet und die Auslastung außer acht lässt.

Am besten funktioniert das Balancing auf Layer4 (Transportschicht). Hier wird nach TCP-Streams unterschieden. Lädt man zum Beispiel mit zwei FTP-Verbindungen parallel Daten von einem Server runter, sind dies zwei separate TCP-Verbindungen. Leider unterstützen nur teure Switches, meist jenseit der dreistelligen Preisklasse, diese Funktion. Glücklicherweise ist der Switch nur eine Seite des Trunks. Unter Linux lässt sich das Balancing auf Layer4-Ebene ganz leicht aktivieren. Für Ubuntu/Debain müssen dafür folgende Einstellungen in der /etc/network/interfaces unter dem Bond hinzugefügt werden:

bond-xmit_hash_policy layer3+4

Unter Centos kommt diese Einstellung in die oben beschriebene Datei /etc/modprobe.conf hinter die Options.

xmit_hash_policy=layer3+4

Ich hoffe, Ihr könnt euer Netzwerk auch erfolgreich beschleunigen. Wenn etwas nicht funktioniert oder falsch erklärt wurde, schreibt mir ein Kommentar 😉

Stay Tuned – Støerebeker

Veröffentlicht unter Linux, Netzwerk, Tutorials

Schreibe einen Kommentar