Резервирование канала на Mikrotik
После обновления Микротика до прошивки 6.42.6 (stable) перестали срабатывать скрипты привязанные к узлам Netwatch.
Нашлось временное решение убрать галочки в разрешениях скрипта, но полностью проблему не решило, так как глобальные переменные перестали быть глобальными и переключение канала в случае отвала больше не работало как раньше.
В тырнете на сайте serveradmin.ru взял первый попавшийся скрипт переключения канала на резерв в случае падения основного.
Понравилась идея, берём и модернизируем, добавляем что-то своё и удаляем что- то ненужное.
Использовать можно любые на Ваш взгляд надёжные узлы для проверки эхо, но не шлюз провайдера ибо он может быть доступен но недоступен доступ в тырнет.
В примере шлюз
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
4. Создаём в планировщике новое задание с интервалом в пол минуты. загоняем туда checkrezerv
для отладки можно раскоментить # и смареть логи чётам.
ЗЫ Есть такие случаи когда ответы будут идти а Инэта не будут. Это грабля.
Соединения рвутся в фаерволе после переключения для того чтобы не висели и сразу перекладывались на новый маршрут.
Подобное переключение каналов на резерв делалось на OPENWRT и роутере tp-link, мне это больше понравилось тем что в юниксподобных ОС комманда пинг работает с ключами направляющими в определённый интерфейс без прописания маршрута. Да и Баш скрипты всётаки человечнее.
Понятно что надо изменить?
А также возможно правильней было бы использовать ИЛИ заместо И
(($isp1>0) || ($isp2>0))
Ведь один узел может перестать отвечать а другой будет доступен.
и кстати это тоже можно короче
и Незабываем блочить UDP торентчиков после переключения.
Наверно станут неактивными. А после чего скрипт переключит на резерв и вероятно маршрутом до узлов станет маршрут по умолчанию и пинга вновь пойдёт что приведёт к обратному переключению на нерабочий канал… ИМХО. Ну вобщем то так.
Чтобы допилить это могу дать наводку, сами допилите)
Это скрипт проверки доступности(активности) интерфейса на микротике
Нашлось временное решение убрать галочки в разрешениях скрипта, но полностью проблему не решило, так как глобальные переменные перестали быть глобальными и переключение канала в случае отвала больше не работало как раньше.
В тырнете на сайте 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 комментарий