Intereting Posts
синхронизировать или асинхронно для массового дублирования USB? parted: неверный токен: swap попробуйте загрузить файл с сервера, если известен путь Можно ли смешивать зоны с включенным DNSSEC и отключенным в BIND? Каковы пользовательские группы openSUSE 13.1 по умолчанию? Найдите, какие каталоги каждой группы могут получить доступ libdvbv5 – как добавить поддержку стандарта KU-CIRCULAR? Как отметить даты, которые были в прошлом? Динамически читать имя функции bash изнутри функции bash Невозможно планировать задачи в crontab Изменение размера и обрезка изображений с соотношением сторон 6×4 с шириной 1024 пикселя Есть ли способ поддерживать счет в кронтабе? Каков наилучший способ настройки каталогов разделяемых файловых систем? (за пределами стандартных unix perms) Как поменять два последних аргумента командной строки? Как предотвратить / sda / sdb изменения между загрузками?

Изменение интернет-канала при ошибке

Ситуация:

  • 2 интернет-соединения – A и B – оба подключены к маршрутизатору linux.
  • 2 таблицы маршрутизации, один по умолчанию через A, второй по умолчанию через B.
  • iptables и ip rule выбирают «лучшую» таблицу для определенного трафика.

Все работает нормально, но – это статическая конфигурация.

Что делать – если одна из интернет-ссылок терпит неудачу? В этом сценарии все должно пройти через вторую, правильную ссылку. И – когда неудавшаяся ссылка вверх – все должно вернуться к ситуации, когда трафик проходит по обеим ссылкам.

Существуют ли какие-либо «стандартные» инструменты для подобных действий? это не проблема, чтобы написать что-то (скрипт), что делать такие вещи, но – может быть, есть больше стандартных инструментов?

(определение неудачной ссылки – один из важных ip недоступен для конкретной ссылки, но доступен из второй ссылки).

Мои маршрутизаторы с несколькими WAN-серверами Draytek могут использовать либо ping, либо arp для мониторинга keep-alive через ethernet и VPN-соединения. (Очевидно, что для xDSL есть лучшие альтернативы.) Ssh и OpenVPN можно настроить для создания внутренних keepalives. Я не знаю другого стандартного подхода.

Что-то вроде этого (непроверено):

 ROUTE1=up LINK1=up COUNT1=3 ROUTE2=up LINK2=up COUNT2=3 SHOUT=once while sleep 5 do if ping {destination_via1} then LINK1_UP=up COUNT1=3 else [[ 0 -lt $COUNT1 ]] && COUNT1=$((COUNT1 - 1)) [[ 0 -ge $COUNT1 ]] && LINK1=down fi if ping {destination_via2} then LINK2_UP=up COUNT2=3 else [[ 0 -lt $COUNT2 ]] && COUNT2=$((COUNT2 - 1)) [[ 0 -ge $COUNT2 ]] && LINK2=down fi if [[ down = $LINK1 -a up = $ROUTE1 ]] then # add code here to remove route via LINK1 # ROUTE1=down elif [[ up = $LINK1 -a down = $ROUTE1 ]] # add code here to add route via LINK1 # ROUTE1=up SHOUT=once fi if [[ down = $LINK2 -a up = $ROUTE2 ]] then # add code here to remove route via LINK2 # ROUTE2=down elif [[ up = $LINK2 -a down = $ROUTE2 ]] # add code here to add route via LINK2 # ROUTE2=up SHOUT=once fi if [[ once = $SHOUT -a down = $ROUTE1 -a down = $ROUTE2 ]] then # add code here to shout that both routes are down # SHOUT=no fi done