В расширении статьи “Настройка двух провайдеров на MikroTik, балансировка и автопереключение →” будет рассмотрен сценарий, когда маршрут не работает, но при этом не переключается по параметру Distance:
- не обновляется IP по DHCP;
- шлюз провайдера виден, а за ним нет сети;
- не корректно отрабатывает PPPOE подключение при плохой связи.
Для решения задачи по корректному автопереключению стоит обратиться к утилите Netwatch, принцип которой состоит из действий: отправка ICMP запросов будет сопровождаться выполнением скрипта под изменение состояния UP и DOWN. В обоих сценариях будет заложена логика, в соответствии с техническим требованием.
Как настроить Netwatch в MikroTik для переключения между провайдерами
Схема интернет подключений будет состоять из двух провайдеров, между которыми нужно организовать автоматическое переключение в случае обрыва. Как было упомянуто выше, параметр Distance и Ping не всегда может решить эту проблему. Комплекс правил по автопереключению будет состоять из настроек таких разделов:
- Создание записи Netwatch с соответствующими сценариями при состоянии UP и DOWN;
- Запрет отправки пакетов узлов указанных в Netwatch через другие интерфейсы(Firewall);
- Создание статических маршрутов(Routes) для трафика Netwatch.
Создание правила Netwatch
Настройка находится Tools→Netwatch
/tool netwatch add disabled=yes down-script="/ip route disable [find comment=\"ISP-1\"]\r\ \n/ip route enable [find comment=\"ISP-2\"]\r\ \n:foreach i in=[/ip firewall connection find protocol~\"tcp\"] do={ /ip f\ irewall connection remove \$i }" host=8.8.8.8 interval=30s up-script="/ip \ route disable [find comment=\"ISP-2\"]\r\ \n/ip route enable [find comment=\"ISP-1\"]\r\ \n:foreach i in=[/ip firewall connection find protocol~\"tcp\"] do={ /ip f\ irewall connection remove \$i }"
Запрет на отправку пакетов для Netwatch через другие интерфейсы
Настройка находится IP→Firewall→Filter rules
/ip firewall filter add action=drop chain=output dst-address=8.8.8.8 out-interface=!ether1
Создание статического маршрута для работы Netwatch
Настройка находится IP→Routes
/ip route add distance=1 dst-address=8.8.8.8/32 gateway=ether1
В качестве gateway нужно указать или шлюз провайдера(его IP адрес) или интерфейс, в таком варианте подключения как pppoe client.
При переключении провайдеров в MikroTik не работает SIP или видеонаблюдение
Дело в том, что когда происходит переключение между провайдерами, старое соединение между внешним SIP телефоном и АТС “Asterisk” продолжает быть активным, но не работает из-за перестроенной таблицы маршрутизации. В этом случае нужно дополнить правила переключения провайдеров очисткой:
TCP соединений
:foreach i in=[/ip firewall connection find protocol~"tcp"] do={ /ip firewall connection remove $i }
UDP соединений
:foreach i in=[/ip firewall connection find protocol~"udp"] do={ /ip firewall connection remove $i }
или с дополнением по порту
:foreach i in=[/ip firewall connection find dst-address~":5060" protocol~"udp"] do={ /ip firewall connection remove $i }
или по IP
:foreach i in=[/ip firewall connection remove [find where src-address~"192.168.1.101"]] do={ /ip firewall connection remove $i }
Список всех соединений можно посмотреть в IP→Firewall→Connection
Netwatch не работает, основной провайдер меняет шлюз у DHCP client
Для решения этой проблемы можно адаптировать такие скрипты:
Вариант-1
:global ispgw [ip dhcp-client get [/ip dhcp-client find interface=ether1] gateway ]; :global ispgwstat [ip route get [/ip route find comment="ISP-1" ] gateway ]; #:log info ("$ispgw" ) #:log info ("$ispgwstat" ) :if ($ispgw = $ispgwstat ) do={ :log info ("ISP-1 Gateway is OK" ) } else={ ip route set [/ip route find comment="ISP-1"] gateway=$ispgw; :log info ("ISP-1 Gateway WAS CHANGED" )}
который сравнивает установленное значение gateway провайдера ISP-1 в маршрутах Routes со значением gateway, установленного в DHCP client.
Вариант-2
В свойствах DHCP клиента добавить скрипт
{ :local rmark "ISP-1" :local count [/ip route print count-only where comment="ISP-1"] :if ($bound=1) do={ :if ($count = 0) do={ /ip route add gateway=$"gateway-address" comment="ISP-1" distance=1 } else={ :if ($count = 1) do={ :local test [/ip route find where comment="ISP-1"] :if ([/ip route get $test gateway] != $"gateway-address") do={ /ip route set $test gateway=$"gateway-address" } } else={ :error "Multiple routes found" } } } else={ /ip route remove [find comment="ISP-1"] } }
который будет отрабатывать на любое изменение статуса DHCP клиента, удаляя и создавая новый маршрут в таблице маршрутизации.
Настройка Netwatch для балансировки нагрузки двух провайдеров
Данные правила будут регулировать работу интернет каналов, если один из провайдеров перестанет работать. Ниже приведён отрезок из рабочей конфигурации, который передаваёт последовательность настроек.
Настройка Firewall
Правилами необходимо запретить отправку пакета для тестирования статуса интернет канала через другой интерфейс. Т.е. конкретный PING должен уходить только через определённого провайдера.
Настройка находится в основном меню Ip→Firewall→Filter Rules
/ip firewall filter add action=drop chain=output dst-address=77.88.8.2 out-interface=!ether1 \ protocol=icmp add action=drop chain=output dst-address=77.88.8.1 out-interface=ether1 \ protocol=icmp
Настройка маршрутизации
Будет создано три маршрута: отдельный для балансировки и два отдельных маршрута на случай падения одного из провайдеров.
Настройка находится в основном меню Ip→Routes→Routes
/ip route add comment=ISP-12 disabled=yes distance=1 dst-address=77.88.8.1/32 gateway=\ 77.121.98.129,pppoe-Datagroup add comment=ISP-1 disabled=yes distance=2 dst-address=77.88.8.1/32 gateway=\ 77.121.98.129 add comment=ISP-2 disabled=yes distance=3 dst-address=77.88.8.1/32 gateway=\ pppoe-Datagroup
Настройка Netwatch
В каждом действии Up и Down правило Netwatch-1 будет наблюдать за статусом правила Netwatch-2 и в зависимости от значения выполнять переключение между балансировкой и отдельным провайдером. Это также распространяется в отношении работы Netwatch-2.
/tool netwatch add comment=Netwatch-1 down-script=":local stat\r\ \n:set stat [/tool netwatch get [find comment=\"Netwatch-2\"] status]\r\ \n:if (\$stat=\"up\") do={\r\ \n/ip route enable [find comment=\"ISP-2\"]\r\ \n}\r\ \n/ip route disable [find comment=\"ISP-12\"]\r\ \n/ip route disable [find comment=\"ISP-1\"]\r\ \n:foreach i in=[/ip firewall connection find protocol~\"tcp\"] do={ /ip f\ irewall connection remove \$i }\r\ \n:foreach i in=[/ip firewall connection find protocol~\"udp\"] do={ /ip f\ irewall connection remove \$i }\r\ \nlog warning (\"ISP-1 IS DOWN\")" host=77.88.8.1 interval=20s up-script="\ :local stat\r\ \n:set stat [/tool netwatch get [find comment=\"Netwatch-2\"] status]\r\ \n:if (\$stat=\"up\") do={\r\ \n/ip route enable [find comment=\"ISP-12\"]\r\ \n}\r\ \n:if (\$stat=\"down\") do={\r\ \n/ip route enable [find comment=\"ISP-1\"]\r\ \n}\r\ \n/ip route disable [find comment=\"ISP-2\"]" add comment=Netwatch-2 down-script=":local stat\r\ \n:set stat [/tool netwatch get [find comment=\"Netwatch-1\"] status]\r\ \n:if (\$stat=\"up\") do={\r\ \n/ip route enable [find comment=\"ISP-1\"]\r\ \n}\r\ \n/ip route disable [find comment=\"ISP-12\"]\r\ \n/ip route disable [find comment=\"ISP-2\"]\r\ \n:foreach i in=[/ip firewall connection find protocol~\"tcp\"] do={ /ip f\ irewall connection remove \$i }\r\ \n:foreach i in=[/ip firewall connection find protocol~\"udp\"] do={ /ip f\ irewall connection remove \$i }\r\ \nlog warning (\"ISP-2 IS DOWN\")" host=77.88.8.2 interval=20s up-script="\ :local stat\r\ \n:set stat [/tool netwatch get [find comment=\"Netwatch-1\"] status]\r\ \n:if (\$stat=\"up\") do={\r\ \n/ip route enable [find comment=\"ISP-12\"]\r\ \n}\r\ \n:if (\$stat=\"down\") do={\r\ \n/ip route enable [find comment=\"ISP-2\"]\r\ \n}\r\ \n/ip route disable [find comment=\"ISP-1\"]"
Netwatch хороший инструмент для переключения между провайдерами. Работает всегда и безотказно. Но вот когда мы завели 3 провайдера, все правила на порядок усложнились
есть проблема, не всегда происходит переключение между 2 провайдерами. Правила в Netwatch заданы, но микротик не переключается. Можете проверить мою настройку?
Замечено, что netwatch работает корректно только при условии, когда каналы маскарадятся одним правилом, используя interface-list.
Если каналы маскарадить отдельно по каждому каналу, то netwatch либо не работает совсем либо работает некорректно …
Здравствуйте,
При добавление статического маршрута IP -> Routes на 8.8.8.8 Interface=ether1 пинг на 8.8.8.8 постоянно timeout. При отключении маршрута пинги опять проходят. Из-за этого невозможно корректно использовать скрипт по пингам или netwatch. Не подскажете в чем может быть дело?
В интерфейсе IP -> Routes на 8.8.8.8 Interface=ether1 нужно сказывать шлюз вашего провайдера
Что делать в том случае если я шлюз провайдера получаю по DHCP и он периодически меняется?
Провайдер меняет шлюз в DHCP клиенте
На RouterOS 7.5 не работает
/ip route disable [find comment=\”ISP-1\”]
работает вот в таком виде
/ip route disable [find comment=”ISP-1″]
строка
:foreach i in=[/ip firewall connection find protocol~\”tcp\”] do={ /ip firewall connection remove \$i }”
тоже не работает с ошибкой ругается на знак “\”
missing value for where (line 1 column 54)
Есть обновленная версия статьи(не под версию RouterOS 7)
Настройка двух провайдеров на MikroTik, балансировка и автопереключение
Нужно как раз для RouterOS 7
Спасибо. Помогло
Можно подробнее пояснить для балансировки?