Простое переключение двух провайдеров на роутере Mikrotik

Переключение двух провайдеров на Mikrotik

Как при помощи 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

Чтобы заработала отправка 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!

Light Spirit Funky Solutions © 2010 ‒ 2024