четверг, 14 мая 2015 г.

Failover Mikrotik.

  Мой вариант Failover на Mikrotik проверенный временем. Для двух каналов интернет. IP от провайдеров получаем по DHCP. Канал velton считаем главный, dsl второстепенный. Маршруты (основной шлюз) прописываем ручками.
  Для начала на каждый канал нужно создать по два маршрута:
/ip route
add comment=Ukrtel_mark distance=1 gateway=X.X.X.X routing-mark=dsl
add comment=Velton_mark distance=1 gateway=Y.Y.Y.Y routing-mark=velton
add comment=Velton distance=1 gateway=Y.Y.Y.Y
add comment=Ukrtel distance=2 gateway=X.X.X.X
  Это нужно что б при отвале главного маршрута мы могли проверять доступность интернета на интерфейсе через промаркированный маршрут. Обращаем внимание на метрику!!! Этим определяется какой маршрут приоритетный. Теория такова, мы всегда проверяем только главный канал, если он не активный, то переключаем всех на резервный. Резервный на работоспособность не проверяем, т.к. если не работает не тот не тот, то смысла переключать нет. Пингуем 3 попытками 3 хоста: ya.ru, www.ua, 8.8.8.8, если два первых невозможно отрезольвить то подставляем другие айпи:  77.88.8.8, 208.67.222.222.
interface=ether1-velton можно не указывать, например тогда, когда у нас isp провайдер дает инет по pppoe и при отвале этого интерфейса микротик не может пингануть и скрипт вываливается в ошибку. В таком случаем используем строчку для пинга без указания интерфейса (interface=ether1-velton убрать с скрипта во всех повторениях). Так же в начале мы проверяем статус главного маршрута, это нужно для того, что б после того как инет на главном isp пропал скрипт, который первый раз уже переключил микротик на резервный канал не пытался сделать это заново и не засорял лог.
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#   23q
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
:local status [ip route get value-name=active [find comment=Velton]];
:local PingCount 3;
:local PingResult1;
:local PingResult2;
:local PingResult3;
# yandex dns
:local PingTarget1reserv 77.88.8.8;
:local PingTarget1serv false;
:local PingTarget1;
:set $PingTarget1 [:pick [:do {:resolve ya.ru} on-error={:set PingTarget1serv true}] 1];
# OpenDNS
:local PingTarget2reserv 208.67.222.222;
:local PingTarget2serv false;
:local PingTarget2;
:set $PingTarget2 [:pick [:do {:resolve www.ua} on-error={:set PingTarget2serv true}] 1];
# Google Public DNS
:local PingTarget3 8.8.8.8;
if ($PingTarget1serv =  true) do={:set PingResult1 [/ping $PingTarget1reserv count=$PingCount interface=ether1-velton routing-table=velton]} else={:set PingResult1 [/ping $PingTarget1 count=$PingCount interface=ether1-velton routing-table=velton]};
if ($PingTarget2serv =  true) do={:set PingResult2 [/ping $PingTarget2reserv count=$PingCount interface=ether1-velton routing-table=velton]} else={:set PingResult2 [/ping $PingTarget2 count=$PingCount interface=ether1-velton routing-table=velton]};
:set $PingResult3 [/ping $PingTarget3 count=$PingCount interface=ether1-velton routing-table=velton];
:if (($PingResult1 + $PingResult2 + $PingResult3) >= (2 * $PingCount)) do={ if ($status=true) do={} else={/ip route enable [find comment=Velton]}}  else={ if ($status=true) do={/ip route disable [find comment=Velton]} else={}}
   В скрипт между попытками можно добавить задержки. Так же при переключении можно сбрасывать коннекшены, как это сделать читайте тут. Ну и этот скрипт у меня отрабатываем каждый 40 секунд. Если добавляем задержки между попытками то корректируем время в Scheduler.

Подписаться на новые статьи.

2 комментария:

  1. а если восстановится основной канал?

    ОтветитьУдалить
    Ответы
    1. специально для этого у нас и создан маршрут routing-mark=velton, и строчкой "ip route get value-name=active [find comment=Velton]" мы проверяем активность основного маршрута. Если основный маршрут не активен, а пинг по маркированному маршруту проходит, мы считаем что основной isp уже рабочий, и строчкой "/ip route enable [find comment=Velton]" включаем его. Поэтому если восстановится основной канал - все переключится назад.

      Удалить