Sincronizar estados de interfaces de puente

Sincronizar estados de interfaces de puente

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.

Dibujo:dibujo del diseño de la red

Si el enlace a uno de los enrutadores falla (por ejemplo, el que tiene xen 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 ifdownen ifupel 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 /syspara determinar si son miembros del puente y luego hace rebotar el puente. VyOS se utiliza netplugdpara 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

información relacionada