Zustände der Bridge-Schnittstellen synchronisieren

Zustände der Bridge-Schnittstellen synchronisieren

Wir verfügen über redundante 10G-Glasfaserverbindungen zu unserem Upstream-Internetprovider in einer Active/Failover-Konfiguration. Zwischen unserem Router und dem Upstream-Router haben wir ein Paar Firewalls, die Vyos im transparenten Modus ausführen. Wir verwenden BGP für die Routenankündigung und können die meisten Parameter nicht ändern.

Zeichnung:Zeichnung des Netzwerklayouts

Wenn die Verbindung zu einem der Router ausfällt (zum Beispiel zu dem mit dem xin der Zeichnung - das ist zufälligerweise unser häufigster Fehlertyp), ist das gesamte Netzwerk bis zum BGP-Timeout (bis zu 150 Sekunden) nicht erreichbar. Ich weiß bereits, dass unsere Router sofort beginnen, den Verkehr über die andere Verbindung weiterzuleiten, wenn wir die Verbindung auf der anderen Seite der Brücke zum Abbruch zwingen.

Gibt es eine Möglichkeit, eine Seite der Brücke auf der Firewall automatisch herunterzufahren, wenn die andere Seite ausfällt?

Gibt es bei dieser Lösung versteckte Fallstricke?

Antwort1

Ich würde auf den VyOS-Maschinen ein Skript ausführen, das den Status der Upstream-Verbindung überprüft und dann bei Bedarf ifdown/ auf der anderen Seite ausführt.ifup

Am einfachsten geht das, indem Sie Skripte einfügen /etc/network/if-down.d(prüfen Sie, ob die Schnittstelle, die ausgefallen ist, die aktualisierte Seite ist, und schalten Sie die andere Seite aus) und /etc/network/if-up.d(prüfen Sie, ob die Schnittstelle, die hochgefahren ist, die aktualisierte Seite ist, und schalten Sie die andere Seite hoch).
Alternativ können Sie einmal pro Minute ein Überwachungsskript mit cron (oder Systemd-Timern oder einem ähnlichen Scheduler) ausführen oder es als Endlosschleife schreiben, die einige Sekunden pausiert, um eine Überprüfung im Minutentakt zu erhalten.

Antwort2

Ich habe ein Skript geschrieben, das Schnittstellen prüft, /sysum festzustellen, ob sie Bridge-Mitglieder sind, und dann die Bridge zurücksetzt. VyOS netplugdüberwacht Schnittstellen und aus irgendeinem Grund bringt mein Skript es durcheinander (ich werde wahrscheinlich eine separate Frage dazu schreiben), aber ich denke, es ist eine gute allgemeine Lösung.

#!/bin/bash

## This script will bounce a br interface if a member interface goes down.
## This will cause router BGP timers to reset, making outages last only seconds instead of minutes.
##
## This script is called by netplug on Vyos:
## /etc/netplug/linkdown.d/my-brdown
##
## Version History
## 1.0 - Initial version
##

LOCKDIR=/var/run/my-bridge-ctl

# Since we only have one br, not going to implement this right now.
#IGNORE_BRIDGES=()

IFACE=$1

#Remove the lock directory
function cleanup {
    if rmdir $LOCKDIR; then
        logger -is -t "my-bridge-ctl" -p "kern.info" "Finished"
    else
        logger -is -t "my-bridge-ctl" -p "kern.error" "Failed to remove lock directory '$LOCKDIR'"
        exit 1
    fi
}

if mkdir $LOCKDIR; then
    #Ensure that if we "grabbed a lock", we release it
    #Works for SIGTERM and SIGINT(Ctrl-C)
    trap "cleanup" EXIT

    logger -is -t "my-bridge-ctl" -p "kern.info" "Acquired lock, running"

    # Processing starts here

    IFACE_DESC=$(<"/sys/class/net/${IFACE}/ifalias")
    IFACE_BR_DIR="/sys/class/net/${IFACE}/brport"

    if [ ! -d "$IFACE_BR_DIR" ]; then
        logger -is -t "my-bridge-ctl" -p "kern.warning" "Interface ${IFACE} (${IFACE_DESC-no desc}) went down. Not a member of a bridge. Skipping."
    else
        IFACE_BR_LINK=$(realpath "/sys/class/net/${IFACE}/master")
        IFACE_BR_NAME=$(basename $IFACE_BR_LINK)
        IFACE_BR_DESC=$(<"${IFACE_BR_LINK}/ifalias")
        logger -is -t "my-bridge-ctl" -p "kern.warning" "Interface ${IFACE} (${IFACE_DESC:-no desc}) went down. Member of bridge ${IFACE_BR_NAME} (${IFACE_BR_DESC:-no desc})."

        # TODO: Insert IGNORE_BRIDGE check here

        find "${IFACE_BR_LINK}/brif" -type l -print0 | while IFS= read -r -d $'\0' IFACE_BR_MEMBER_LINK; do
            IFACE_BR_MEMBER_NAME=$(basename $IFACE_BR_MEMBER_LINK)
            logger -is -t "my-bridge-ctl" -p "kern.info" "Handling ${IFACE_BR_NAME} member interface ${IFACE_BR_MEMBER_NAME} (${IFACE_BR_MEMBER_LINK})."

            # Actually do the bounce
            ip link set dev ${IFACE_BR_MEMBER_NAME} down && sleep 2 && ip link set dev ${IFACE_BR_MEMBER_NAME} up

            logger -is -t "my-bridge-ctl" -p "kern.info" "Interface ${IFACE_BR_MEMBER_NAME} bounced."
        done
    fi

    sleep 5
else
    logger -is -t "my-bridge-ctl" -p "kern.info" "Could not create lock directory '$LOCKDIR'"
    exit 1
fi

verwandte Informationen