Bridge

同步網橋介面的狀態

  • March 18, 2018

我們有冗餘的 10G 光纖連結到我們的上游網際網路提供商,處於活動/故障轉移配置中。在我們的路由器和上游路由器之間,我們有一對以透明模式執行 Vyos 的防火牆。我們使用 BGP 進行路由通告,我們無法更改大部分參數。

繪畫:網路佈局圖

如果到其中一個路由器的鏈路出現故障(例如,x圖中帶有 的那個 - 這恰好是我們最常見的故障類型),整個網路將無法訪問,直到 BGP 超時(最多 150 秒)。我已經知道,如果我們強制關閉橋另一側的鏈路,我們的路由器將立即開始通過另一條鏈路轉發流量。

如果另一側發生故障,是否有某種方法可以自動關閉防火牆上橋的一側?

該解決方案是否有任何隱藏的陷阱?

我編寫了一個腳本來檢查介面/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

我會在 VyOS 機器上執行一個腳本來檢查上游連接的狀態,然後根據需要在另一端執行ifdown/ 。ifup

執行此操作的最簡單方法是將腳本放入/etc/network/if-down.d(檢查出現故障的界面是否是更新的一側並關閉另一側)和/etc/network/if-up.d(檢查出現的界面是否是更新的一側並打開另一側它的一面是)。

或者,您可以使用 cron(或 Systemd Timers,或任何類似的調度程序)每分鐘執行一次監控腳本,或者您可以將其編寫為無限循環,休眠幾秒鐘以進行亞分鐘檢查。

引用自:https://serverfault.com/questions/899110