브리지 인터페이스 상태 동기화

브리지 인터페이스 상태 동기화

활성/장애 조치 구성에서 업스트림 인터넷 공급자에 대한 중복 10G 광섬유 링크가 있습니다. 라우터와 업스트림 라우터 사이에는 투명 모드에서 Vyos를 실행하는 한 쌍의 방화벽이 있습니다. 우리는 경로 광고에 BGP를 사용하며 대부분의 매개변수를 변경할 수 없습니다.

그림:네트워크 레이아웃 그리기

라우터 중 하나에 대한 링크가 다운되면(예: x그림에 있는 링크 - 이것이 가장 일반적인 유형의 실패임) BGP 시간 초과(최대 150초)까지 전체 네트워크에 액세스할 수 없습니다. 브리지 반대편의 링크를 강제로 다운시키면 라우터가 즉시 다른 링크를 통해 트래픽을 전달하기 시작한다는 것을 이미 알고 있습니다.

다른 쪽이 다운되면 방화벽의 브리지 한쪽을 자동으로 다운시키는 방법이 있습니까?

해당 솔루션에 숨겨진 함정이 있나요?

답변1

업스트림 연결 상태를 확인한 다음 필요에 따라 반대편에서 ifdown/를 수행하는 스크립트를 VyOS 시스템에서 실행합니다.ifup

이를 수행하는 가장 간단한 방법은 스크립트를 삽입하는 것입니다 /etc/network/if-down.d(다운된 인터페이스가 업데이트된 쪽인지 확인하고 다른 쪽을 가져옵니다). 그리고 /etc/network/if-up.d(나간 인터페이스가 업데이트된 쪽인지 확인하고 다른 쪽을 가져옵니다) 측면입니다).
또는 cron(또는 Systemd Timers 또는 유사한 스케줄러)을 사용하여 1분에 한 번씩 모니터링 스크립트를 실행하거나 몇 초 동안 대기하는 무한 루프로 작성하여 1분 미만의 검사를 받을 수 있습니다.

답변2

/sys인터페이스를 검사하여 브리지 구성원인지 확인한 다음 브리지를 반송하는 스크립트를 작성했습니다 . VyOS는 netplugd인터페이스를 모니터링하는 데 사용하는데 어떤 이유로 내 스크립트가 혼동을 주지만(아마도 이에 대해 별도의 질문을 작성할 것입니다), 좋은 일반적인 솔루션이라고 생각합니다.

#!/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

관련 정보