В расширении статьи “Настройка двух провайдеров на 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\"]"