web-dev-qa-db-ja.com

ブリッジインターフェイスの状態を同期します

アクティブ/フェイルオーバー構成で、アップストリームインターネットプロバイダーへの冗長10Gファイバーリンクがあります。ルーターとアップストリームルーターの間に、Vyosを透過モードで実行しているファイアウォールのペアがあります。ルートアドバタイズメントにはBGPを使用しており、ほとんどのパラメータを変更することはできません。

図: - drawing of network layout

ルーターの1つへのリンクがダウンした場合(たとえば、図のxのリンク-これは最も一般的なタイプの障害です)、BGPタイムアウトまでネットワーク全体にアクセスできません(最大150秒)。ブリッジの反対側のリンクを強制的にダウンさせると、ルーターはすぐに他のリンクを介してトラフィックの転送を開始することを私はすでに知っています。

ファイアウォールの一方の側がダウンした場合に、もう一方の側を自動的にダウンさせる方法はありますか?

そのソリューションに隠された落とし穴はありますか?

1
yakatz

インターフェイスを/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
1
yakatz

VyOSマシンでスクリプトを実行して、アップストリーム接続の状態をチェックし、必要に応じて反対側でifdown/ifupを実行します。

これを行う最も簡単な方法は、スクリプトを/etc/network/if-down.d(ダウンしたインターフェイスが更新された側であるかどうかを確認し、その反対側をダウンさせるかどうかを確認する)と/etc/network/if-up.d(ダウンしたインターフェイスが更新されたかどうかを確認する)に配置することです。 upは更新された側であり、反対側を表示します)。
または、cron(またはSystemd Timers、または同様のスケジューラー)を使用して1分に1回監視スクリプトを実行するか、数秒間スリープして1分未満のチェックを取得する無限ループとして記述することもできます。 。

1
Moshe Katz