Как при помощи Netwatch и нехитрых скриптов обеспечить офис бесперебойным доступом в Интернет и быть в курсе происходящего.
Прежде всего определимся как и что мы переключаем. Например, у нас есть 2 интерфейса: pppoe-out1
— который соединяется с основным провайдером (ISP1) и ether7
— к которому подключен резервный канал или второй провайдер (ISP2).
Firewall
Работоспособность каналов будем определять путем проверки доступности DNS-серверов Google 8.8.8.8 и 8.8.4.4 через каждого из провайдеров (Можно использовать и другие, лишь бы достаточно надежные. Крайне не рекомендую использовать для этого DNS-серверы провайдера.). Для этого создадим в Firewall и Route следующие правила:
/ip firewall filter add action=drop chain=output comment="8.8.8.8 for ISP1 ONLY!" \ dst-address=8.8.8.8 out-interface=ether7 add action=drop chain=output comment="8.8.4.4 for ISP2 ONLY!" \ dst-address=8.8.4.4 out-interface=pppoe-out1
То есть блокируем трафик к 8.8.8.8 для ISP2 и 8.8.4.4 для ISP1.
NAT
Включаем NAT, если это ещё не сделано.
/ip firewall nat add action=masquerade chain=srcnat src-address=LAN_subnet_here add action=masquerade chain=srcnat out-interface=pppoe-out1 add action=masquerade chain=srcnat out-interface=ether7
Routes и Mangle
Чтобы исключить путаницу запросов через разных провайдеров, будем маркировать входящие соединения от каждого провайдера и направлять исходящий трафик тому от которого пришел запрос.
Создаем маршруты с понятными метками и разными значениями distance
для каждого провайдера (На интерфейсе pppoe-out1
нужно выключить опцию Add Default Route
.). Важно: для интерфейса ether7
в качестве значения gateway
указываем адрес вместо имени.
/ip route add comment="to ISP1" \ disabled=no distance=4 dst-address=0.0.0.0/0 gateway=pppoe-out1 \ routing-mark=to-ISP1 scope=30 target-scope=10 add comment="to ISP2" \ disabled=no distance=5 dst-address=0.0.0.0/0 gateway=ether7_ip_here \ routing-mark=to-ISP2 scope=30 target-scope=10 add comment=ISP1 disabled=no \ distance=4 dst-address=0.0.0.0/0 gateway=pppoe-out1 \ !routing-mark scope=30 target-scope=10 add comment=ISP2 disabled=no \ distance=5 dst-address=0.0.0.0/0 gateway=ether7_ip_here \ !routing-mark scope=30 target-scope=10 add check-gateway=ping comment="Failover check ISP2" \ disabled=no distance=1 dst-address=8.8.4.4/32 \ gateway=ether7_ip_here scope=30 target-scope=10 add check-gateway=ping comment="Failover check ISP1" \ disabled=no distance=1 dst-address=8.8.8.8/32 \ gateway=pppoe-out1 scope=30 target-scope=10
Маркируем соединения.
/ip firewall mangle add action=mark-connection chain=prerouting connection-mark=no-mark \ disabled=no in-interface=pppoe-out1 new-connection-mark=from-ISP1 add action=mark-connection chain=prerouting connection-mark=no-mark \ disabled=no in-interface=ether7 new-connection-mark=from-ISP2 \ add action=mark-routing chain=output connection-mark=from-ISP1 \ disabled=no new-routing-mark=to-ISP1 add action=mark-routing chain=output connection-mark=from-ISP2 \ disabled=no new-routing-mark=to-ISP2
Скрипты и Netwatch
Логика переключение проста — если адрес 8.8.8.8 недоступен, то ISP1 не работает и нужно отключить к нему маршрут и отправить уведомление о сбое через оставшийся маршрут для ISP2. Так как второго провайдера отключать нет смысла, то после проверки просто отправляем уведомление о его состоянии.
Проверку и вызов скриптов выполняем утилитой Netwatch.
/system script add name=ISP1-down policy=read,write,policy,test,password,sensitive source="/i\ p route disable [find dst-address=0.0.0.0/0 and gateway=pppoe-out1 and dis\ tance >=4];\r\ \n:local sysname [/system identity get name];\r\ \n:local date [/system clock get date];\r\ \n:local time [/system clock get time];\r\ \n/tool e-mail send to=admin@yourcompany.ru subject=(\"[MTik State] \$sy\ sname ISP1 is DOWN since \$date \$time\") \\\r\ \nbody=(\"\$sysname ISP1: connection lost.\");" add name=ISP1-up policy=read,write,policy,test,password,sensitive source="/ip \ route enable [find dst-address=0.0.0.0/0 and gateway=pppoe-out1 and distan\ ce >=4];\r\ \n:local sysname [/system identity get name];\r\ \n:local date [/system clock get date];\r\ \n:local time [/system clock get time];\r\ \n/tool e-mail send to=admin@yourcompany.ru subject=(\"[MTik State] \$sy\ sname ISP1 is UP since \$date \$time\") \\\r\ \nbody=(\"\$sysname ISP1: connection restored.\");" add name=ISP2-up policy=read,write,policy,test,password,sensitive source=":loc\ al sysname [/system identity get name];\r\ \n:local date [/system clock get date];\r\ \n:local time [/system clock get time];\r\ \n/tool e-mail send to=admin@yourcompany.ru subject=(\"[MTik State] \$sy\ sname ISP2 is UP since \$date \$time\") \\\r\ \nbody=(\"\$sysname ISP2: connection restored.\");" add name=ISP2-down policy=read,write,policy,test,password,sensitive source=":l\ ocal sysname [/system identity get name];\r\ \n:local date [/system clock get date];\r\ \n:local time [/system clock get time];\r\ \n/tool e-mail send to=admin@yourcompany.ru subject=(\"[MTik State] \$sy\ sname ISP2 is DOWN since \$date \$time\") \\\r\ \nbody=(\"\$sysname ISP2: connection lost.\");" /tool netwatch add disabled=no down-script=ISP1-down host=8.8.8.8 interval=20s timeout=7s \ up-script=ISP1-up add disabled=no down-script=ISP2-down host=8.8.4.4 interval=20s timeout=7s \ up-script=ISP2-up
Чтобы заработала отправка e-mail нужно указать учетную запись и SMTP-сервер через который мы хотим отправлять почту.
/tool e-mail set address=SMTP_server_IP from=email_username@gmail.com \ password=email_password port=587 start-tls=yes user=email_username
Profit!