LACP mit Cisco unter CentOS konfigurieren

LACP-Setup

Verfügt ein Host über mehrere physische Netzwerkadapter, empfiehlt sich die Bündelung der einzelnen Kanäle. Häufig ist die Motivation für eine solche Konfiguration die Erhöhung der maximalen Durchsatzrate. Ein anderer Ansatz ist die Erhöhung der Ausfallsicherheit durch das Definieren von alternativen Netzwerkpfaden. LACP (Link Aggregation Control Protocol, 802.3ad-Standard) kombiniert beide Ansätze, indem mehrere physische Adapter logisch gruppiert werden. Solange genügend physische Pfade existieren, können alle zeitgleich verwendet werden, um Netzwerkverkehr frameweise zu verteilen (zusammenhängende Sitzungen sind hiervon nicht betroffen, um korrekte Paketreihenfolgen zu gewährleisten). Fällt ein Netzwerkpfad aus, wird dies erkannt und der Netzwerkkanal entsprechend neu konfiguriert - man spricht hier auch von dynamischer Kanalbündelung. LACP muss sowohl vom Switch als auch vom angeschlossenen Host unterstützt werden, da eine automatische Konfiguration zwischen beiden Parteien stattfindet.

Switch-Vorbereitungen

Die Konfiguration auf dem Switch variiert je nach Hersteller und Modell. Ich verwende in meinem Home-Lab einen Cisco SG300-28 L3-Switch - hier kann die Konfiguration wie folgt über die Web-Oberfläche vorgenommen werden:

  1. Anklicken von Port Management > Link Aggregation > LAG Management im Seitenmenü links.
  2. Auswählen eines freien LAG-Ports und Anklicken von Edit.
  3. Angeben eines sinnvollen Namens und Auswählen der zu verwendenden Switchports. Bestätigen mit Apply.
  4. Für erweiterte Einstellungen (wie beispielsweise Port Auto-Negotiation, optional): anwählen von LAG Settings im Seitenmenü links. Auswählen des Ports und Anklicken von Edit.

Cisco LAG-Einstellungen

Konfiguration unter CentOS

Die Konfiguration unter Linux variiert je nach Distribution. Ich setze CentOS ein - die folgenden Schritte müssen bei anderen Linux-Distributionen wohl abgeändert werden.

Zuerst muss dafür gesorgt werden, dass das Kernel-Modul für Netzwerk-Bündelung (bonding) beim Booten geladen wird. Für das Modul wird ein Alias der zukünftigen virtuellen Netzwerkkarte vergeben - beispielsweise bond0 für den ersten Bond. Sollen mehrere Bündelungen konfiguriert werden, können mehrere Einträge definiert werden - beispielsweise bond1 und bond2. Anschließend wird das Modul geladen:

1# echo "alias bond0 bonding" > /etc/modprobe.d/bonding.conf
2# modprobe bond0

Anschließend werden die einzelnen Konfigurationen der Netzwerkschnittstellen angepasst. Bereits vorhandene IP-Informationen werden entfernt und die Schnittstelle als Slave definiert. Bei Enterprise Linux-basierten Linux-Distributionen liegen diese Konfigurationsdateien unterhalb /etc/sysconfig/network-scripts:

 1# vi /etc/sysconfig/network-scripts/ifcfg-eno1
 2NAME="eno1"
 3DEVICE="eno1"
 4ONBOOT=yes
 5BOOTPROTO=none
 6USERCTL=no
 7MASTER=bond0
 8SLAVE=yes
 9
10ESC ZZ

Der Schritt wird für alle weiteren Netzwerk-Schnittstellen wiederholt. Anschließend wird eine Konfigurationsdatei für das Bond-Interface erstellt:

1# vi /etc/sysconfig/network-scripts/ifcfg-bond0
2NAME="bond0"
3DEVICE="bond0"
4BONDING_OPTS="mode=4 miimon=100"
5ONBOOT=yes
6BOOTPROTO=static
7...
8
9ESC ZZ

Besonders wichtig ist die Zeile BONDING_OPTS, sie definiert Optionen für den Bonding-Treiber. Der Parameter mode gibt hier den Modus des Bondings an, der Wert 4 steht für LACP. miimon definiert die Zeitspanne in Millisekunden, in denen die Netzwerkverbindung auf Konnektivität überprüft wird. Je kleiner der Wert, desto schneller werden Netzausfälle erkannt - 100 ist ein gängiger Standardwert.

Anschließend wird das Netzwerk neugestartet - alternativ kann auch mit ifup lediglich der neu definierte Bond gestartet werden:

1# service network restart
2# ifup bond0

Wenn alles funktioniert hat, sind im /proc-Dateisystem jetzt Informationen über das Teaming verfügbar:

 1# less /proc/net/bonding/bond0
 2Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)
 3
 4Bonding Mode: IEEE 802.3ad Dynamic link aggregation
 5Transmit Hash Policy: layer2 (0)
 6MII Status: up
 7MII Polling Interval (ms): 100
 8Up Delay (ms): 0
 9Down Delay (ms): 0
10
11802.3ad info
12LACP rate: slow
13Min links: 0
14Aggregator selection policy (ad_select): stable
15Active Aggregator Info:
16 Aggregator ID: 1
17 Number of ports: 2
18 Actor Key: 9
19 Partner Key: 1000
20 Partner Mac Address: xx:xx:xx:xx:xx:xx
21
22Slave Interface: eno1
23MII Status: up
24Speed: 1000 Mbps
25Duplex: full
26Link Failure Count: 1
27Permanent HW addr: xx:xx:xx:xx:xx:xx
28...
29Slave Interface: eno2
30MII Status: up
31Speed: 1000 Mbps
32Duplex: full
33Link Failure Count: 0
34Permanent HW addr: xx:xx:xx:xx:xx:xx
35...

In der Web-Oberfläche des Cisco-Switchs sind nun auch die aktiven Links sichtbar (Port Management > Link Aggregation > LAG Management):

LAG-Links

Fällt nun ein Link aus, wird dies wie folgt in der Cisco-Weboberfläche (Standby-Member) und im Linux-System angezeigt:

Standby LAG-Link

 1# dmesg
 2...
 3[277202.078630] tg3 0000:03:00.0 eno1: Link is down
 4[277202.079761] bond0: link status definitely down for interface eno1, disabling it
 5[277202.079796] bond0: first active interface up!
 6
 7# less /proc/net/bonding/bond0
 8Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)
 9...
10802.3ad info
11LACP rate: slow
12Min links: 0
13Aggregator selection policy (ad_select): stable
14Active Aggregator Info:
15        Aggregator ID: 1
16Number of ports: 1
17...
18Slave Interface: eno1
19MII Status: down
20Speed: Unknown
21Duplex: Unknown
22Link Failure Count: 2
23...

Übersetzungen: