Резервирование канала на Mikrotik

Интернет
После обновления Микротика до прошивки 6.42.6 (stable) перестали срабатывать скрипты привязанные к узлам Netwatch.
Нашлось временное решение убрать галочки в разрешениях скрипта, но полностью проблему не решило, так как глобальные переменные перестали быть глобальными и переключение канала в случае отвала больше не работало как раньше.
резервный канал на микротике
В тырнете на сайте serveradmin.ru взял первый попавшийся скрипт переключения канала на резерв в случае падения основного.
Понравилась идея, берём и модернизируем, добавляем что-то своё и удаляем что- то ненужное.

Значит задача
переключиться на резервный канал в случае потери 100% ping до узлов например яндекс днс 77.88.8.2, 77.88.8.88.
Использовать можно любые на Ваш взгляд надёжные узлы для проверки эхо, но не шлюз провайдера ибо он может быть доступен но недоступен доступ в тырнет.

В примере шлюз
192.168.99.1 — является шлюзом основного канала
192.168.88.1 — является шлюзом резервного канала

Все адреса прописаны без использования DHCP клиента чтобы динамически не прилипали маршруты и прочие гадости.

1. Первым делом загоняем эти два узла в ROUTE и маршрут для них будет через основной канал.

2. После создаём основной маршрут 0.0.0.0/0 в шлюз 192.168.99.1
Комментируем этот маршрут словом "OUT" для того чтобы скрипт знал что менять.
Удаляем если есть другие 0.0.0.0/0

3. Создаём скрипт с именем например checkrezerv


:local PingCount 3;
:local CheckIp1 77.88.8.88;
:local CheckIp2 77.88.8.2;
:local isp1 [/ping $CheckIp1 count=$PingCount];
:local isp2 [/ping $CheckIp2 count=$PingCount];
:local dfGw [ip route get [find comment="OUT"] gateway ]; 

#:log warning $isp1;
#:log warning $isp2;
#:log warning $dfGw;


:if (($isp1=0) && ($isp2=0) && ($dfGw="192.168.99.1")) do={ 
:log warning "Perehod na Rezerv";
ip route set gateway=192.168.88.1 [find dst-address=0.0.0.0/0 && comment="OUT"];
:foreach i in=[/ip firewall connection find ] do={ /ip firewall connection remove $i }  
}

:if (($isp1>1) &&($isp1>1) && ($dfGw="192.168.88.1")  ) do={  
:log warning "Perehod na Osnovnoy";
ip route set gateway=192.168.99.1 [find dst-address=0.0.0.0/0 && comment="OUT"];
:foreach i in=[/ip firewall connection find ] do={ /ip firewall connection remove $i }   

}


4. Создаём в планировщике новое задание с интервалом в пол минуты. загоняем туда checkrezerv
для отладки можно раскоментить # и смареть логи чётам.

ЗЫ Есть такие случаи когда ответы будут идти а Инэта не будут. Это грабля.
Соединения рвутся в фаерволе после переключения для того чтобы не висели и сразу перекладывались на новый маршрут.
Подобное переключение каналов на резерв делалось на OPENWRT и роутере tp-link, мне это больше понравилось тем что в юниксподобных ОС комманда пинг работает с ключами направляющими в определённый интерфейс без прописания маршрута. Да и Баш скрипты всётаки человечнее.

Для самых внимательных специально допущена ошибка

($isp1>1) &&($isp1>1)

Понятно что надо изменить?

А также возможно правильней было бы использовать ИЛИ заместо И
(($isp1>0) || ($isp2>0))
Ведь один узел может перестать отвечать а другой будет доступен.

и кстати это тоже можно короче
[find comment="OUT"]


и Незабываем блочить UDP торентчиков после переключения.

Ну а теперь ГРАБЛИ!

Что будет делать маршрутизация с прописанными вручную маршрутами до узлов проверки если выдернуть провод из порта основного канала?
Наверно станут неактивными. А после чего скрипт переключит на резерв и вероятно маршрутом до узлов станет маршрут по умолчанию и пинга вновь пойдёт что приведёт к обратному переключению на нерабочий канал… ИМХО. Ну вобщем то так.

Чтобы допилить это могу дать наводку, сами допилите)
Это скрипт проверки доступности(активности) интерфейса на микротике
:if ([/interface ethernet get ether1 running ] = true) do={
log warning "Ether1 ONLINE";
} else {:log warning "Ether1 off";}

1 комментарий

комментарий был удален
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.