Синхронизировать состояния мостовых интерфейсов
У нас есть резервные 10G волоконно-оптические каналы связи с нашим восходящим интернет-провайдером в активной / отказоустойчивой конфигурации. Между нашим роутером и вышестоящим роутером у нас есть пара межсетевых экранов, на которых Vyos работает в прозрачном режиме. Мы используем BGP для рекламы маршрута и не можем изменить большинство параметров.
Если связь с одним из маршрутизаторов не работает (например, с x
на рисунке - это наш самый распространенный тип отказа), вся сеть недоступна до истечения времени ожидания BGP (до 150 секунд). Я уже знаю, что если мы принудительно отключим канал на другой стороне моста, наши маршрутизаторы немедленно начнут пересылать трафик через другой канал.
Есть ли какой-нибудь способ автоматического сброса одной стороны моста на брандмауэре, если другая сторона выйдет из строя?
Есть ли скрытые подводные камни в этом решении?
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
Я бы запустил скрипт на машинах VyOS, который проверяет состояние восходящего соединения, а затем делает ifdown
/ifup
на другой стороне по мере необходимости.
Самый простой способ сделать это - поместить сценарии в /etc/network/if-down.d
(проверьте, что интерфейс, который вышел из строя, является обновленной стороной, и опустите другую сторону, это) и /etc/network/if-up.d
(проверьте, является ли интерфейс, который был обновлен, обновленной стороной, и откройте другую сторону).
В качестве альтернативы, вы можете запускать скрипт мониторинга раз в минуту с помощью cron (или Systemd Timers, или любого другого аналогичного планировщика), или вы можете написать его в виде бесконечного цикла, который спит несколько секунд, чтобы получить субминутную проверку.