Hintergrund zum Border-Austausch-Versuch 1 vom 25.8.

Daniel Baumann daniel.baumann at bfh.ch
Sat Sep 18 16:40:29 CEST 2021


Hallo zusammen

Wie berichtet, wollten wir am 25.8. die beiden Cisco Border-Router
durch zwei temporaere Arista-Geraete ersetzen, mehr zum "Warum" des
Wechsels siehe auch unser Announcement dazu:

   https://lists.bfh.science/pipermail/bfh-linux-announce/2021-August
   /000130.html

Im Folgenden einige Hintergrund-Informationen zu unserer
Dokumentation und (fuers Management zum Schluss :) die Massnahmen
aus dem nicht erfolgreichen Austausch-Versuch am 25.8.


Ausgangslage
============

Das relevante Setup setzt sich aus 3 Komponenten zusammen:

1. die bestehenden Cisco Border:

   * zwei Cisco Catalyst 9500 Switches sind mit je einem Uplink via
     Universitaet Bern ans Internet angeschlossen. Die beiden Uplinks
     sind active-passive, es kann als nur jeweils ein Uplink
     gleichzeitig benutzt werden.

   * die Science DMZ und ein paar weitere kleinere Labor-Netze sind
     direkt via Border ans Internet angeschlossen. Alles andere geht
     vom Border zuerst zur Firewall und danach dann ins interne BFH-
     Netz.

2. die bestehende Linux Firewalls:

   * an den beiden Cisco Switches haengen zwei Standard Supermicro
     Server als Linux-Firewalls mit je 8x 10gbit/s, davon gehen je
     2x 10gbit/s auf den Border. Die beiden Server sind mit LACP
     (802.3ad) als Port-Channel mit active-active angeschlossen.

   * die Server haben pro Firewall (einmal die Haupt-Firewall,
     einmal die AdminRZ-Firewall fuer den Anschluss ans interne
     Verwaltungsnetz des Kanton Berns) jeweils Linux-Container. Diese
     betreiben wir zwischen den beiden Servern in einer
     HA-Konfiguration (active-passive) mit pacemaker/corosync und
     conntrackd.

3. neue Arista Border:

   * zwei Arista 7280SR1 Switches werden manuell konfiguriert (also
     nicht als Teil einer SDN-Fabric) eingesetzt und sollen
     temporaer die beiden Cisco Border ersetzen.

   * nach Abschluss des Lifecycles des bestehenden Rechenzentrums-
     Teil (Cage-B) werden die Arista Switches durch zwei neuere
     7280SR3 als Teil der parallel aufgebauten SDN-Fabric des Cage-B
     diese jetzt manuell konfigurierten Switches nach dem
     Jahreswechsel wieder ersetzen. Die 7280SR1 gehen dann an als
     Spines an einen anderen Standort.

   * Dieser temporaere Einbau ist jetzt notwendig weil wir die
     Funktionen der Arista Switches benoetigen um Cage-B und an den
     neueren Rechenzentrums-Teil (Cage-A) mit aller neuen Basis-
     Infrastruktur und der (bis dahin umgezogenen) Science DMZ
     zusammenschliessen zu koennen. So wird dann endlich BFH.ch und
     BFH.science netzwerktechnisch wiedervereinigt und wir koennen
     den Rest der Netzwerk-Gesamterneuerung an den Standorten
     beginnen.


Verbindungsaufbau mit Link Aggregation (LACP)
=============================================

Wo immer moeglich setzen wir fuer eine Verbindung zwischen Systemen
aus Redundanz-, Performance und operativen Wartungs-Gruenden auf
mehrere physikalische Kabel.

Werden zwei physikalische Links zu einem einzigen logischen Link
aggregiert (auch Bonding oder Teaming genannt), muessen beide Link-
Partner auf ihrer Seite die Moeglichkeit haben, diese eine
aggregierte Verbindung von anderen (ggf. auch aggregierten)
Interfaces unterscheiden zu koennen.

Dazu wird zwischen Server und Switch(es) beim Aufbau der
Aggregation, auf jeder Seite fuer das jeweilige System, eine
ein-eindeutige Nummer ausgehandelt (die eigene und die der
Gegenseite sieht man als "port number" in /proc/net/bonding/bond*).

Beispiel:

   * Ein Server hat 4 Interfaces (eno1, eno2, eno3 und eno4).
     Je 2 Interfaces sollen aggregiert werden (bond0=eno1+eno2,
     bond1=eno3+eno4).

   * Beim Aufbau der Aggregation wird fuer bond0 eine zufaellige
     aber ein-eindeutige LACP Nummer auf der Seite des Servers
     bestimmt, z.B. 101

   * Auf der Switch-Seite wird fuer bond0 ebenfalls eine zufaellige
     aber ein-eindeutige LACP Nummer auf der Seite des Switches
     bestimmt, z.B. 1234.

   * Switch und Server tauschen dann die LACP Nummern aus und wissen
     nun, dass die logische Verbindung bond0 fuer die Interfaces
     eno1+eno2 auf Server-Seite die Nummer 101 und auf Switch-Seite
     1234 haben.

   * Fuer die zweite Aggregation im Beispiel (bond1=eno3+eno4) werden
     analog neue LACP Nummern gewaehlt, z.B. 102 (Server) und 1235
     (Switch).

   * Faellt nun ein Kabel aus oder wird (am gleichen oder an einen
     anderen Switch) umgesteckt, stimmen die LACP Nummern nicht
     ueberein (oder sind gar nicht vorhanden). So kann verhindert
     werden, dass versehentlich falsche Interfaces zusammengefasst
     werden, resp. das Netzwerk-Pakete von "ausserhalb" der
     Aggregation in die Aggregation hinein leaken. Das funktioniert
     auf beiden Seiten der Aggregations-Partner, hier
     z.B. 101 != 102 (Server-seitig) und 1234 != 1235 (Switch-seitig)

   * Kollisionen von LACP Nummern sind moeglich, aber praktisch
     ausgeschlossen (der 802.3ad Standard ist nur kostenpflichtig
     einsehbar, aber.. im Linux Kernel ists ein u16, d.h. die
     positiven Ganzzahlen startend mit 0 bis 65'535).


Border-Austausch, Versuch 1
===========================

Da die Firewalls mit je 2 Kabel an die zwei Switches angeschlossen
sind, erschien es plausibel je ein Kabel pro aggregiertem Link auf
den neuen Switch umzustecken.

Dadurch wurden die aggregierten Links "halbiert" und waren komplett
down:

   * das eine Kabel der LACP Verbindung mit dem Cisco Border hatte
     eine LACP Nummer und LACP Partner Nummer, das andere Kabel (der
     zuvor gleichen Aggregation) sah mit dem Arista Switch eine
     andere, neue LACP Nummer.

   * wenn bei LACP mit mehreren Teil-Links keine Mehrheit von Teil-
     Verbindungen mit gleichen LACP Nummern mehr vorhanden ist, kann
     das System (hier Linux) grundsaetzlich nicht mehr wissen, welche
     Verbindung nun "korrekt" ist und kann/soll diese auch nicht
     erraten duerfen, z.B. mit IDs aus obigem Beispiel:

     - bond0 aus eno1 und eno2 hat die LACP Nummer-Kombination aus
       101 und 1234.

     - wenn eno2 vom Cisco auf den Arista Switch umgesteckt wird,
       sieht Linux auf eno2 eine andere LACP Nummer, z.B. 9876.

     - was ist nun korrekt: 101<->1234 vs. 101<->9876 ?

     - wuerde 101<->1234 genommen, wuerde ja das beabsichtige
       Failover auf eno2 nicht passieren, so dass beim weiteren
       Umstecken von eno1 ein Unterbruch entstuende.

     - wuerde 101<->9876 genommen, wuerde die bestehende noch
       funktionierende Verbindung zum Cisco unterbrochen.

     - in beiden Faellen kann nie das gewuenschte Resultat fuer
       dieses Szenario erreicht werden.

   * Alle "kreativen" Vorschlaege wie man das loesen kann sind nicht
     geeignet fuer ein deterministisches System-Verhalten weil von
     beliebigen Annahmen ausgegangen werden muesste. Linux macht in
     diesem Fall daher das einzige Richtige: gar nichts. D.h. beide
     Verbindungen werden unterbrochen und es obligt dem Admin das
     "Richtige" zu tun und die "korrekte" Verbindung
     wiederherzustellen (es ist generell ein gutes Programier-
     Paradigma lieber nichts zu tun als (mit hoher
     Wahrscheinlichkeit) das Falsche).

Diese Situation trat gleich zu Beginn des Wartungsfensters am 28.8.
um 19 Uhr. Danach gelang es nicht, die Aggregation auf den
Interfaces wiederherzustellen.

Aufgrund der Ungewissheit wegen einer (davon unabhaengigen)
Unerreichbarkeit der an den Switchen vorort arbeitenden Person ging
ein Linux-Admin um 19:50 los ins Rechenzentrum um Unterstuetzung
anzubieten. Er traf um 20:05 vor dem System ein.

Da bis dahin das gesamte BFH.ch Netz bereits fuer 1h down war, wurde
sofort und am schnellstmoeglichsten die Migration auf die neuen
Border rueckgaengig gemacht. Das Wiederherstellen der LACP
Interfaces und durch andere Operationen verwirrten HA-Setup der
beiden Firewalls konnte am schnellsten durch ein vollstaendiges
Abschalten beider Linux-Server, zurueckstecken der Kabel von den
Arista Switches auf die Cisco Switches und Neustarten der Linux-
Server erreicht werden (das wir Neustarten muessen haengt u.a. mit
der Stapelung von bond->vlan->bridge auf den Container-Servern und
der Funktionsweise von ifupdown zusammen; eine Geschichte fuer ein
anderes Mal..). Um 20:14 waren alle Systeme und Services wieder
vollstaendig hergestellt/wie gewohnt erreichbar.


Massnahmen
==========

Wir haben folgende Massnahmen getroffen:

   * bei Netzwerk-Migrationen bei denen irgendwo Basis-Infrastruktur
     (sprich: eines unserer Linux-Systeme) involviert ist,
     muss zwingend immer ein Linux-Admin bei der Migration dabei sein
     und fuehrt gegebenfalls notwendige Arbeiten an den Linux-
     Systemen selbst durch.

   * das "Drehbuch" bei Netzwerk-Migrationen wird vorgaengig im
     Gesamt-Team ueberblicksmaessig vorbesprochen (die
     konzeptionellen Vorgehensweise, kein Micro-Management) so dass
     "konzeptionell nicht Funktionierendes/Moegliches" verhindert
     werden kann.

   * die unmittelbare Erreichbarkeit auf dem Mobiltelefon von
     Personen waehrend einer Migration muss sichergestellt sein.

Gruesse,
Daniel

-- 
Berner Fachhochschule / Bern University of Applied Sciences
Services / IT-Services
Daniel Baumann
Teamleiter Linux & Infrastructure Services
___________________________________________________________
Dammweg 3, CH-3013 Bern
Telefon direkt +41 31 848 48 22
Telefon Servicedesk +41 31 848 48 48
daniel.baumann at bfh.ch
https://bfh.ch
https://bfh.science


More information about the bfh-linux-announce mailing list