вторник, 9 января 2018 г.

Mikrotik Advanced Failover: автоматическое переключение между основным каналом и 3G. Проверка основного интернет-канала и отправка SMS-уведомлений из Mikrotik

В рамках вводной публикации, опубликованной ранее, были изложены основные моменты подключения 3G-модема к маршрутизатору Mikrotik, на примере Huawei E173 и RB952Ui-2nD (hAP). Также мы рассмотрели базовые настройки для резервирования Интернет-канала. В рамках этой публикации описаны важные аспекты, касающиеся 3G модема и тарифного плана, а также процесс настройки автоматического переключения интернет-канала при отсутствии доступа к интернет-ресурсам.  
  Если вы еще не выбрали маршрутизатор, чтобы не растеряться во всем разнообразии Mikrotik, советуем обратить свое внимание на следующие модели: RB951Ui-2nD (hAP), 952UI-5ac2nD (hAP ac lite), RB951Ui-2HnD, RB951G-2HnD, RB962UiGS-5HacT2HnT (hAP ac). Все эти модели оснащены портом USB и позволяют подключать модемы 3G/4G. Обратите внимание, в hEX отсутствует модуль Wi-Fi. Для более требовательных подойдет RB2011 и RB3011. Эти и многие другие модели вы можете найти в интернет-магазине ASP24.   Выбор тарифа, система «My Lifecell» Выбирая тарифный план для 3G-модема, обращайте внимание на стоимость, объем траффика и дополнительные услуги. Основное предназначение модема – доступ к Интернет, поэтому дополнительные услуги (бесплатные минуты в сети) нам попросту не нужны. У оператора Lifecell есть специальные тарифные планы для планшетов и 3G-роутера, которые отличаются более высоким объемом включенного траффика. Лично я выбрал тариф «3G+ Гаджет». Данный тарифный план доступен в трех вариантах, с абонплатой 49, 89 и 149 грн. в месяць. В зависимости от размера абонплаты, объем месячного траффика составляет 2, 6 или 14 Гб. При использовании с модемом Huawei E173, этот тариф будет намного более выгодным, нежели «3G+ Смартфон». Самым выгодным тарифом является «3G+ Роутер», для которого доступно 20 Гб за 129 грн. При желании, Wi-Fi роутер также можно подключить к Mikrotik. Точнее наоборот, подключить Mikrotik к беспроводной сети роутера (CPE). Лично мне вариант с модемом показался более интересным за счёт возможности отправки SMS прямо с Mikrotik, о чем мы поговорим чуть ниже. Первым делом нам нужно получить пароль для доступа в систему «My lifecell». Для этого, используя SIM-карту модема, необходимо отправить SMS с текстом «PAROL» на номер 123. Лично я отправлял SMS используя оригинальное приложения модема для Windows, предварительно подключив модем к ПК. В ответном сообщении вы получите новый пароль для входа в систему. Личный кабинет My Lifecell позволяет следить за балансом и управлять дополнительными услугами. У тарифа «3G+ Гаджет» есть небольшой минус. Все дело в том, что данный тариф предназначен в первую очередь для доступа к Интернет, поэтому стоимость 1 SMS, по-умолчанию, составляет 1 грн. Поскольку я предполагаю использование SMS-оповещений, то мне требуется дополнительный пакет SMS – не платить же по 1 гривне за каждое сообщение? В разделе «Тарифные планы и услуги – Услуги» во вкладке «Обмен сообщениями» для тарифного плана «3G+ Гаджет» можно заказать один из трех пакетов. Я остановился на пакете 50 SMS на неделю за 6 грн, чего должно быть более, чем достаточно для уведомлений об отключенном интернете. Если вы предполагаете отправлять больше сообщений, можно заказать 350 или 1000 сообщений на месяц с соответствующей доплатой. «Huawei Terminal» прямо на Mikrotik? С тарифным планом и SMS разобрались. Теперь вернемся к нашему модему Huawei E173. Для 3G-модемов доступно конфигурирование устройства через терминал с помощью AT-команд. Вы можете скачать «Huawei Terminal» в интернете и использовать его на ПК под управлением Windows. Это бывает полезно в тех случаях, когда на модеме установлен неправильный (неподходящий) режим работы и Mikrotik его не видит. Перечень AT команд необходимо искать под определенную модель! Если же Mikrotik видит модем, вы можете воспользоваться встроенным средством самой RouterOS. Откройте «New Terminal» и выполните команду system serial-terminal port=usb1 channel=0 Обратите внимание на название порта, он должен соответствовать тому, на котором смонтировался модем в Mikrotik. Если с первой попытки подключиться не удалось, попробуйте изменить Channel в пределах 0-3. Для того, чтобы проверить, отвечает ли нам модем, можно воспользоваться командой «AT». Ниже приведу список проверенных для Huawei E173 команд: ATI – получить информацию об устройстве; AT^CARDLOCK? – проверить блокировку и количество попыток разблокировки. Первая цифра обозначает блокировку: 1 – модем заблокирован под оператора, 2 – модем не заблокирован. Вторая цифра обозначает количество оставшихся попыток разблокировки, по-умолчанию 10. AT^SETPORT? – отображение текущей конфигурации. В моем случае модем выдал "A1,A2;1,16,3,2,A1,A2", что соответствует конфигурации по-умолчанию. AT^SETPORT="параметры" – устанавливает режим работы. Более подробно список параметров рекомендую поискать в сети. Для Huawei E173 дефолтные параметры приведены выше. С помощью разных параметров можно отключать CD-ROM, карту памяти, режим сетевой карты, устанавливать приоритеты в выборе типа сети и так далее. Некоторые ресурсы советуют принудительно устанавливать режим «Только модем», якобы в этом режиме модем работает быстрее и стабильнее. Делается это командой: AT^SETPORT="A1,A2;1,2,3" Подробно останавливаться на AT-командах я не буду, в интернете вы сможете найти всю информацию самостоятельно. Advanced Failover: настройка автоматического переключения между основным провайдером и 3G-модемом Итак, у вас уже есть достаточно знаний для подключения модема. Пришло время настроить продвинутое автоматическое переключение. За основу взят «Универсальный скрипт переключения 2-х каналов интернета Mikrotik». Скрипт был немного усовершенствован и переработан для работы в типичной для 3G конфигурации: WAN (ether1) – основной интернет-канал, DHCP (большинство провайдеров); USB 3G modem (ppp-out1) – резервный канал, мобильный оператор, 3G; Опционально: Отправка уведомлений по SMS; Включение-отключение гостевой сети Wi-Fi; Скрипт без отправки SMS и управления гостевой сетью # Set local variables :local firstInterface "ether1"; :local secondInterface "ppp-out1"; :local pingTo1 "8.8.8.8"; :local pingTo2 "77.88.8.8"; :local pingCount 3; :local stableConnectFrom 60; # Local variables :local firstInterfaceName $firstInterface; :local secondInterfaceName $secondInterface; # Function to cleaning ARP table :local clearArp do={     :local dumplist [/ip arp find]     :foreach i in=$dumplist do={         /ip arp remove $i     }     :log warning ("ARP cleaned"); } # Function reconnect 3G :local reconnect3G do={     :log warning ("Rebooting 3G before using");     /interface ppp-client set $nameInterface disable=yes;     :delay 1s;     /interface ppp-client set $nameInterface disable=no; } :log info ("Start ping to $pingTo1 and $pingTo2"); # Check FIRST interface /interface ethernet {     :if ( [get $firstInterface disable] = true) do={         set $firstInterface disable=no;         :delay 2s;     } } # Check SECOND interface /interface ppp-client {     :if ( [get $secondInterface disable] = true) do={         set $secondInterface disable=no;         :delay 8s;     } } /ip route {     # Set objects to variables     :set firstInterface [find dst-address="0.0.0.0/0" gateway=$firstInterfaceName];     :set secondInterface [find dst-address="0.0.0.0/0" gateway=$secondInterfaceName];     # Check routes     :if ( [get $firstInterface distance] != 2 ) do={         set $firstInterface distance=2;         :log warning ("Distance for " . $firstInterfaceName . " corrected");     }     :if ( [get $secondInterface distance] != 1 && [get $secondInterface distance] != 3) do={         set $secondInterface distance=3;         :log warning ("Distance for " . $secondInterfaceName . " corrected");     }     # Get ping successfully packets. In percent     :local pingStatus \         ((( [/ping $pingTo1 interface=$firstInterfaceName count=$pingCount] + \         [/ping $pingTo2 interface=$firstInterfaceName count=$pingCount] ) / ($pingCount * 2)) * 100);         # Check Internet     :if ($pingStatus < $stableConnectFrom) do={         :log error ("ProKK no internet!");         # Change distance         :if ( [get $secondInterface distance] != 1 ) do={             $reconnect3G nameInterface=$secondInterfaceName;             set $secondInterface distance=1;             :log warning ("Distance for " . $secondInterfaceName . " changed");             $clearArp;         }     } else={         :log warning ("ProKK connected");         # Change distance         :if ( [get $secondInterface distance] != 3 ) do={             set $secondInterface distance=3;             :log warning ("Distance for " . $secondInterfaceName . " changed");             $clearArp;         }     } } :log info ("End ping"); failover_basic.txt [2,66 Kb] (cкачиваний: 279) Скрипт с отправкой SMS и включением-отключением гостевой сети # Set local variables :local firstInterface "ether1"; :local secondInterface "ppp-out1"; :local pingTo1 "8.8.8.8"; :local pingTo2 "77.88.8.8"; :local pingCount 3; :local stableConnectFrom 60; # Local variables :local firstInterfaceName $firstInterface; :local secondInterfaceName $secondInterface; # Function to cleaning ARP table :local clearArp do={     :local dumplist [/ip arp find]     :foreach i in=$dumplist do={         /ip arp remove $i     }     :log warning ("ARP cleaned"); } # Function reconnect 3G :local reconnect3G do={     :log warning ("Rebooting 3G before using");     /interface ppp-client set $nameInterface disable=yes;     :delay 1s;     /interface ppp-client set $nameInterface disable=no; } # Function Enable-Disable Free Wi-Fi :local enableWLAN2 do={     /interface enable wlan2;     :log warning ("Guest Wi-Fi enabled!"); } :local disableWLAN2 do={     /interface disable wlan2;     :log warning ("Guest Wi-Fi disabled!"); } :log info ("Start ping to $pingTo1 and $pingTo2"); # Check FIRST interface /interface ethernet {     :if ( [get $firstInterface disable] = true) do={         set $firstInterface disable=no;         :delay 2s;     } } # Check SECOND interface /interface ppp-client {     :if ( [get $secondInterface disable] = true) do={         set $secondInterface disable=no;         :delay 8s;     } } /ip route {     # Set objects to variables     :set firstInterface [find dst-address="0.0.0.0/0" gateway=$firstInterfaceName];     :set secondInterface [find dst-address="0.0.0.0/0" gateway=$secondInterfaceName];     # Check routes     :if ( [get $firstInterface distance] != 2 ) do={         set $firstInterface distance=2;         :log warning ("Distance for " . $firstInterfaceName . " corrected");     }     :if ( [get $secondInterface distance] != 1 && [get $secondInterface distance] != 3) do={         set $secondInterface distance=3;         :log warning ("Distance for " . $secondInterfaceName . " corrected");     }     # Get ping successfully packets. In percent     :local pingStatus \         ((( [/ping $pingTo1 interface=$firstInterfaceName count=$pingCount] + \         [/ping $pingTo2 interface=$firstInterfaceName count=$pingCount] ) / ($pingCount * 2)) * 100);         # Check Internet     :if ($pingStatus < $stableConnectFrom) do={         :log error ("ProKK no internet!");         # Change distance         :if ( [get $secondInterface distance] != 1 ) do={             $reconnect3G nameInterface=$secondInterfaceName;             set $secondInterface distance=1;             :log warning ("Distance for " . $secondInterfaceName . " changed");             $clearArp;             $disableWLAN2;             /tool sms send usb1 channel=2 "+380931234567" message="ProKK failure. 3G-modem enabled! Call: (03131)5-42-22";         }     } else={         :log warning ("ProKK connected");         # Change distance         :if ( [get $secondInterface distance] != 3 ) do={             /tool sms send usb1 channel=2 "+380931234567" message="ProKK connected. 3G-modem disabled.";             set $secondInterface distance=3;             :log warning ("Distance for " . $secondInterfaceName . " changed");             $clearArp;             $enableWLAN2;         }     } } :log info ("End ping"); failover_full.txt [3,12 Kb] (cкачиваний: 153) Различия между скриптами, основные параметры Теперь о различиях. Первый код – обычная версия скрипта, которая реализует переключение на резервный канал при отсутствии доступа к Интернет. Вторая версия скрипта поддерживает отправку SMS-оповещений при отключении и повторном включении основного канала. Также реализовано отключение гостевой сети (Free Wi-Fi, wlan2), чтобы «гости» не расходовали ваш трафик 3G. При желании, можно wlan2 переименовать в wlan1 (основной беспроводной интерфейс), в этом случае будет отключаться основной интерфейс (например, если беспроводной сетью ваши сотрудники пользуются на смартфонах в личных целях). Пройдемся по параметрам: firstInterface "ether1" – в скобках содержится название интерфейса (в данном случае ether1), на котором находится основной провайдер. secondInterface "ppp-out1" – в скобках содержит название резервного подключения; pingTo1 "8.8.8.8" и pingTo2 "77.88.8.8" – содержат IP-адреса в Интернете, для которых проверяется PING. Первый адрес – Google DNS, второй – Yandex DNS. Намеренно выбраны 2 сервиса с высокой доступностью. Вы можете изменить адреса по своему усмотрению. pingCount 3 – количество пингов для каждого адреса; stableConnectFrom 60 – процент успешных пакетов, для которого соединение считается стабильным; Чем больше пингов – тем более точно можно произвести настройку переключения. В данном примере всего 6 пингов, по 3 пинга на каждый адрес. Если 4 пинга из 6 пройдут – интернет считается стабильным. Сильно увеличивая количество пингов, не забудьте увеличить интервал между запусками скрипта, иначе скрипт будет перезапущен еще до завершения всех команд. Как работает переключение между каналами Шаг 1: скрипт производит проверку обеих каналов, если интерфейс отключен – система дает команду на его включение. Для обычного интерфейса ethernet используется задержка 2 сек, чего достаточно для получения параметров сети по DHCP. Для интерфейса модема (ppp-client) установлена задержка 8 сек, т.к. получение параметров и установка соединения занимают больше времени. Шаг 2: скрипт ищет маршруты в интернет (0.0.0.0/0) с заданным названием интерфейса для каждого канала. Шаг 3: скрипт проверяет Distance для маршрута основного канала. Distance основного канала статичен и всегда равен 2. Если параметр указан неверно, система назначит ему 2 автоматически. Шаг 4: скрипт проверяет Distance для роута резервного канала. Distance может принимать значение 1 либо 3. Если параметр указан неверно, система переназначит 3 автоматически. Шаг 5: скрипт последовательно производит пинг обеих адресов, используя основной канала. Производится расчет успешного прохождения пакетов в процентном соотношении. Шаг 6-A: если процент успешных пакетов меньше заданного параметра, основной канал признается нерабочим, в лог Mikrotik пишется запись о «падении» основного канала. После чего выполняется проверка Distance для резервного канала, если он равен 1 – значит Mikrotik уже использует 3G и дальнейшие действия не требуются. Скрипт завершает свою работу. В противном случае, запускается цепочка: функция «reconnect3G» принудительно перегружает подключение модема. По большому счёту это небольшая перестраховка, т.к. бывают случаи, когда при длительном бездействии модема оператор закрывает соединение. резервному каналу назначается Distance=1, что повышает его приоритет, делая основным каналом. В логи пишется соответствующая запись; производится очистка таблицы APR (функция clearArp); отключается гостевой Wi-Fi (функция disableWLAN2); осуществляется отправка SMS-уведомления об отключении основного канала; скрипт завершает свою работу; Шаг 6-B: если процент успешных пакетов в пределах заданного лимита, система пишет в лог запись о том, что основной канал работает. После этого производится проверка Distance для резервного канала, если он не равен 3, система запускает цепочку: отправляется SMS о том, что основной канал заработал; для резервного канала устанавливается Distance=3, чем трафик перенаправляется на основной канал. В лог пишется соответствующее уведомление; выполняется очистка таблица ARP; т.к. ограничений по трафику на основном канале нет, включается гостевая сеть wlan2; скрипт завершает работу; Вот собственно и всё. Скрипт выбирайте тот, который больше вам подходит. Если у вас нет гостевой сети Если включать и отключать гостевую сеть нет необходимости, удалите из скрипта 3 следующие фрагмента: :local enableWLAN2 do={ /interface enable wlan2; :log warning ("Guest Wi-Fi enabled!"); } :local disableWLAN2 do={ /interface disable wlan2; :log warning ("Guest Wi-Fi disabled!"); } $disableWLAN2; $enableWLAN2; Настройка отправки SMS Отправка SMS осуществляется через 3G-модем стандартными средствами Mikrotik /tool sms send usb1 channel=2 "+380931234567" message="Your message"; Если SMS не отправляется, проверьте наличие денег на счету. Если деньги есть, но SMS не отправляется – попробуйте изменить channel=2 в диапазоне 0-3 (актуально для других модемов). Вместо +380931234567 не забудьте указать ваш номер в международном формате. Текст сообщений правится в message="". Обратите внимание! Кириллица не поддерживается! Как добавить скрипт в Mikrotik? Для того, чтобы добавить скрипт, необходимо вызвать System – Scripts. В появившемся окне нажимаем синий плюс. Появится новое окошко «New Script». В «Name» указываем желаемое название скрипта, например «Failover» (англ. обработка при отказе); в «Source» вставляем код скрипта. Нажимаем ОК. Далее необходимо запустить планировщик и задать интервал запуска скрипта. Вызываем System – Scheduler, создаем новое задание (New Schedule). Название можно указать любое, в «Start Time» выбираем «startup» (при запуске), после чего указываем интервал, например 30 сек. Анализируем логи Mikrotik Для того, чтобы проверить корректность работы скрипта, откройте «Log». В штатном режиме, когда основной канал работает, вы увидите в логах соответствующие периодические записи. Для удобства они имеют статус «warning» (предупреждение), из-за чего выделяются синим цветом. При отказе основного канала, вы увидите в логах запись, выделенную красным (статус error), а также все последующие действия скрипта. После каждого цикла скрипта, в логах должна присутствовать запись «End ping», если этой записи нет – скрипт выполнился не до конца. В заключение Скрипт не анализирует резервный канал на предмет доступа в Интернет, т.к. особой пользы от этого лично я не вижу. Если вам требуется обработка – вы можете дописать её самостоятельно, например, добавив в неё принудительную перезагрузку модема. Если Интернет на модеме не работает, всё же есть вероятность того, что SMS работает и у вас получится еще отправить SMS-уведомление об отказе.

Источник: https://weblance.com.ua/263-mikrotik-advanced-failover-avtomaticheskoe-pereklyuchenie-mezhdu-osnovnym-kanalom-i-3g.-proverka-osnovnogo-internet-kanala-i-otpravka-sms-uvedomleniy-iz-mikrotik.html

Комментариев нет:

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