
Tenemos enlaces de fibra 10G redundantes a nuestro proveedor de Internet ascendente en una configuración activa/de conmutación por error. Entre nuestro enrutador y el enrutador ascendente, tenemos un par de firewalls que ejecutan Vyos en modo transparente. Usamos BGP para publicidad de rutas y no podemos cambiar la mayoría de los parámetros.
Si el enlace a uno de los enrutadores falla (por ejemplo, el que tiene x
en el dibujo; este es nuestro tipo de falla más común), toda la red queda inaccesible hasta que se agote el tiempo de espera de BGP (hasta 150 segundos). Ya sé que si forzamos la desactivación del enlace del otro lado del puente, nuestros enrutadores comenzarán inmediatamente a reenviar el tráfico a través del otro enlace.
¿Hay alguna manera de derribar automáticamente un lado del puente en el firewall si el otro lado cae?
¿Existen obstáculos ocultos en esa solución?
Respuesta1
Ejecutaría un script en las máquinas VyOS que verifica el estado de la conexión ascendente y luego lo hace ifdown
en ifup
el otro lado según sea necesario.
La forma más sencilla de hacer esto es colocar scripts /etc/network/if-down.d
(verifique si la interfaz que se inactivó es el lado actualizado y baje el otro lado) y /etc/network/if-up.d
(verifique si la interfaz que se inactivó es el lado actualizado y abra el otro lado). lado de ella es).
Alternativamente, puede ejecutar un script de monitoreo una vez por minuto con cron (o Systemd Timers, o cualquier programador similar), o puede escribirlo como un bucle infinito que duerme durante unos segundos para realizar una verificación en menos de un minuto.
Respuesta2
Escribí un script que verifica las interfaces /sys
para determinar si son miembros del puente y luego hace rebotar el puente. VyOS se utiliza netplugd
para monitorear interfaces y, por alguna razón, mi script lo confunde (probablemente escribiré una pregunta aparte para eso), pero creo que es una buena solución general.
#!/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