Mikrotik: автоматическое переключение канала на резервный и обратно

Написать данный пост меня сподвигла ситуация с отключением одного из каналов Интернета.
В самом же Интернете ответов по данному вопросу много, но не каждый является рабочим.

Что я хотел сделать, если отключается основной канал Интернета:
1. Переключиться на резервный канал (после «появления», разумеется, вернуться на основной);
2. Отправить уведомление по email о факте изменения состояния.

Кому интересно, прошу под кат.



Нам дано:
— Mikrotik RB450G с прошивкой 5.19 версии;
— 2 порта с Интернетом, один из которых для подключения использует PPPoE соединение.

Сперва добавим 2 скрипта, один из которых будет переключать на резервный канал, а второй вернет подключение к первому.

image

Составим первый скрипт, который будет активировать резервный канал и назовем его «change-to-reserv» и содержать в себе код:

/ip route set gateway=1.1.1.1 [find dst-address=0.0.0.0/0];

(Примечание: IP-адрес 1.1.1.1 выбран как пример и символизирует резервный канал)
То есть, при обнаружении отсутствия пинга на сервер (об этом чуть позже) мы будем выключать маршрут с шлюзом, указывающим на «pppoe-main«.
P.S.: После комментария erazel данная схема была улучшена, а именно раннее скрипт переключался между двумя маршрутами, которые давали сбой, а именно, если запустить с компа, например, команду ping google.ru -t, то при изменении маршрута пинг будет уходить на старый интерфейс, так как трансляция не обновилась. В предложенном же методе изменения только шлюза очистка трансляции не требуется.

Следующей строкой в этом же скрипте укажем:

/tool e-mail send server=192.168.1.1 port=25 user=robot@mysite.ru password=1PaSsW0rD1 tls=no to=admin@mysite.ru from="ROBOT<robot@mysite.ru>" \
subject="MikroTik: $[/system clock get date], $[/system clock get time]" \
body="Переключение на резервный канал\nДата: $[/system clock get date]\nAВремя: $[/system clock get time]";

где:
/tool e-mail send — отправляем уведомление на email администратора о факте изменения статуса
server=192.168.1.1 — SMTP-сервер. Так как у нас используется свой, указываю его;
port=25 — в версии RouterOS 5.x порт указывается отдельно. В нашем случае он по-умолчанию 25;
user=robot@mysite.ru — логин пользователя для авторизации на SMTP-сервере (если требуется);
password=1PaSsW0rD1 — указываем пароль (если требуется);
tls=no — TLS-шифрование трафика. У нас нет, ставлю «no», а если и будет — «yes»;
to=admin@mysite.ru — на какой email-адрес будет приходить уведомление;
from=«ROBOT<robot@mysite.ru>» — от кого будет приходить уведомление (в моем случае совпадает с логином авторизации. В скобках указывается адрес отправителя, а перед ним имя, отображаемое во входящей почте);
subject=«MikroTik: $[/system clock get date], $[/system clock get time]» — указываем заголовок письма. В данном случае он будет иметь вид «MikroTik: jul/30/2014, 10:52:13» (дата и время отправки сообщения);
body=«Переключение на резервный канал\nДата: $[/system clock get date]\nAВремя: $[/system clock get time]»; — соответственно, само тело сообщения, которое будет иметь вид:

Переключение линии на резервный канал
Дата: jul/30/2014
Время: 10:52:13

В итоге, наш скрипт будет иметь вид (RouterOS 5.19):

/ip route set gateway=1.1.1.1 [find dst-address=0.0.0.0/0];
/tool e-mail send server=192.168.1.1 port=25 user=robot@mysite.ru password=1PaSsW0rD1 tls=no to=admin@mysite.ru from="ROBOT<robot@mysite.ru>" \
subject="MikroTik: $[/system clock get date], $[/system clock get time]" \
body="Переключение на резервный канал\nДата: $[/system clock get date]\nAВремя: $[/system clock get time]";

И для RouterOS 6.17:

/ip route set gateway=1.1.1.1 [find dst-address=0.0.0.0/0];
/tool e-mail send server=192.168.1.1 port=25 user=robot@mysite.ru password=1PaSsW0rD1 to=admin@mysite.ru from="ROBOT<robot@mysite.ru>" \
subject="MikroTik: $[/system clock get date], $[/system clock get time]" \
body="Переключение на резервный канал\nДата: $[/system clock get date]\nAВремя: $[/system clock get time]";

Как уже писал выше, сохраним его под именем «change-to-reserv» и приступим к написанию второго скрипта:

/ip route set gateway=pppoe-main [find dst-address=0.0.0.0/0];
/tool e-mail send server=192.168.1.1 port=25 user=robot@mysite.ru password=1PaSsW0rD1 tls=no to=admin@mysite.ru from="ROBOT<robot@mysite.ru>" \
subject="MikroTik: $[/system clock get date], $[/system clock get time]" \
body="Переключение на основной канал\nДата: $[/system clock get date]\nAВремя: $[/system clock get time]";

В отличие от первого скрипта, в теле отправляемого email-сообщения мы укажем «Переключение на основной канал» и включим раннее отключенный маршрут.
Сохраним наш скрипт под именем «change-to-main«.

Так как память у Mikrotik не резиновая, мы оптимизируем наш скрипт для выполнения поставленной задачи.
Для этого нам необходимо использование утилиты Netwatch, которая работает как тригер. То есть, если состояние подключение изменится, то сменится и статус с выполнением нужных нам скриптов.

image

В Netwatch мы добавим новое правило, где укажем хост 8.8.8.8 и имена скриптов во вкладках «Up» — «change-to-main» и «change-to-reserv» во вкладке «Down» соответственно.
Также следует указать период проверки состояния. У нас указана 1 минута.

image

Дальше следует завершающий шаг — проброс маршрута. Если этого не сделать, то скрипт сработает на переключение к резервному каналу и останется в данном положении. Обратный переход будет возможен если резервный канал «упадет».

В общем, добавляем маршрут с указанием следующих данных:
Dst. Address = 8.8.8.8 // Указываем, что будем пинговать DNS-сервер Гугла (для меня не критично, указываю его);
Gateway = pppoe-main // То самое PPPoE-соединение на основной канал
Distance = 1
Остальные параметры оставляем как есть.

image

Всё!

Отныне принцип работы следующий:
Netwatch через основной канал будет проверять пинг до DNS-сервера Google. Как только пинг пропадет, выполнится скрипт «change-to-reserv«, указанный на вкладке «Down«. Данный скрипт отключит основной маршрут (PPPoE) и все пакеты будут идти по резервному каналу. Как только пинг по основному каналу возобновится, скрипт вновь активирует маршрут основного канала (параметр Distance которого, разумеется, «1«, а резервного — «2«). Вместе с этим будут приходить уведомления на email-адрес о фактах изменения состояния.

Profit!

ВНИМАНИЕ!!! Для работы скриптов под управлением RouterOS 6.17 необходимо внести изменения в скрипт отправки email-адреса, а именно убрать параметр «tls=«.
То есть, наш код (например, для переключения на резервный канал) будет иметь вид:

/ip route set gateway=1.1.1.1 [find dst-address=0.0.0.0/0];
/tool e-mail send server=192.168.1.1 port=25 user=robot@mysite.ru password=1PaSsW0rD1 to=admin@mysite.ru from="ROBOT<robot@mysite.ru>" \
subject="MikroTik: $[/system clock get date], $[/system clock get time]" \
body="Переключение на резервный канал\nДата: $[/system clock get date]\nAВремя: $[/system clock get time]";

 

 

Скопипащено с Хабра

Вы можете оставить комментарий, или ссылку на Ваш сайт.

Оставить комментарий