
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.
Wenn die Verbindung zu einem der Router ausfällt (zum Beispiel zu dem mit dem x
in 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, /sys
um 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