
활성/장애 조치 구성에서 업스트림 인터넷 공급자에 대한 중복 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