Mikrotik роутер с 2 wan

2, 3 и даже более операторов на MikroTik RouterOS 7 с рекурсивной маршрутизацией и дополнительных проверок с помощью Netwatch, а так же отработкой динамических адресов от оператора.

Отличается от настройки для RouerOS 6, но принцип остается прежним.

Таблицы маршрутизации

DualWAN RouterOS 7 MikroTik
Routing > Tables
Добавляем WAN1, WAN2, WAN3
/routing table
add disabled=no fib name=WAN1
add disabled=no fib name=WAN2
add disabled=no fib name=WAN3

Интерфейс листы

Собираем порты в листы

DualWAN RouterOS 7 MikroTik
Interfaces > Interface List

Маркировка трафика

DualWAN RouterOS 7 MikroTik
IP > Firewall > Mangle
/ip firewall mangle
add action=mark-connection chain=prerouting comment="Mark Connection WAN1" connection-mark=no-mark in-interface-list=WAN1 new-connection-mark=con-WAN1 passthrough=yes
add action=mark-connection chain=prerouting comment="Mark Connection WAN2" connection-mark=no-mark in-interface-list=WAN2 new-connection-mark=con-WAN2 passthrough=yes
add action=mark-connection chain=prerouting comment="Mark Connection WAN3" connection-mark=no-mark in-interface-list=WAN3 new-connection-mark=con-WAN3 passthrough=yes
add action=mark-routing chain=prerouting comment="Mark Routing !WAN" connection-mark=con-WAN1 in-interface-list=!WAN-ALL new-routing-mark=WAN1 passthrough=yes
add action=mark-routing chain=prerouting comment="Mark Routing !WAN" connection-mark=con-WAN2 in-interface-list=!WAN-ALL new-routing-mark=WAN2 passthrough=yes
add action=mark-routing chain=prerouting comment="Mark Routing !WAN" connection-mark=con-WAN3 in-interface-list=!WAN-ALL new-routing-mark=WAN3 passthrough=yes
add action=mark-routing chain=output comment="Mark Roution Out WAN1" connection-mark=con-WAN1 new-routing-mark=WAN1 passthrough=yes
add action=mark-routing chain=output comment="Mark Roution Out WAN2" connection-mark=con-WAN2 new-routing-mark=WAN2 passthrough=yes
add action=mark-routing chain=output comment="Mark Roution Out WAN3" connection-mark=con-WAN3 new-routing-mark=WAN3 passthrough=yes

Рекурсивная маршрутизация

DualWAN RouterOS 7 MikroTik
IP > Routes

Замените в конфигурации:

  • 79.174.41.129 на шлюз оператора 1
  • 80.76.108.1 на шлюз оператора 2
  • 192.168.199.1 на шлюз оператора 3
/ip route
add comment="Table WAN1" disabled=no distance=1 dst-address=0.0.0.0/0 gateway=79.174.41.129 routing-table=WAN1 scope=30 target-scope=10
add comment="Table WAN2" disabled=no distance=1 dst-address=0.0.0.0/0 gateway=80.76.108.1 routing-table=WAN2 scope=30 target-scope=10
add comment="Table WAN3" disabled=no distance=1 dst-address=0.0.0.0/0 gateway=192.168.199.1 routing-table=WAN3 scope=30 target-scope=10
add comment=WAN1_!_Recursive disabled=no distance=1 dst-address=4.2.2.1/32 gateway=79.174.41.129 routing-table=main scope=11 target-scope=10
add comment=WAN2_!_Recursive disabled=no distance=1 dst-address=4.2.2.2/32 gateway=80.76.108.1 routing-table=main scope=11 target-scope=10
add comment=WAN3_!_Recursive disabled=no distance=1 dst-address=4.2.2.3/32 gateway=192.168.199.1  routing-table=main scope=11 target-scope=10
add comment=WAN1_Recursive disabled=no distance=10 dst-address=0.0.0.0/0 gateway=4.2.2.1 routing-table=main scope=30 target-scope=11
add check-gateway=ping comment=WAN2_Recursive disabled=no distance=20 dst-address=0.0.0.0/0 gateway=4.2.2.2 routing-table=main scope=30 target-scope=11
add comment=WAN3_Recursive disabled=no distance=30 dst-address=0.0.0.0/0 gateway=4.2.2.3 routing-table=main scope=30 target-scope=11

Правила маршрутизации

DualWAN RouterOS 7 MikroTik
Routing > Rules

Замените в конфигурации

  • 79.174.41.168 на IP оператора 1
  • 80.76.108.127 на IP оператора 2
  • 192.168.199.84 на IP оператора 3
/routing rule
add action=lookup comment=Route_Only_WAN1 disabled=no src-address=79.174.41.168 table=WAN1
add action=lookup disabled=no dst-address=77.88.8.1/32 table=WAN1
add action=lookup disabled=no routing-mark=WAN1 table=WAN1
add action=lookup comment=Route_Only_WAN2 disabled=no src-address=80.76.108.127/32 table=WAN2
add action=lookup disabled=no dst-address=77.88.8.2/32 table=WAN2
add action=lookup disabled=no routing-mark=WAN2 table=WAN2
add action=lookup comment=Route_Only_WAN3 disabled=no src-address=192.168.199.84 table=WAN3
add action=lookup disabled=no dst-address=77.88.8.3/32 table=WAN3
add action=lookup disabled=no routing-mark=WAN3 table=WAN3

Автоматическая подставка IP адреса

В случаях динамического IP

Для WAN3

/system script
add dont-require-permissions=no name=Vlan11-ISP1 owner=WinBox policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=":local WANDHCP Vlan11-ISP1;\r\
    \n\r\
    \nlocal result [/ip address get value-name=address [find interface=\$WANDHCP]];\r\
    \nlocal WANDHCPIP [:pick \$result 0 [:find \$result \"/\"]];\r\
    \nlocal WANDHCPGW [/ip address get value-name=network [find interface=\$WANDHCP]];\r\
    \n\r\
    \n/routing rule set [find comment=\"Route_Only_WAN1\"] src-address=\$WANDHCPIP;"

Для WAN1

/system script
add dont-require-permissions=no name=Vlan13-ISP3 owner=WinBox policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=":local WANDHCP Vlan13-ISP3;\r\
    \n\r\
    \nlocal result [/ip address get value-name=address [find interface=\$WANDHCP]];\r\
    \nlocal WANDHCPIP [:pick \$result 0 [:find \$result \"/\"]];\r\
    \nlocal WANDHCPGW [/ip address get value-name=network [find interface=\$WANDHCP]];\r\
    \n\r\
    \n/routing rule set [find comment=\"Route_Only_WAN3\"] src-address=\$WANDHCPIP;"

И указываем это в DHCP-Client интерфейса

DualWAN RouterOS 7 MikroTik
IP > DHCP-Client

Проверка интернета

DualWAN RouterOS 7 MikroTik
Tools > Netwatch
/tool netwatch
add comment=Check_WAN1 disabled=no down-script="/ip route set [find comment=\"WAN1_Recursive\"] check-gateway=ping" host=8.8.8.8 http-codes="" test-script="" type=simple up-script="/ip route unset [find comment=\"WAN1_Recursive\"] check-gateway"
add comment=Check_WAN2 disabled=no down-script="/ip route set [find comment=\"WAN2_Recursive\"] check-gateway=ping" host=77.88.8.2 http-codes="" test-script="" type=simple up-script="/ip route unset [find comment=\"WAN2_Recursive\"] check-gateway"
add comment=Check_WAN3 disabled=no down-script="/ip route set [find comment=\"WAN3_Recursive\"] check-gateway=ping" host=77.88.8.3 http-codes="" test-script="" type=simple up-script="/ip route unset [find comment=\"WAN3_Recursive\"] check-gateway"

Проверка включает или выключает Check Gateway

Так же можно сменить тип на ICMP и мониторить потери:

DualWAN RouterOS 7 MikroTik
Количество потерь можно использовать для решения о переключении

Ручное управление

DualWAN RouterOS 7 MikroTik
System > Scripts

Переключение между операторами

/system script
add dont-require-permissions=no name=WAN1>WAN2>WAN3 owner=WinBox policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=":local result 0;\r\
    \n\r\
    \n:set result [/ip route get [find comment=\"WAN3_Recursive\"] distance]\r\
    \nif (\$result != 30) do={\r\
    \n   /ip route set [find comment=\"WAN3_Recursive\"] distance=30;\r\
    \n}\r\
    \n\r\
    \n:set result [/ip route get [find comment=\"WAN2_Recursive\"] distance]\r\
    \nif (\$result != 20) do={\r\
    \n   /ip route set [find comment=\"WAN2_Recursive\"] distance=20;\r\
    \n}\r\
    \n\r\
    \n:set result [/ip route get [find comment=\"WAN1_Recursive\"] distance]\r\
    \nif (\$result != 10) do={\r\
    \n   /ip route set [find comment=\"WAN1_Recursive\"] distance=10;\r\
    \n}"
add dont-require-permissions=no name=WAN1>WAN3>WAN2 owner=WinBox policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=":local result 0;\r\
    \n\r\
    \n:set result [/ip route get [find comment=\"WAN2_Recursive\"] distance]\r\
    \nif (\$result != 20) do={\r\
    \n   /ip route set [find comment=\"WAN2_Recursive\"] distance=30;\r\
    \n}\r\
    \n\r\
    \n:set result [/ip route get [find comment=\"WAN3_Recursive\"] distance]\r\
    \nif (\$result != 30) do={\r\
    \n   /ip route set [find comment=\"WAN3_Recursive\"] distance=20;\r\
    \n}\r\
    \n\r\
    \n:set result [/ip route get [find comment=\"WAN1_Recursive\"] distance]\r\
    \nif (\$result != 10) do={\r\
    \n   /ip route set [find comment=\"WAN1_Recursive\"] distance=10;\r\
    \n}"
add dont-require-permissions=no name=WAN2>WAN1>WAN3 owner=WinBox policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=":local result 0;\r\
    \n\r\
    \n:set result [/ip route get [find comment=\"WAN3_Recursive\"] distance]\r\
    \nif (\$result != 30) do={\r\
    \n   /ip route set [find comment=\"WAN3_Recursive\"] distance=30;\r\
    \n}\r\
    \n\r\
    \n:set result [/ip route get [find comment=\"WAN1_Recursive\"] distance]\r\
    \nif (\$result != 20) do={\r\
    \n   /ip route set [find comment=\"WAN1_Recursive\"] distance=20;\r\
    \n}\r\
    \n\r\
    \n:set result [/ip route get [find comment=\"WAN2_Recursive\"] distance]\r\
    \nif (\$result != 10) do={\r\
    \n   /ip route set [find comment=\"WAN2_Recursive\"] distance=10;\r\
    \n}"
add dont-require-permissions=no name=WAN2>WAN3>WAN1 owner=WinBox policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=":local result 0;\r\
    \n\r\
    \n:set result [/ip route get [find comment=\"WAN1_Recursive\"] distance]\r\
    \nif (\$result != 30) do={\r\
    \n   /ip route set [find comment=\"WAN1_Recursive\"] distance=30;\r\
    \n}\r\
    \n\r\
    \n:set result [/ip route get [find comment=\"WAN3_Recursive\"] distance]\r\
    \nif (\$result != 20) do={\r\
    \n   /ip route set [find comment=\"WAN3_Recursive\"] distance=20;\r\
    \n}\r\
    \n\r\
    \n:set result [/ip route get [find comment=\"WAN2_Recursive\"] distance]\r\
    \nif (\$result != 10) do={\r\
    \n   /ip route set [find comment=\"WAN2_Recursive\"] distance=10;\r\
    \n}"
add dont-require-permissions=no name=WAN3>WAN1>WAN2 owner=WinBox policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=":local result 0;\r\
    \n\r\
    \n:set result [/ip route get [find comment=\"WAN2_Recursive\"] distance]\r\
    \nif (\$result != 30) do={\r\
    \n   /ip route set [find comment=\"WAN2_Recursive\"] distance=30;\r\
    \n}\r\
    \n\r\
    \n:set result [/ip route get [find comment=\"WAN1_Recursive\"] distance]\r\
    \nif (\$result != 20) do={\r\
    \n   /ip route set [find comment=\"WAN1_Recursive\"] distance=20;\r\
    \n}\r\
    \n\r\
    \n:set result [/ip route get [find comment=\"WAN3_Recursive\"] distance]\r\
    \nif (\$result != 10) do={\r\
    \n   /ip route set [find comment=\"WAN3_Recursive\"] distance=10;\r\
    \n}"
add dont-require-permissions=no name=WAN3>WAN2>WAN1 owner=WinBox policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=":local result 0;\r\
    \n\r\
    \n:set result [/ip route get [find comment=\"WAN1_Recursive\"] distance]\r\
    \nif (\$result != 30) do={\r\
    \n   /ip route set [find comment=\"WAN3_Recursive\"] distance=30;\r\
    \n}\r\
    \n\r\
    \n:set result [/ip route get [find comment=\"WAN2_Recursive\"] distance]\r\
    \nif (\$result != 20) do={\r\
    \n   /ip route set [find comment=\"WAN2_Recursive\"] distance=20;\r\
    \n}\r\
    \n\r\
    \n:set result [/ip route get [find comment=\"WAN3_Recursive\"] distance]\r\
    \nif (\$result != 10) do={\r\
    \n   /ip route set [find comment=\"WAN3_Recursive\"] distance=10;\r\
    \n}"

Сброс соединений через оператора

/system script
add dont-require-permissions=no name=Reset_Conn_WAN1 owner=WinBox policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="/ip firewall connection remove [find connection-mark=\"con-WAN1\"]"
add dont-require-permissions=no name=Reset_Conn_WAN2 owner=WinBox policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="/ip firewall connection remove [find connection-mark=\"con-WAN2\"]"
add dont-require-permissions=no name=Reset_Conn_WAN3 owner=WinBox policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="/ip firewall connection remove [find connection-mark=\"con-WAN3\"]"

Отключение проверки Check Gatweay

/system script
add dont-require-permissions=no name=check-gateway_OFF owner=WinBox policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=\
    "/ip route unset [find comment=\"WAN1_Recursive\"] check-gateway\r\
    \n/ip route unset [find comment=\"WAN2_Recursive\"] check-gateway\r\
    \n/ip route unset [find comment=\"WAN3_Recursive\"] check-gateway"

Блокировка проверки с другого оператора

DualWAN RouterOS 7 MikroTik
IP > Firewall > Filrer Rules
/ip firewall address-list
add address=4.2.2.1 list=Only_WAN1
add address=4.2.2.2 list=Only_WAN2
add address=4.2.2.3 list=Only_WAN3
add address=77.88.8.1 list=Only_WAN1
add address=77.88.8.2 list=Only_WAN2
add address=77.88.8.3 list=Only_WAN3

/ip firewall filter
add action=drop chain=output comment="Only WAN1" dst-address-list=Only_WAN1 out-interface-list=!WAN1
add action=drop chain=output comment="Only WAN2" dst-address-list=Only_WAN2 out-interface-list=!WAN2
add action=drop chain=output comment="Only WAN3" dst-address-list=Only_WAN3 out-interface-list=!WAN3

Адаптировано под ROS6 и ROS7. Редакция от 28.12.2021

Введение

Статья ориентирована на начинающих администраторов Mikrotik RouterOS (далее ROS). В ней рассматривается маршрутизация с резервированием для нескольких не связанных multihomed AS каналов интернет, работающих по протоколу IPv4. Так же есть настройки для обеспечения базовой безопасности. «Автоматическая» балансировка исходящего трафика по каналам в данной статье не описана по причине того, что ее реализация на таких исходных данных — это череда компромиссов и ограничений, требующая отдельного рассмотрения. Инструментарий для «ручной» балансировки в статье содержится и приведенные настройки являются хорошей базой для добавления «автоматической» балансировки, как минимум полудюжиной способов.

Исходные данные

В качестве подопытного, выбран пятипортовый маршрутизатор Mikrotik с ROS версии 6.45+. Он будет маршрутизировать трафик между двумя локальными сетями (LAN1 и LAN2) и тремя провайдерами (ISP1, ISP2, ISP3). Канал к ISP1 имеет статический “серый” адрес, ISP2 — “белый”, получаемый по DHCP, ISP3 — “белый” с PPPoE авторизацией. Схема подключения представлена на рисунке:

Задача настроить роутер “МТК” на основе схемы так, чтобы:

  1. Обеспечить автоматическое переключение на резервного провайдера.
    Основной провайдер — ISP2, первый резерв — ISP1, второй резерв — ISP3.
  2. Организовать выход сети LAN1 в Интернет только через ISP1.
  3. Предусмотреть возможность приоритетно маршрутизировать трафик из локальных сетей в Интернет через выбранного провайдера на основе address-list.
  4. Предусмотреть возможность публикации сервисов из локальной сети в Интернет (DSTNAT)
  5. Настроить фильтр файервола для обеспечения минимально достаточной безопасности со стороны Интернет.
  6. Роутер мог выпускать собственный трафик через любого из трех провайдеров в зависимости от выбранного адреса источника.
  7. Обеспечить маршрутизацию ответных пакетов в канал, с которого они пришли (включая LAN).

Замечание. Настраивать роутер будем “с чистого листа”, дабы гарантировать отсутствие сюрпризов в меняющихся от версии к версии стартовых конфигурациях “из коробки”. Настройки будут задаваться командами в терминале Winbox. Физическое подключение для настройки осуществляется прямым соединением с интерфейсом ether5.

Немного рассуждений о том, что такое мультиван, проблема ли это или хитрые умники вокруг плетут сети заговоров

Пытливый и внимательный админ, самостоятельно настраивая такую или подобную схему, вдруг неожиданно осознает, что оно и так нормально работает. Да-да, без этих ваших пользовательских таблиц маршрутизации и прочих route rules, коими пестрят большинство статей на эту тему. Проверим?

Адресацию на интерфейсах и шлюзы по умолчанию настроить можем? Да:

На ISP1 прописали адрес и шлюз с distance=2 и check-gateway=ping.
На ISP2 настройка dhcp клиента по умолчанию — соответственно distance будет равен единице.
На ISP3 в настройках pppoe клиента при add-default-route=yes ставим default-route-distance=3.

NAT на выход прописать не забываем:

/ip firewall nat add action=masquerade chain=srcnat out-interface-list=WAN

По итогу, у пользователей локалок котики весело грузятся через основного провайдера ISP2 и есть резервирование канала при помощи механизма check gateway.

Пункт 1 задачи реализован. Где же мультиван со своими метками? Нет…

Дальше. Нужно выпустить конкретных клиентов из LAN через ISP1:

/ip firewall mangle add action=route chain=prerouting dst-address-list=!BOGONS \
passthrough=yes route-dst=100.66.66.1 src-address-list=Via_ISP1
/ip firewall mangle add action=route chain=prerouting dst-address-list=!BOGONS \
passthrough=no route-dst=100.66.66.1 src-address=192.168.88.0/24

Пункты 2 и 3 задачи реализованы. Метки, марки, route rules, где вы?!

Нужно дать доступ к любимому OpenVPN серверу с адресом 172.17.17.17 для клиентов из Интернет? Пожалуйста:

/ip cloud set ddns-enabled=yes

Клиентам в качестве пира даем результат вывода: “:put [ip cloud get dns-name]

Прописываем проброс порта из инета:

/ip firewall nat add action=dst-nat chain=dstnat dst-port=1194 \
in-interface-list=WAN protocol=udp to-addresses=172.17.17.17

Пункт 4 готов.

Настраиваем фаервол и прочую безопасность для пункта 5, параллельно радуемся тому, что у пользователей уже все работает и тянемся к емкости с любимым напитком…
А! Туннели же еще забыли.

l2tp-клиент, настроенный по нагугленной статье, до любимого голландского VDS поднялся? Да.
l2tp-сервер с IPsec поднялся и клиенты по ДНС-имени из IP Cloud(см выше.) цепляются? Да.
Откинувшись на спинку стула, прихлебывая напиток, лениво рассматриваем пункты 6 и 7 задачи. Думаем — а оно нам надо? Все ж и так работает (с)… Так вот если оно таки не надо, то на этом все. Мультиван реализован.

Что такое мультиван? Это подключение нескольких каналов Интернет к одному роутеру.

Дальше статью можно не читать, поскольку что там кроме выпендрежа сомнительной применимости может быть?

С теми, кто остался, кто заинтересован пунктами 6 и 7 задачи, а также ощущает зуд перфекционизма, погружаемся глубже.

Важнейшей задачей реализации мультиван является корректная маршрутизация трафика. А именно: независимо от того, в какой (или в какие)Примечание 3 канал(ы) провайдера смотрит маршрут по умолчанию на нашем роутере, он должен возвращать ответ именно в тот канал, с которого пакет пришел. Задача понятна. Проблема-то где? Ведь в простой локальной сети задача та же, но никто дополнительными настройками не заморачивается и беды не ощущает. Отличие в том, что любой маршрутизируемый узел в Интернет доступен через каждый из наших каналов, а не через строго конкретный, как в простой локалке. А “беда” заключается в том, что если к нам пришел запрос на IP адрес ISP3, то в нашем случае ответ уйдет через канал ISP2, поскольку туда направлен шлюз по умолчанию. Уйдет и будет отброшен провайдером, как некорректный. С проблемой определились. Как ее решать?

Решение разделим на три этапа:

  1. Предварительная настройка. На этом этапе будут заданы базовые настройки маршрутизатора: локальная сеть, фаервол, address lists, hairpin NAT и пр.
  2. Мультиван. На этом этапе будут промаркированы и рассортированы по таблицам маршрутизации нужные соединения.
  3. Подключение к ISP. На этом этапе будут настроены интерфейсы, обеспечивающие подключение к Интернет, задействована маршрутизация и механизм резервирования каналов Интернет.

Замечание. Три разных типа подключения к ISP выбраны специально для того, чтобы показать — ничего неразрешимого в настройке мультиван с динамическими адресами нет и продемонстрировать один из вариантов решения.

Важно!

Для переключения каналов по алгоритму заданному при помощи стоимости маршрутов distance используется механизм check gateway. Скрипты, приведенные в статье, к резервированию каналов отношения не имеют и призваны автоматизировать решение проблемы динамических IP на каналах ISP2 и ISP3.

1. Предварительная настройка

1.1. Очищаем конфигурацию роутера командой:

/system reset-configuration skip-backup=yes no-defaults=yes

соглашаемся с “Dangerous! Reset anyway? [y/N]:” и, после перезагрузки, подключаемся Winbox-ом по MAC. На данном этапе конфигурация и база пользователей очищены.

1.2. В ROS 6.49+ отказываемся от смены пароля на дефолтном пользователе («Cancel» в Winbox и «Ctrl+C» в терминале) Создаем нового пользователя:

/user add group=full name=knight password=ultrasecret comment="Not horse"

логинимся под ним и удаляем дефолтного:

/user remove admin

Замечание. Именно удаление а не отключение дефолтного пользователя автор считает более безопасным и рекомендует к применению.

1.3. Создаем базовые interface lists для удобства оперирования в фаерволе, настройках discovery и прочих MAC серверах:

/interface list add name=WAN comment="For Internet"
/interface list add name=LAN comment="For Local Area"

Подписываем комментариями интерфейсы

/interface ethernet set ether1 comment="to ISP1"
/interface ethernet set ether2 comment="to ISP2"
/interface ethernet set ether3 comment="to ISP3"
/interface ethernet set ether4 comment="to LAN1"
/interface ethernet set ether5 comment="to LAN2"

и заполняем interface lists:

/interface list member add interface=ether1 list=WAN comment=ISP1
/interface list member add interface=ether2 list=WAN comment=ISP2 
/interface list member add interface=ether3 list=WAN comment="to ISP3"
/interface list member add interface=ether4 list=LAN comment=LAN1
/interface list member add interface=ether5 list=LAN comment=LAN2

Замечание. Писать понятные комментарии стоит потраченного на это времени и сильно облегчает понимание конфигурации. Автор считает необходимым, в целях безопасности, добавить в interface list “WAN” интерфейс ether3, не смотря на то, что по нему не будет ходить протокол ip. Не забываем, что после того, как на ether3 будет поднят интерфейс PPP, его тоже нужно будет добавить в interface list “WAN”

1.4. Скрываем роутер от обнаружения соседства и управления из сетей провайдеров по МАС:

/ip neighbor discovery-settings set discover-interface-list=!WAN
/tool mac-server set allowed-interface-list=LAN
/tool mac-server mac-winbox set allowed-interface-list=LAN

1.5. Создаем минимально достаточный набор правил фильтра файрволла для защиты роутера:

/ip firewall filter add action=accept chain=input \
comment="Related Established Untracked Allow" \
connection-state=established,related,untracked

(правило обеспечивает разрешение для установившихся и родственных соединений, которые инициированы как из подключенных сетей, так и самим роутером)

/ip firewall filter add action=accept chain=input \
comment="ICMP from ALL" protocol=icmp

(пинг и не только пинг. Разрешен весь icmp на вход. Весьма полезно для нахождения проблем с MTU)

/ip firewall filter add action=drop chain=input comment="All other WAN Drop" \
in-interface-list=WAN

(закрывающее цепочку input правило запрещает все остальное, что прилетает из Интернет)

/ip firewall filter add action=accept chain=forward \
comment="Established, Related, Untracked allow" \
connection-state=established,related,untracked

(правило разрешает установившиеся и родственные соединения, которые проходят сквозь роутер)

/ip firewall filter add action=drop chain=forward comment="Invalid drop" \
connection-state=invalid

(правило сбрасывает соединения, с connection-state=invalid, проходящие сквозь роутер. Оно настоятельно рекомендовано Mikrotik, но в некоторых ситуациях, например при несимметричной маршрутизации может вызывать блокировку полезного трафика)

/ip firewall filter add action=drop chain=forward \
comment="Drop all from WAN not DSTNATed" connection-nat-state=!dstnat \
connection-state=new in-interface-list=WAN

(правило запрещает проходить сквозь роутер пакетам, которые идут из Интернет и не прошли процедуру dstnat. Это убережет локальные сети от злоумышленников, которые, находясь в одном широковещательном домене с нашими внешними сетями, пропишут в качестве шлюза наши внешние IP и, таким образом, попытаются “исследовать” наши локальные сети. )

Замечание. Примем за условие, что сети LAN1 и LAN2 являются доверенными и трафик между ними и с них не фильтруется.

1.6. Создаем список с перечнем не маршрутизируемых сетей:

/ip firewall address-list
add address=0.0.0.0/8 comment="\"This\" Network" list=BOGONS
add address=10.0.0.0/8 comment="Private-Use Networks" list=BOGONS
add address=100.64.0.0/10 comment="Shared Address Space. RFC 6598" list=BOGONS
add address=127.0.0.0/8 comment=Loopback list=BOGONS
add address=169.254.0.0/16 comment="Link Local" list=BOGONS
add address=172.16.0.0/12 comment="Private-Use Networks" list=BOGONS
add address=192.0.0.0/24 comment="IETF Protocol Assignments" list=BOGONS
add address=192.0.2.0/24 comment=TEST-NET-1 list=BOGONS
add address=192.168.0.0/16 comment="Private-Use Networks" list=BOGONS
add address=198.18.0.0/15 comment="Network Interconnect Device Benchmark Testing"\
 list=BOGONS
add address=198.51.100.0/24 comment=TEST-NET-2 list=BOGONS
add address=203.0.113.0/24 comment=TEST-NET-3 list=BOGONS
add address=224.0.0.0/4 comment=Multicast list=BOGONS
add address=192.88.99.0/24 comment="6to4 Relay Anycast" list=BOGONS
add address=240.0.0.0/4 comment="Reserved for Future Use" list=BOGONS
add address=255.255.255.255 comment="Limited Broadcast" list=BOGONS

(Это список адресов и сетей, которые не маршрутизируются в Интернет и, соответственно, мы тоже будем этому следовать. )

Замечание. Список может изменяться, поэтому советую периодически проверять актуальность.

1.7. Настраиваем DNS для самого роутера:

/ip dns set servers=1.1.1.1,8.8.8.8

Замечание. В текущей версии ROS статически заданные серверы имен имеют приоритет перед динамическими. Запрос на разрешение имени отсылается первому серверу по порядку следования в списке. На следующий сервер переход осуществляется при недоступности текущего. Таймаут большой — более 5 сек. Возврат обратно, при возобновлении работы “упавшего сервера”, автоматически не происходит. С учетом этого алгоритма и наличия мультивана, автор рекомендует не использовать серверы, выдаваемые провайдерами.

1.8. Настраиваем локальную сеть.
1.8.1. Конфигурируем статические IP адреса на интерфейсах локальных сетей:

/ip address add interface=ether4 address=192.168.88.254/24 comment="LAN1 IP"
/ip address add interface=ether5 address=172.16.1.0/23 comment="LAN2 IP"

1.8.2. Задаем правила маршрутов к нашим локальным сетям через главную таблицу маршрутизации.
ROS6:

/ip route rule add dst-address=192.168.88.0/24 table=main comment="to LAN1"
/ip route rule add dst-address=172.16.0.0/23 table=main comment="to LAN2"

ROS7:

/routing/rule/add action=lookup dst-address=192.168.88.0/24 table=main \
comment="to LAN1"
/routing/rule/add action=lookup dst-address=172.16.0.0/23 table=main \
comment="to LAN2"

Замечание. Это один из простых и быстрых способов получить доступ к адресам локальных сетей с соурсами внешних IP адресов интерфейсов роутера, независимо от того, в какой канал ведет маршрут по умолчанию.

1.8.3. Если необходимо включаем Hairpin NAT для LAN1 и LAN2

/ip firewall nat add action=src-nat chain=srcnat comment="Hairpin to LAN1" \
out-interface=ether4 src-address=192.168.88.0/24 to-addresses=192.168.88.254
/ip firewall nat add action=src-nat chain=srcnat comment="Hairpin to LAN2" \
out-interface=ether5 src-address=172.16.0.0/23 to-addresses=172.16.1.0

Замечание. Это позволяет пользователям из LAN1 и LAN2 получать доступ через внешний IP (dstnat) к серверам, находящимся с пользователями в одном сегменте сети.

1.9. (Применимо для ROS7). Создаем пользовательские таблицы маршрутизации для каждого из провайдеров

/routing/table/add disabled=no fib name=to_isp1
/routing/table/add disabled=no fib name=to_isp2
/routing/table/add disabled=no fib name=to_isp3

Замечание. В ROS7 переосмыслена работа с марками и таблицами маршрутов. В ROS6, к примеру, в правиле mangle action=mark-routing опция new-routing-mark позволяла непосредственно задать имя новой марки под которую в системе автоматически создавалась таблица. В ROS7, по аналогии с iproute2 в линукс, требуется предварительное создание пользовательских таблиц. Только после этого операции с ними становятся доступны в соответствующих правилах.

2. Собственно, реализация того самого корректного мультиван

Для решения задачи “отвечать туда откуда спросили” будем использовать два инструмента ROS: connection mark и routing mark. Connection mark позволяет пометить нужное соединение и в дальнейшем работать с этой меткой, как условием для применения routing mark. А уже с routing mark возможно работать в ip route и route rules. С инструментами разобрались, теперь нужно решить какие соединения метить — раз, где именно метить — два.

С первым все просто — мы должны пометить все соединения, которые приходят в роутер из Интернет по соответствующему каналу. В нашем случае это будут три метки (по количеству каналов): “conn_isp1”, “conn_isp2” и “conn_isp3”.

Нюанс со вторым заключается в том, что входящие соединения будут двух видов: транзитные и те, которые предназначены самому роутеру. Механизм connection mark работает в таблице mangle. Рассмотрим движение пакета на упрощенной диаграмме, любезно собранной специалистами ресурса mikrotik-trainings.com (не реклама):

Следуя по стрелкам, мы видим, что пакет, приходящий в “input interface”, проходит по цепочке “Prerouting” и только потом разделяется на транзитный и локальный в блоке “Routing Decision”. Поэтому, для убиения двух зайцев, задействуем Connection Mark в таблице Mangle Prerouting цепочки Prerouting.

Замечание. В ROS метки “Routing mark” указаны в разделе Ip/Routes/Rules как “Table”, а в остальных разделах, как “Routing Mark”. Сие может внести некую путаницу в понимание, но, по сути, это одно и то же, и является аналогом rt_tables в iproute2 на linux.

2.1. Метим входящие соединения от каждого из провайдеров

/ip firewall mangle add action=mark-connection chain=prerouting \
comment="Connmark in from ISP1" connection-mark=no-mark in-interface=ether1 \
new-connection-mark=conn_isp1 passthrough=no

/ip firewall mangle add action=mark-connection chain=prerouting \
comment="Connmark in from ISP2" connection-mark=no-mark in-interface=ether2 \
new-connection-mark=conn_isp2 passthrough=no

/ip firewall mangle add action=mark-connection chain=prerouting \
comment="Connmark in from ISP3" connection-mark=no-mark in-interface=pppoe-isp3 \
new-connection-mark=conn_isp3 passthrough=no

Замечание.Те читатели, кто пробует буквально и в порядке чтения повторить настройку предложенную в статье, при вводе третьей команды столкнутся с ошибкой: «input does not match any value of interface». Это связано с отсутствием в данный момент интерфейса «pppoe-isp3», который будет сконфигурирован в п. 3.3.2. На данном этапе можно вместо «pppoe-isp3» ввести «ether3». После выполнения п. 3.3.2 следует вернуться и поставить актуальное имя интерфейса.

Для того, чтобы не метить уже помеченные соединения я использую, как более универсальное, условие connection-mark=no-mark вместо connection-state=new.

passthrough=no — потому, что в этом способе реализации перемаркировка исключена и для ускорения можно прервать перебор правил после первого же совпадения.

Следует иметь ввиду, что мы пока никак не вмешиваемся в маршрутизацию. Сейчас идут только этапы подготовки. Следующим этапом реализации будет обработка транзитного трафика, который возвращается по установившемуся соединению от адресата в локальной сети. Т.е. тех пакетов, которые (см диаграмму) прошли через роутер по пути:

“Input Interface”=>”Prerouting”=>”Routing Decision”=>”Forward”=>”Post Routing”=>”Output Interface” и попали к своему адресату в локальной сети.

Важно!

В ROS нет логического деления на внешний и внутренний интерфейсы. Если проследить путь движения ответного пакета по приведенной диаграмме, то он пройдет по тому же логическому пути, что и запрос:

“Input Interface”=>”Prerouting”=>”Routing Decision”=>”Forward”=>”Post Routing”=>”Output Interface” просто для запроса “Input Interface” был интерфейс ISP, а для ответа — LAN

2.2. Направляем ответный транзитный трафик по соответствующим таблицам маршрутизации

/ip firewall mangle add action=mark-routing chain=prerouting \
comment="Routemark transit out via ISP1" connection-mark=conn_isp1 \
dst-address-type=!local in-interface-list=!WAN new-routing-mark=to_isp1 passthrough=no

/ip firewall mangle add action=mark-routing chain=prerouting \
comment="Routemark transit out via ISP2" connection-mark=conn_isp2 \
dst-address-type=!local in-interface-list=!WAN new-routing-mark=to_isp2 passthrough=no

/ip firewall mangle add action=mark-routing chain=prerouting \
comment="Routemark transit out via ISP3" connection-mark=conn_isp3 \
dst-address-type=!local in-interface-list=!WAN new-routing-mark=to_isp3 passthrough=no

Замечание. in-interface-list=!WAN — мы работаем только с трафиком из локальной сети и dst-address-type=!local не имеющим адрес назначения адреса интерфейсов самого роутера.

То же самое для локальных пакетов, которые пришли в роутер по пути:

“Input Interface”=>”Prerouting”=>”Routing Decision”=>”Input”=>”Local Process”

Важно!

Ответ пойдет по следующему пути:

”Local Process”=>”Routing Decision”=>”Output”=>”Post Routing”=>”Output Interface”

2.3. Направляем ответный локальный трафик по соответствующим таблицам маршрутизации

/ip firewall mangle add action=mark-routing chain=output \
comment="Routemark local out via ISP1" connection-mark=conn_isp1 \
dst-address-type=!local new-routing-mark=to_isp1 passthrough=no

/ip firewall mangle add action=mark-routing chain=output \
comment="Routemark local out via ISP2" connection-mark=conn_isp2 \
dst-address-type=!local new-routing-mark=to_isp2 passthrough=no

/ip firewall mangle add action=mark-routing chain=output \
comment="Routemark local out via ISP3" connection-mark=conn_isp3 \
dst-address-type=!local new-routing-mark=to_isp3 passthrough=no

На этом этапе задачу подготовки к отправке ответа в тот канал Интернет, с которого пришел запрос, можно считать решенной. Все помечено, промаркировано и готово маршрутизироваться.
Отличным “побочным” эффектом такой настройки является возможность работы проброса портов DstNAT с обоих (ISP2, ISP3) провайдеров одновременно. Не на всех, так как на ISP1 у нас не маршрутизируемый адрес. Этот эффект важен, например, для почтового сервера с двумя MХ, которые смотрят в разные каналы Интернет или для сервиса доступного через DNS имя, разрешающееся в IP адреса обоих провайдеров.

Для устранения нюансов работы локальных сетей с внешними IP роутера используем решения из пп. 1.8.2 и 3.1.2.6.

Кроме того, можно задействовать инструмент с маркировками и для решения пункта 3 задачи. Реализуем так:

2.4. Направляем трафик от локальных клиентов из списков маршрутизации в соответствующие таблицы

/ip firewall mangle add action=mark-routing chain=prerouting \
comment="Address List via ISP1" dst-address-list=!BOGONS new-routing-mark=to_isp1 \
passthrough=no src-address-list=Via_ISP1

/ip firewall mangle add action=mark-routing chain=prerouting \
comment="Address List via ISP3" dst-address-list=!BOGONS new-routing-mark=to_isp3 \
passthrough=no src-address-list=Via_ISP3

Замечание. Этот набор правил дан для примера. Считаю нужным обратить внимание на следующее:
— При всего двух каналах интернет разумно задать только одно правило. Для резервного канала.
— При нескольких каналах так же не имеет смысла делать правило для основного провайдера.
— Текущие настройки резервирования, при отказе «целевого» канала интернет предусматривают выход маркированного трафика через резервный канал(ы).
— Нужно помнить, что правила обрабатываются последовательно, в порядке написания. Это важно, если разные address-list содержат пересекающиеся адреса/сети. Без passthrough сработает первое встреченное правило, с passthrough – последнее. Учитывайте это при указании перекрывающихся диапазонов сетей в разных address-list.

По итогу, это выглядит приблизительно так (картинка кликабельна):

3. Настраиваем подключение к ISP и задействуем маршрутизацию по маркам

3.1. Настраиваем подключение к ISP1:
3.1.1. Конфигурируем статический IP адрес

/ip address add interface=ether1 address=100.66.66.2/30 comment="ISP1 IP"

3.1.2. Настраиваем статическую маршрутизацию:
3.1.2.1. Добавляем “аварийный” маршрут по умолчанию

/interface bridge add name=br-lo comment="Loopback interface"
/ip route add distance=254 gateway=br-lo comment="Emergency route"

Замечание. Этот маршрут позволяет трафику от локальных процессов проходить этап Route Decision независимо от состояния каналов любого из провайдеров. Нюанс исходящего локального трафика заключается в том, что чтобы пакет хоть куда-то двинулся, в основной таблице маршрутизации должен присутствовать активный маршрут до шлюза по умолчанию. Если его нет, то пакет просто будет уничтожен.

В качестве расширения инструмента check gateway для более глубокого анализа состояния канала предлагаю использовать метод рекурсивных маршрутов. Суть метода заключается в том, что мы указываем маршрут через промежуточный шлюз. Соответственно check gateway будет проверять доступность именно его, а не шлюза провайдера. В качестве таких “проверочных” шлюзов будут выбраны 4.2.2.1, 4.2.2.2 и 4.2.2.3 (это публичные адреса Level3DNS) соответственно для ISP1, ISP2 и ISP3. Можете выбрать любые другие доступные адреса, исходя из собственных предпочтений.

3.1.2.2. Задаем маршрут до “проверочного” адреса

/ip route add check-gateway=ping comment="For recursion via ISP1" \
distance=1 dst-address=4.2.2.1 gateway=100.66.66.1 scope=11

Замечание. В ROS7, относительно ROS6, несколько изменились условия построения рекурсивных маршрутов. Поэтому будем использовать универсальное решение, которое годится для обеих версий ROS. Суть его в том, что значение scope “базового маршрута” должно быть большим значения target-scope и равным target-scope рекурсивного маршрута.

3.1.2.3. Рекурсивный маршрут по умолчанию для трафика без routing mark

/ip route add check-gateway=ping comment="Unmarked via ISP1" \
distance=2 gateway=4.2.2.1 target-scope=11

Замечание. Значение distance=2 используется потому, что ISP1 по условиям задачи заявлен как первый резервный.

3.1.2.4. Рекурсивный маршрут по умолчанию для трафика c routing mark “to_isp1”
ROS6:

/ip route add comment="Marked via ISP1 Main" distance=1 gateway=4.2.2.1 \
routing-mark=to_isp1 target-scope=11

ROS7 (в данном случае routing-mark заменяем на routing-table):

/ip route add comment="Marked via ISP1 Main" distance=1 gateway=4.2.2.1 \
routing-table=to_isp1 target-scope=11

Замечание. Собственно, здесь мы наконец-то начинаем пользоваться плодами той подготовительной работы, что была проведена в пункте 2. По этому маршруту весь трафик, который имеет марку(таблицу) “to_isp1”, будет направлен на шлюз первого провайдера не зависимо от того, какой в данный момент активен шлюз по умолчанию для таблицы main.

3.1.2.5. Первый резервный рекурсивный маршрут по умолчанию для маркированного трафика провайдеров ISP2 и ISP3
ROS6:

/ip route add comment="Marked via ISP2 Backup1" distance=2 gateway=4.2.2.1 \
routing-mark=to_isp2 target-scope=11
/ip route add comment="Marked via ISP3 Backup1" distance=2 gateway=4.2.2.1 \
routing-mark=to_isp3 target-scope=11

ROS7 (в данном случае routing-mark заменяем на routing-table):

/ip route add comment="Marked via ISP2 Backup1" distance=2 gateway=4.2.2.1 \
routing-table=to_isp2 target-scope=11
/ip route add comment="Marked via ISP3 Backup1" distance=2 gateway=4.2.2.1 \
routing-table=to_isp3 target-scope=11

Замечание. Эти маршруты нужны, в том числе, для резервирования трафика с локальных сетей, которые состоят членами address list “to_isp*”’

3.1.2.6. Прописываем маршрут для локального трафика роутера в интернет через ISP1
ROS6:

/ip route rule add comment="From ISP1 IP to Inet" src-address=100.66.66.2 table=to_isp1

ROS7:

/routing/rule/add action=lookup comment="From ISP1 IP to Inet" \
src-address=100.66.66.2 table=to_isp1

Замечание. В сочетании с правилами из пункта 1.8.2, обеспечивается выход в нужный канал с заданным соурсом. Это является критичным для построения туннелей, в которых задается IP адрес локальной стороны(EoIP, IP-IP, GRE, L2TP etc.). Поскольку правила в ip route rules выполняются сверху вниз, до первого совпадения условий, то данное правило должно быть после правил из пункта 1.8.2.

3.1.3. Прописываем правило NAT для исходящего трафика

/ip firewall nat add action=src-nat chain=srcnat comment="NAT via ISP1" \
ipsec-policy=out,none out-interface=ether1 to-addresses=100.66.66.2

Замечание. NATим все выходящее, кроме того, что попадает в политики IPsec. Я стараюсь не использовать action=masquerade без крайней необходимости. Оно работает медленнее и более ресурсоемко, чем src-nat, поскольку для каждого нового соединения вычисляет адрес для NAT. Однако стоит помнить о таких свойствах masquerade как очистка соединений при падении канала и нюансы выбора адреса, если их на интерфейсе несколько и они из разных сетей.

3.1.4. Отправляем клиентов из списка, которым запрещен выход через остальных провайдеров сразу на шлюз провайдера ISP1

/ip firewall mangle add action=route chain=prerouting \
comment="Address List via ISP1 only" dst-address-list=!BOGONS passthrough=no \
route-dst=100.66.66.1 src-address-list=Via_only_ISP1 place-before=0

Замечание. action=route имеет более высокий приоритет и применяется раньше остальных правил маршрутизации. place-before=0 — помещает наше правило первым в списке.

3.2. Настраиваем подключение к ISP2.

Поскольку провайдер ISP2 настройки нам выдает по DHCP, разумно настройку и вероятные изменения делать скриптом, который стартует при срабатывании DHCP клиента
ROS6:

/ip dhcp-client
add add-default-route=no disabled=no interface=ether2 script=":if (\$bound=1) do={\r\
    \n   /ip route remove [ find gateway=\"4.2.2.2\" ]; /ip route remove [ find where \
dst-address ~\"4.2.2.2\" ]\r\
    \n   /ip route add check-gateway=ping comment=\"For recursion via ISP2\" distance=1 \
dst-address=4.2.2.2/32 gateway=\$\"gateway-address\" scope=11\r\
    \n   /ip route add check-gateway=ping comment=\"Unmarked via ISP2\" \
distance=1 gateway=4.2.2.2 target-scope=11\r\
    \n   /ip route add comment=\"Marked via ISP2 Main\" distance=1 gateway=4.2.2.2 \
routing-mark=to_isp2 target-scope=11\r\
    \n   /ip route add comment=\"Marked via ISP1 Backup1\" distance=2 gateway=4.2.2.2 \
routing-mark=to_isp1 target-scope=11\r\
    \n   /ip route add comment=\"Marked via ISP3 Backup2\" distance=3 gateway=4.2.2.2 \
routing-mark=to_isp3 target-scope=11\r\
    \n   :if [:tobool ([/ip firewall nat find comment=\"NAT via ISP2\"])] do={\r\
    \n   /ip firewall nat set [find comment=\"NAT via ISP2\"] action=src-nat \
chain=srcnat ipsec-policy=out,none out-interface=\$\"interface\" \
to-addresses=\$\"lease-address\" \r\
    \n    } else={/ip firewall nat add action=src-nat chain=srcnat ipsec-policy=out,none \
out-interface=\$\"interface\" to-addresses=\$\"lease-address\" \
    comment=\"NAT via ISP2\"}\r\
    \n   :if [:tobool ([/ip route rule find comment=\"From ISP2 IP to Inet\"])] do={\r\
    \n      /ip route rule set [find comment=\"From ISP2 IP to Inet\"] \
src-address=\$\"lease-address\" table=to_isp2\r\
    \n    } else={/ip route rule add comment=\"From ISP2 IP to Inet\" \
src-address=\$\"lease-address\" table=to_isp2}\r\
    \n} else={\r\
    \n   /ip route remove [find gateway=\"4.2.2.2\"]; /ip route remove [find where \
dst-address ~\"4.2.2.2\"]\r\
    \n   /ip firewall nat remove  [find comment=\"NAT via ISP2\"]\r\
    \n   /ip route rule remove [find comment=\"From ISP2 IP to Inet\"]\r\
    \n}\r\
    \n" use-peer-dns=no use-peer-ntp=no

ROS7:

/ip dhcp-client
add add-default-route=no dhcp-options=clientid,clientid interface=ether2 \
script=":if (\$bound=1) do={\r\
    \n   /ip route remove [ find gateway=\"4.2.2.2\" ]; /ip route remove \
[ find where dst-address ~\"4.2.2.2\" ]\r\
    \n   /ip route add check-gateway=ping comment=\"For recursion via ISP2\" distance=1 \
dst-address=4.2.2.2/32 gateway=\$\"gateway-address\" scope=11\r\
    \n   /ip route add check-gateway=ping comment=\"Unmarked via ISP2\" \
distance=1 gateway=4.2.2.2 target-scope=11\r\
    \n   /ip route add comment=\"Marked via ISP2 Main\" distance=1 gateway=4.2.2.2 \
routing-table=to_isp2 target-scope=11\r\
    \n   /ip route add comment=\"Marked via ISP1 Backup1\" distance=2 gateway=4.2.2.2 \
routing-table=to_isp1 target-scope=11\r\
    \n   /ip route add comment=\"Marked via ISP3 Backup2\" distance=3 gateway=4.2.2.2 \
routing-table=to_isp3 target-scope=11\r\
    \n   :if [:tobool ([/ip firewall/nat/ find comment=\"NAT via ISP2\"])] do={\r\
    \n   /ip firewall nat set [find comment=\"NAT via ISP2\"] action=src-nat \
chain=srcnat ipsec-policy=out,none out-interface=\$\"interface\" \
to-addresses=\$\"lease-address\" \r\
    \n    } else={/ip firewall nat add action=src-nat chain=srcnat ipsec-policy=out,none \
out-interface=\$\"interface\" to-addresses=\$\"lease-address\" \
comment=\"NAT via ISP2\"}\r\
    \n    :if [:tobool ([/routing/rule find comment=\"From ISP2 IP to Inet\"])] do={\r\
    \n      /routing/rule/set [find comment=\"From ISP2 IP to Inet\"] \
action=lookup src-address=\$\"lease-address\" table=to_isp2\r\
    \n    } else={/routing/rule/add action=lookup comment=\"From ISP2 IP to Inet\" \
src-address=\$\"lease-address\" table=to_isp2 }\r\
    \n} else={\r\
    \n   /ip route remove [find gateway=\"4.2.2.2\"]; /ip route remove [find where \
dst-address ~\"4.2.2.2\"]\r\
    \n   /ip firewall nat remove  [find comment=\"NAT via ISP2\"]\r\
    \n   /routing/rule/remove [find comment=\"From ISP2 IP to Inet\"]\r\
    \n}\r\
    \n" use-peer-dns=no use-peer-ntp=no

Привожу содержимое только тела скрипта DHCP клиента

ROS6:

:if ($bound=1) do={
   /ip route remove [ find gateway="4.2.2.2" ]; /ip route remove [ find where \
dst-address ~"4.2.2.2" ]
   /ip route add check-gateway=ping comment="For recursion via ISP2" distance=1 \
dst-address=4.2.2.2/32 gateway=$"gateway-address" scope=11
   /ip route add check-gateway=ping comment="Unmarked via ISP2" distance=1 \
gateway=4.2.2.2 target-scope=11
   /ip route add comment="Marked via ISP2 Main" distance=1 gateway=4.2.2.2 \
routing-mark=to_isp2 target-scope=11
   /ip route add comment="Marked via ISP1 Backup1" distance=2 gateway=4.2.2.2 \
routing-mark=to_isp1 target-scope=11
   /ip route add comment="Marked via ISP3 Backup2" distance=3 gateway=4.2.2.2 \
routing-mark=to_isp3 target-scope=11
   :if [:tobool ([/ip firewall nat find comment="NAT via ISP2"])] do={
    /ip firewall nat set [find comment="NAT via ISP2"] action=src-nat chain=srcnat \
ipsec-policy=out,none out-interface=$"interface" to-addresses=$"lease-address" 
    } else={ /ip firewall nat add action=src-nat chain=srcnat ipsec-policy=out,none \
out-interface=$"interface" to-addresses=$"lease-address" comment="NAT via ISP2"}
   :if [:tobool ([/ip route rule find comment="From ISP2 IP to Inet"])] do={
      /ip route rule set [find comment="From ISP2 IP to Inet"] \
src-address=$"lease-address" table=to_isp2
    } else={ /ip route rule add comment="From ISP2 IP to Inet" \
src-address=$"lease-address" table=to_isp2}
} else={
   /ip route remove [find gateway="4.2.2.2"]; /ip route remove [find where \
dst-address ~"4.2.2.2"]
   /ip firewall nat remove  [find comment="NAT via ISP2"]
   /ip route rule remove [find comment="From ISP2 IP to Inet"]
}

ROS7:

:if ($bound=1) do={
   /ip route remove [ find gateway="4.2.2.2" ]; /ip route remove \
[ find where dst-address ~"4.2.2.2" ]
   /ip route add check-gateway=ping comment="For recursion via ISP2" distance=1 \
dst-address=4.2.2.2/32 gateway=$"gateway-address" scope=11
   /ip route add check-gateway=ping comment="Unmarked via ISP2" distance=1 \
gateway=4.2.2.2 target-scope=11
   /ip route add comment="Marked via ISP2 Main" distance=1 gateway=4.2.2.2 \
routing-table=to_isp2 target-scope=11
   /ip route add comment="Marked via ISP1 Backup1" distance=2 gateway=4.2.2.2 \
routing-table=to_isp1 target-scope=11
   /ip route add comment="Marked via ISP3 Backup2" distance=3 gateway=4.2.2.2 \
routing-table=to_isp3 target-scope=11
   :if [:tobool ([/ip firewall/nat/ find comment="NAT via ISP2"])] do={
    /ip firewall nat set [find comment="NAT via ISP2"] action=src-nat chain=srcnat \
ipsec-policy=out,none out-interface=$"interface" to-addresses=$"lease-address" 
    } else={ /ip firewall nat add action=src-nat chain=srcnat ipsec-policy=out,none \
out-interface=$"interface" to-addresses=$"lease-address" comment="NAT via ISP2" }
    :if [:tobool ([/routing/rule find comment="From ISP2 IP to Inet"])] do={
      /routing/rule/set [find comment="From ISP2 IP to Inet"] action=lookup \
src-address=$"lease-address" table=to_isp2
    } else={ /routing/rule/add action=lookup comment="From ISP2 IP to Inet" \
src-address=$"lease-address" table=to_isp2 }
} else={
   /ip route remove [ find gateway="4.2.2.2" ]; /ip route remove [ find where \
dst-address ~"4.2.2.2" ]
   /ip firewall nat remove  [find comment="NAT via ISP2"]
   /routing/rule/remove [find comment="From ISP2 IP to Inet"]
}

Замечание. Первая часть скрипта срабатывает при успешном получении аренды, вторая — после освобождения аренды.Примечание 2

Важно!

В отдельных случаях шлюз может не отвечать на ICMP запросы. C этим можно встретиться на lte подключении в режиме passthrough или если провайдер фильтрует ICMP на шлюз. В такой ситуации для маршрута «For recursion via ISP(x)» вместо check-gateway=ping можно указывать check-gateway=arp.

3.3. Настраиваем подключение к провайдеру ISP3.

Поскольку провайдер настройки нам выдает динамические, то разумно необходимые изменения делать скриптами, которые стартуют после поднятия и после падения интерфейса ppp.

Замечание. Интерфейс ppp может быть указан в качестве шлюза вместо IP адреса. Однако в таком варианте рекурсивный маршрут задействовать не получится. Посему мы получаем в переменную IP адрес стороны провайдера и используем ее дальше точно так же, как и для остальных провайдеров

3.3.1. Сначала конфигурируем профиль
ROS6:

/ppp profile
add comment="for PPPoE to ISP3" interface-list=WAN name=isp3_client \
on-down="/ip route remove [find gateway=\"4.2.2.3\"]\r\
    \n/ip route remove [find where dst-address ~\"4.2.2.3\"]\r\
    \n/ip firewall nat remove  [find comment=\"NAT via ISP3\"]\r\
    \n/ip route rule remove [find comment=\"From ISP3 IP to Inet\"]" \
on-up="/ip route remove [find gateway=\"4.2.2.3\"]; \r\
    \n/ip route remove [find where dst-address ~\"4.2.2.3\"]\r\
    \n/ip route add check-gateway=ping comment=\"For recursion via ISP3\" distance=1 \
dst-address=4.2.2.3/32 gateway=\$\"remote-address\" scope=11\r\
    \n/ip route add check-gateway=ping comment=\"Unmarked via ISP3\" \
distance=3 gateway=4.2.2.3 target-scope=11\r\
    \n/ip route add comment=\"Marked via ISP3 Main\" distance=1 gateway=4.2.2.3 \
routing-mark=to_isp3 target-scope=11\r\
    \n/ip route add comment=\"Marked via ISP1 Backup2\" distance=3 gateway=4.2.2.3 \
routing-mark=to_isp1 target-scope=11\r\
    \n/ip route add comment=\"Marked via ISP2 Backup2\" distance=3 gateway=4.2.2.3 \
routing-mark=to_isp2 target-scope=11\r\
    \n/ip firewall mangle set [find comment=\"Connmark in from ISP3\"] \
in-interface=\$\"interface\"\r\
    \n:if [:tobool ([/ip firewall nat find comment=\"NAT via ISP3\"])] do={\r\
    \n  /ip firewall nat set [find comment=\"NAT via ISP3\"] action=src-nat chain=srcnat \
ipsec-policy=out,none out-interface=\$\"interface\" to-addresses=\$\"local-address\"} \
else={\r\
    \n  /ip firewall nat add action=src-nat chain=srcnat ipsec-policy=out,none \
out-interface=\$\"interface\" to-addresses=\$\"local-address\" \
comment=\"NAT via ISP3\"}\r\
    \n:if [:tobool ([/ip route rule find comment=\"From ISP3 IP to Inet\"])] \
do={\r\
    \n  /ip route rule set [find comment=\"From ISP3 IP to Inet\"] \
src-address=\$\"local-address\" table=to_isp3} else={\r\
    \n  /ip route rule add comment=\"From ISP3 IP to Inet\" \
src-address=\$\"local-address\" table=to_isp3 }"

ROS7:

/ppp profile
add interface-list=WAN name=isp3_client on-down=\
    "/ip route remove [find gateway=\"4.2.2.3\"]\r\
    \n/ip route remove [find where dst-address ~\"4.2.2.3\"]\r\
    \n/ip firewall nat remove  [find comment=\"NAT via ISP3\"]\r\
    \n/routing/rule/ remove [find comment=\"From ISP3 IP to Inet\"]" \
on-up="/ip route remove [find gateway=\"4.2.2.3\"]; \r\
    \n/ip route remove [find where dst-address ~\"4.2.2.3\"]\r\
    \n/ip route add check-gateway=ping comment=\"For recursion via ISP3\" distance=1 \
dst-address=4.2.2.3/32 gateway=\$\"remote-address\" scope=11\r\
    \n/ip route add check-gateway=ping comment=\"Unmarked via ISP3\" \
distance=3 gateway=4.2.2.3 target-scope=11\r\
    \n/ip route add comment=\"Marked via ISP3 Main\" distance=1 gateway=4.2.2.3 \
routing-table=to_isp3 target-scope=11\r\
    \nip route add comment=\"Marked via ISP1 Backup2\" distance=3 gateway=4.2.2.3 \
routing-table=to_isp1 target-scope=11\r\
    \nip route add comment=\"Marked via ISP2 Backup2\" distance=3 gateway=4.2.2.3 \
routing-table=to_isp2 target-scope=11\r\
    \nip firewall mangle set [find comment=\"Connmark in from ISP3\"] \
in-interface=\$\"interface\"\r\
    \n:if [:tobool ([/ip firewall/nat/ find comment=\"NAT via ISP3\"])] do={\r\
    \n  /ip firewall nat set [find comment=\"NAT via ISP3\"] action=src-nat chain=srcnat \
ipsec-policy=out,none out-interface=\$\"interface\" to-addresses=\$\"local-address\"} \
else={\r\
    \n  /ip firewall nat add action=src-nat chain=srcnat ipsec-policy=out,none \
out-interface=\$\"interface\" to-addresses=\$\"local-address\" \
comment=\"NAT via ISP3\"}\r\
    \n:if [:tobool ([/routing/rule/ find comment=\"From ISP3 IP to Inet\"])] do={\r\
    \n  /routing/rule/ set [find comment=\"From ISP3 IP to Inet\"] action=lookup \
src-address=\$\"local-address\" table=to_isp3} else={\r\
    \n  /routing/rule/ add action=lookup comment=\"From ISP3 IP to Inet\" \
src-address=\$\"local-address\" table=to_isp3 }"

Привожу содержимое только тела скрипта PPP профиля

ROS6(On Up):

/ip route remove [find gateway="4.2.2.3"]; 
/ip route remove [find where dst-address ~"4.2.2.3"]
/ip route add check-gateway=ping comment="For recursion via ISP3" distance=1 \
dst-address=4.2.2.3/32 gateway=$"remote-address" scope=11
/ip route add check-gateway=ping comment="Unmarked via ISP3" distance=3 \
gateway=4.2.2.3 target-scope=11
/ip route add comment="Marked via ISP3 Main" distance=1 gateway=4.2.2.3 \
routing-mark=to_isp3 target-scope=11
/ip route add comment="Marked via ISP1 Backup2" distance=3 gateway=4.2.2.3 \
routing-mark=to_isp1 target-scope=11
/ip route add comment="Marked via ISP2 Backup2" distance=3 gateway=4.2.2.3 \
routing-mark=to_isp2 target-scope=11
/ip firewall mangle set [find comment="Connmark in from ISP3"] in-interface=$"interface"
:if [:tobool ([/ip firewall nat find comment="NAT via ISP3"])] do={
  /ip firewall nat set [find comment="NAT via ISP3"] action=src-nat chain=srcnat \
ipsec-policy=out,none out-interface=$"interface" to-addresses=$"local-address"} else={
  /ip firewall nat add action=src-nat chain=srcnat ipsec-policy=out,none \
out-interface=$"interface" to-addresses=$"local-address" comment="NAT via ISP3"}
:if [:tobool ([/ip route rule find comment="From ISP3 IP to Inet"])] do={
  /ip route rule set [find comment="From ISP3 IP to Inet"] \
src-address=$"local-address" table=to_isp3} else={
  /ip route rule add comment="From ISP3 IP to Inet" src-address=$"local-address" \
table=to_isp3 }

ROS6(On Down):

/ip route remove [find gateway="4.2.2.3"]
/ip route remove [find where dst-address ~"4.2.2.3"]
/ip firewall nat remove  [find comment="NAT via ISP3"]
/ip route rule remove [find comment="From ISP3 IP to Inet"]

ROS7(On Up):

/ip route remove [find gateway="4.2.2.3"]; 
/ip route remove [find where dst-address ~"4.2.2.3"]
/ip route add check-gateway=ping comment="For recursion via ISP3" distance=1 \
dst-address=4.2.2.3/32 gateway=$"remote-address" scope=11
/ip route add check-gateway=ping comment="Unmarked via ISP3" distance=3 \
gateway=4.2.2.3 target-scope=11
/ip route add comment="Marked via ISP3 Main" distance=1 gateway=4.2.2.3 \
routing-table=to_isp3 target-scope=11
ip route add comment="Marked via ISP1 Backup2" distance=3 gateway=4.2.2.3 \
routing-table=to_isp1 target-scope=11
ip route add comment="Marked via ISP2 Backup2" distance=3 gateway=4.2.2.3 \
routing-table=to_isp2 target-scope=11
ip firewall mangle set [find comment="Connmark in from ISP3"] in-interface=$"interface"
:if [:tobool ([/ip firewall/nat/ find comment="NAT via ISP3"])] do={
  /ip firewall nat set [find comment="NAT via ISP3"] action=src-nat chain=srcnat \
ipsec-policy=out,none out-interface=$"interface" to-addresses=$"local-address"} else={
  /ip firewall nat add action=src-nat chain=srcnat ipsec-policy=out,none \
out-interface=$"interface" to-addresses=$"local-address" comment="NAT via ISP3"}
:if [:tobool ([/routing/rule/ find comment="From ISP3 IP to Inet"])] do={
  /routing/rule/ set [find comment="From ISP3 IP to Inet"] action=lookup \
src-address=$"local-address" table=to_isp3} else={
  /routing/rule/ add action=lookup comment="From ISP3 IP to Inet" \
src-address=$"local-address" table=to_isp3 }

ROS7(On Down):

/ip route remove [find gateway="4.2.2.3"]
/ip route remove [find where dst-address ~"4.2.2.3"]
/ip firewall nat remove  [find comment="NAT via ISP3"]
/routing/rule/ remove [find comment="From ISP3 IP to Inet"]

Замечание. Строка
/ip firewall mangle set [find comment=«Connmark in from ISP3»] in-interface=$«interface»;
позволяет корректно обрабатывать переименование интерфейса, поскольку работает с его ID а не отображаемым именем.

3.3.2. Теперь, используя профиль, создаем подключение ppp

/interface pppoe-client add allow=mschap2 comment="to ISP3" disabled=no \
interface=ether3 name=pppoe-isp3 password=isp3_pass profile=isp3_client \
add-default-route=no user=isp3_client

Замечание. Некоторые провайдеры «забывают» отдавать параметр «remote-address». В таком случае, при подключении скрипт настройки отработает некорректно, а в логе вы увидите такую ошибку:
pppoe,ppp,info pppoe-isp3: could not determine remote address, using xxx.xxx.xxx.xxx
Для решения этой проблемы нужно отключить check-gateway для маршрута с комментарием «For recursion via ISP3» и задать в ppp профиле IP адрес(любой фиктивный):

/ip route unset [find comment="For recursion via ISP3"] check-gateway
/ppp profile set isp3_client remote-address=169.254.69.96

Строка
/ip firewall mangle set [find comment=«Connmark in from ISP3»] in-interface=$«interface»;
позволяет корректно обрабатывать переименование интерфейса, поскольку работает с его идентификатором в системе а не отображаемым именем.

В качестве последнего штриха настроим часы
ROS6:

/system ntp client set enabled=yes \
server-dns-names=0.pool.ntp.org,1.pool.ntp.org,2.pool.ntp.org

ROS7:

/system ntp client set enabled=yes \
servers=0.pool.ntp.org,1.pool.ntp.org,2.pool.ntp.org

Для тех, кто дочитал до конца

Предложенный способ реализации мультиван — есть личное предпочтение автора и не является единственно возможным. Инструментарий ROS обширен и гибок, что с одной стороны вызывает сложности для начинающих, с другой — причина популярности. Изучайте, пробуйте, открывайте для себя новые инструменты и решения. Например, в качестве применения полученных знаний, можно в данной реализации мультиван заменить инструмент Сheck-gateway с рекурсивными маршрутами на Netwatch. Так же можно для повышения надежности использовать каскад рекурсивных маршрутов, что уменьшит количество ложных переключений при временной недоступности хоста, выбранного в качестве «базового». А такое иногда случается, даже со сверхнадежными anycast адресами.

Примечания

  1. Check-gateway — механизм, который позволяет деактивировать маршрут после двух подряд не успешных проверок шлюза на доступность. Проверка осуществляется раз в 10 секунд, плюс таймаут ответа. Итого, фактический тайминг переключения лежит в диапазоне 20-30 секунд. Если такой тайминг переключения не достаточен — есть вариант воспользоваться инструментом Netwatch, где таймер проверки можно задавать вручную и использовать пользовательские скрипты для более тонкого анализа состояния.
    Механизм Check-gateway не срабатывает при периодических потерях пакетов в канале. Важно! Деактивация/активация маршрута механизмом Check-gateway влечет за собой деактивацию/активацию всех остальных маршрутов, которые идут через тот же шлюз. Поэтому включать check-gateway для всех связанных маршрутов нет необходимости.
  2. Бывает, что в механизме работы DHСP происходит сбой, который выглядит, как клиент подвисший в состоянии renew. В таком случае вторая часть скрипта не отработает, но корректно ходить трафику не помешает, поскольку состояние отслеживает соответствующий рекурсивный маршрут.
  3. ECMP (Equal Cost Multi-Path) — в ROS есть возможность задать маршрут с несколькими шлюзами и одинаковой distance. В таком случае соединения будут распределяться по каналам, используя алгоритм round robin, пропорционально количеству указанных шлюзов.

За толчок к написанию статьи, помощь при формировании ее структуры и расстановке акцентов — личная благодарность Евгению @jscar

В данной статье мы затронем тему маркировки пакетов (mangle) и настройку Dual WAN на MikroTik как одну из основных тем. В Mikrotik данный функционал реализован через Mangle — используется для того чтобы пометить пакеты/соединения для дальнейшей их обработки очередями (простыми или деревьями), NAT правилами, таблицами маршрутизации или изменению таких параметров как:

  • TOS (DSCP);
  • TTL;
  • MSS;

На одном пакете/соединении может быть только одна метка

Данные метки работают только на определённом роутере и не передаются по сети другим участникам, хотя при желании можно на это повлиять.

Если вы хотите углубить свои знания по работе с роутерами MikroTik, то наша команда рекомендует пройти курсы которые сделаны на основе MikroTik Certified Network Associate и расширены автором на основе опыта . Подробно читайте ниже.

В сегодняшнем примере мы будем настраивать Dual WAN. Предполагается что у вас есть 2 провайдера, основной и резервный, с помощью Mangle мы сделаем правильную маркировку и выпустим клиентов через основного провайдера. Так же прикрутим скрипт, который будет проверять доступность выхода в интернет через обоих провайдеров, и в случае недоступности через основной, переключать на резервный канал.

Содержание

  1. Схема сети
  2. Настройка правил NAT
  3. Маркировка трафика
  4. Настройка Routing Rules
  5. Создание таблиц маршрутизации
  6. Настройка переключения интернет-каналов
  7. Проверка работоспособности
  8. 89 вопросов по настройке MikroTik

Схема сети

  • Предположим, что у нас имеется:
  • Широковещательная плоская 192.168.1.0/24;
  • Два белых статических IP адреса;
  • Один роутер;
  • Два свича;
  • RouterOS 6.48.1.

Схема сети двух провайдеров на Mikrotik

Настройка правил NAT

Для того чтобы наши внутренние клиент выходили в интернет, нам нужно 2 правила NAT. Один под основного провайдера, другой для резервного.Список NAT правил для разных провайдеров

Маркировка трафика

Следующая задача, промаркировать трафик для каждого провайдера, на вход и на выход. Открываем на микротике IP – Firewall – Mangle, создаём новое правило. Интересует цепочка Prerouting, входящий интерфейс первого оператора. Маркируем соединение и задаём понятное имя марки. Для оптимизации нагрузки можно выбрать только новые соединения.

Создаем первое правила Mangle для основного провайдера

Следующим правилом создаём маркировку роутинга для нашей ранее созданной метки соединения.

Настройка метки роутинга для первого провайдер

Теперь займемся output. На основе коннекшен марки создаём правило роутинга.

Маркируем трафик наружу для ISP1

Последним правилом маркировки для ISP1 будет цепочка output.

Создание правила маркировки на основе IP адреса

Для первого оператора метки заданы. По аналогии создаём и для второго, только придумываем другие имена меткам и в последнем правиле указываем соответствующий адрес.

Задаём соответствующий входящий интерфейс.

Маркирует трафик для второго провайдера

Создаём маркировку роутинга на основе connection mark.

Маркируем трафик для роутинга на резервного провайдера

И 2 правила на output.

Метим исходящий трафик

В итоге вся маркировка трафика у нас будет выглядеть таким образов.

Список правил маркировки

Настройка Routing Rules

Следующий этап, это настройка правил и таблиц маршрутизации. Следует разнести трафик по соответствующим провайдерам. Создаём Rule с src address первого оператора, впишем вручную новую table.

Создаем первое правило маршрутизации

По аналогии и для второго провайдера.

Правила Route rules

Порядок имеет значение. Необходимо указать все наши локальные сети, трафик к ним будет идти через табличку main.

Выбор таблицы маршрутизации для ЛВС

А теперь все наши mark routing выпустим через соответствующие таблички.

Распределение трафика по провайдерам

Создание таблиц маршрутизации

В основной таблице маршрутизации нужно создать 2 маршрута, основной и резервный. Для этого вам нужно определиться кто из них какую роль будет выполнять. Т.к. активный будет всегда один. У первого метрика 10.

Добавление маршрута в основную таблицу

У второго метрика 20.

Добавление default route с большей метрикой

Открываем table-ISP1 и создаём default route с любой метрикой через шлюз провайдера.

добавили маршрут в таблицу основного провайдера

Аналогично и для table-ISP2. Не перепутайте шлюзы.

Роут через ISP2

Чуть не забыл, обязательно дадим комментарии записям в main. Общий вид Route List следующий.

Обязательно даем комментарии на маршруты

Настройка переключения интернет-каналов

Есть несколько способов отслеживания состояния. Один из них — это проверка провайдерского шлюза arp или ping запросами в самой настройке маршрута. Но он не эффективен, т.к. gateway может быть и доступен, а доступ в инет за ним нет. Как один из вариантов, проверять доступность на основе пинг запросов каких-либо крупных сервисов, которые доступны круглосуточно. Встроенных средств у Mikrotik нет, и по этой причине будем использовать простенький скрипт ниже.

#Main interface name
:global MainIf ether1
#Failover interface name
:global RsrvIf ether2
:local PingCount 1
:local PingTargets {77.88.8.8; 8.8.8.8}
:local host
:local MainIfInetOk false
:local RsrvIfInetOk false
:local MainPings 0
:local RsrvPings 0
foreach host in=$PingTargets do={
:local res [/ping $host count=$PingCount interface=$MainIf]
:set MainPings ($MainPings + $res)
:local res [/ping $host count=$PingCount interface=$RsrvIf]
:set RsrvPings ($RsrvPings + $res)
:delay 1
}
:set MainIfInetOk ($MainPings >= 1)
:set RsrvIfInetOk ($RsrvPings >= 1)
:put "MainIfInetOk=$MainIfInetOk"
:put "RsrvIfInetOk=$RsrvIfInetOk"
:local MainGWDistance [/ip route get [find comment=" ISP1-WAN-Route"] distance]
:local RsrvGWDistance [/ip route get [find comment=" ISP2-WAN-Route"] distance]
:put "MainGWDistance=$MainGWDistance"
:put "RsrvGWDistance=$RsrvGWDistance"
if ($MainIfInetOk && ($MainGWDistance >= $RsrvGWDistance)) do={
/ip route set [find comment="ISP1-WAN-Route"] distance=10
/ip route set [find comment="ISP2-WAN-Route"] distance=20
:put "switched to MAIN internet connection"
/log info "switched to MAIN internet connection"
/ip firewall connection remove [find]
}
if (!$MainIfInetOk && $RsrvIfInetOk && ($MainGWDistance <= $RsrvGWDistance)) do={
/ip route set [find comment="ISP1-WAN-Route"] distance=20
/ip route set [find comment="ISP2-WAN-Route"] distance=10
:put "switched to RESERVE internet connection"
/log info "switched to RESERVE internet connection"
/ip firewall connection remove [find]
}

Основные параметры, которые вам нужно будет исправить это:

  • :global MainIf ether1 – основной интерфейс;
  • :global RsrvIf ether2 – резервный интерфейс;
  • :local PingTargets {77.88.8.8; 8.8.8.8} – таргеты, которые будите мониторить;
  • :local MainGWDistance – переменная метрики для ISP1;
  • :local RsrvGWDistance – переменная метрики для ISP2;
  • Комментарий маршрут.

Правим комментарии в скрипте

Добавляем данный скрипт в хранилище, даем имя check-internet.

Добавляем скрипт в Mikrotik

Тестируем работу через консоль.

Отлаживаем работу скрипта в роутерах Mikrotik

Как мы видим все отлично.

Тест скрипта интернета

Добавляем задание в планировщик. Обязательно указываем интервал. В данном случае раз в 15 сек. Это самый минимальный рекомендуемый интервал, ниже ставить не советую.Настройка запуска заданий Mikrotik

Из особенностей, очищает все соединения, когда происходит переключение. Вы так же можете добавить свои команды в конце тела.

Проверка работоспособности

Итак, мы все настроили и ждём чуда. Т.к. запросы у нас ICMP, для ускорения результата, на вышестоящем оборудовании включу блокировку данного трафика.

Автопереключение провайдера на Mikrotik

Если отключу блокировку, то все встаёт на свои места.

Основной канал включился автоматически

Вы можете прикрутить отправку письма вам на e-mail в случае переключения, или допустим полный сброс роутера))). Вот и все — в этой статье мы рассмотрели настройку настройка Dual WAN на MikroTik, для этого использовали маркировку трафика «mangle». Теперь основываясь на этом примере можете создавать свои собственные конфигурации.

89 вопросов по настройке MikroTik

Вы хорошо разбираетесь в Микротиках? Или впервые недавно столкнулись с этим оборудованием и не знаете, с какой стороны к нему подступиться? В обоих случаях вы найдёте для себя полезную информацию в курсе «Настройка оборудования MikroTik». 162 видеоурока, большая лабораторная работа и 89 вопросов, на каждый из которых вы будете знать ответ. Подробности и доступ к началу курса бесплатно тут.

В этой статье рассмотрим настройку
роутера компании Mikrotik, с RouterOS на борту, для одновременной работы
с двумя провайдерами.

Устройства от латвийской компании MikroTik —
гибкие в настройке, функциональные решения для домашних и корпоративных
сетей. Операционную систему RouterOS можно так же установить на
различные аппаратные платформы, включая x86.

Дано:

  • локальная сеть 192.168.1.0/24 — роутер выступает в роли DNS сервера и шлюза. Адреса в локальной сети присваиваются вручную;
  • сеть провайдера 1.1.1.0/29, шлюз — 1.1.1.6, DNS1 — 1.1.10.1, DNS2 — 1.1.10.2;
  • сеть провайдера 1.1.2.0/29, шлюз — 1.1.2.6, DNS1 — 1.1.10.1, DNS2 — 1.1.10.2

Рис.1 - Схема сети

Схема сети

Настраивать будем на компьютере с адресом в локальной сети 192.168.1.10. Для примера возьмем роутер модели RB951G-2HnD.

Порт 1 и 2 будем использовать под интернет провайдеров, а остальные под локальную сеть.

Теперь Вы можете подсоединить все патч-корды с соответствующими
портами. Я же предпочитаю первоначальную настройку производить на
отдельном ноутбуке, соединив LAN порт ноута с пятым портом роутера.
Подключаться будем через программу Winbox. Скачать можно с самого
роутера, введя в браузере адрес по умолчанию «192.168.88.1» или с mikrotik.com.
Сразу можно скачать обновление для RouterOS — ветки Bugfix only. На
момент написания статьи это была версия 6.34.6 (правки при 6.39.3).

Итак, запустим Winbox при подключеном роутере.

На вкладке Neighbors автоматически выполняется поиск всех видимых
устройств на RouterOS в сети. Подключаемся по mac-адресу к найденному
устройству пользователем admin с пустым паролем.

winbox_neighbors

После входа появится окно описания конфигурации по умолчанию. Нажимаем «Remove Configuration»

reset-configuration

Описание конфигурации по умолчанию

Далее как минимум необходимо задать пароль для пользователя.
Рекомендуется создать своего пользователя, а встроенную учетную запись
отключить, что мы и сделаем. Идём в меню System -> Users и добавляем
пользователя, нажав на плюс (+). Name — на Ваш выбор, Group — права
пользователя ставим в full, Password — на Ваш выбор. Также можно
перечислить адреса, с которых разрешено подключаться к роутеру, в опции
Allowed Address. Жмём ОК. Встроенную учетную запись отключаем или
удаляем нажав на (x) или (-) соответственно. Переподключаемся под новым
пользователем.

Управление учётными записями

Управление учётными записями

Терминал. Управление учётными записями

Теперь определимся с сетевыми интерфейсами, перейдя в меню Interfaces.
Как было описано выше, первый и второй порт роутера используем под wan
порты, а остальное выпускаем в локальную сеть, указывая для портов с 3го
по 4й в поле Master Port 5й порт. Для удобства к названию портов были
приписаны описания
(ether1-wan1, ether2-wan2, ether3-slave, ether4-slave, ether5-lan-master). Последний
порт был выбран мастером не случайно. Если возникнет необходимость
добавить еще один wan интерфейс, то мы просто уберем зависимость
третьего порта от мастер-порта и настроим его под свои нужды.
Необходимость переназначать мастер порт не возникнет, в отличии от
варианта с присвоением роли мастер-порта третьему порту роутера.

Настроим интерфейсы

Терминал. Настройка интерфейсов

При необходимости использовать wi-fi-интерфейс потребуется создать
bridge интерфейс и добавить в него мастер-пор ethernet интерфейсов и
wi-fi интерфейс  (на своём оборудовании wi-fi я отключил, так как в нём
не было необходимости). В данной статье используется так называемая
switch-коммутация портов, которая обладает большей производительностью
по сравнению с bridge-коммутацией. В приведенном роутере используется
один switch-микроконтроллер на 5 портов. При наличии более одного
switch-контроллера на каждый контроллер назначается один мастер порт,
затем они объединяются в bridge, если есть необходимость объединить их в
одно пространство. Подробнее о различиях способов коммутации портов
можно прочитать здесь.
Ниже приведен пример создания bridge-интерфейса и добавление в него мастер-интерфейса.

Создадим bridge- интерфейс

Создание bridge- интерфейс

Добавим порт в bridge-интерфейс

Добавление порта в bridge-интерфейс

Терминал. Работа с bridge-интерфейсом

Теперь укажем ip адреса для интерфейсов. Переходим в меню IP ->
Addresses и добавляем адреса, вписывая его в поле Address с маской и
выбирая интерфейс в поле Interface. Адрес сети в поле Network можно не
вводить т.к. он заполнится автоматически, но при изменении адреса не
забудьте проверить это поле. При объединении свитч-группы портов и wifi
интерфейса в bridge — ip адрес присваивается на bridge интерфейс. В моём
случае адрес присваивается мастер-порту.

Адрес для wan1

Адрес для wan1

Адрес для wan2

Адрес для wan2

Адрес роутера в локальной сети

Терминал. Добавление IP-адресов

Адреса присвоены

Т.к. у нас будет два wan-интерфейса и статические адреса,
настраиваемые на интерфейсах вручную, то все маршруты мы напишем
вручную. В случае настройки wan-интерфейса, например, на ppp
подключение, то не забудьте убрать галочку ‘Add Default Route’.

В меню IP-> DNS укажем DNS-серверы и поставим галочку на Allow
Remote Requests (если оно Вам надо).  Тут же можно создать запись с
именем нашего роутера, предварительно изменив его (имя) в меню System
-> Identity.

Настроим DNS

Настроим DNS

Терминал. Идентификация и DNS серверы

В случае классической настройки роутера с одним ISP WAN далее следовало
бы указать шлюз, добавить стандартные правила Firewall’а и правило NAT
для преобразования адресов. Но так как мы имеем дела с двумя ISP, то
следует сначала настроим Firewall и NAT, а так же пометим интерфейсы и
трафик для корректной маршрутизации.
Для каждого wan интерфейса создаём по правилу в IP -> Firewall на
вкладке NAT. В поле Chain на вкладке General выбираем srcnat,
Src.Address — пишем локальную сеть с маской, Out. Interface — выбираем
wan интерфейс. Если провайдер выдает динамически изменяющийся ip адресс,
то на вкладке Action в поле Action выбираем masquerade. При статическом
IP адресе, как в текущем примере, выбираем Action — src-nat и в поле To
Address пишем адрес wan интерфейса. Нажимаем ОК.

Теперь переходим на вкладку Filter Rules и добавляем набор
стандартных правил. В графической оболочке принцип настройки такой же
как и при добавления правила NAT — на вкладке General выбираем параметры
и цепочку, а на вкладке Action выбираем действие. Ниже привожу набор
команд для термина, из которых понятно что и как настроить в каждом
правиле. Так же можно скопировать и выполнить в окне терминала (кнопка
New Terminal) одним списком.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

# переходим на уровень IP -> Firewall -> Filter

/ip firewall filter

# разрешаем установленные и связанные соединения для цепочки input

add chain=input connection-state=established,related

# разрешаем ping для цепочки input

add chain=input protocol=icmp

# запрещаем недействительные соединения для цепочки input

add action=drop chain=input connection-state=invalid

# разрешаем доступ из локальной сети к роутеру

add chain=input src-address=192.168.1.0/24

# всё остальное запрещаем для цепочки input

add action=drop chain=input

# включим fasttrack для установленных и связанных соединений в цепочки forward

add action=fasttrack-connection chain=forward connection-state=established,related

# разрешаем установленные и связанные соединения для цепочки forward

add chain=forward connection-state=established,related

# разрешаем ping для цепочки forward

add chain=forward protocol=icmp

# запрещаем недействительные соединения для цепочки forward

add action=drop chain=forward connection-state=invalid

# разрешаем доступ из локальной сети в интернет

add chain=forward src-address=192.168.1.0/24

# всё остальное запрещаем для цепочки forward

add action=drop chain=forward

Для установленных и связанных соединений в цепочке forward добавлено
правило fasttrack connection. Это правило позволит разгрузить
процессор маршрутизатора, отключив (пропустив) дополнительную обработку
пакетов в установленных и связанных соединениях. Подробнее на MikroTik Wiki.

В рассматриваемом примере в локальной сети находится сервер, с
которым будет вестись работа извне. Для выполнения этой задачи
необходимо чтобы ответы на запросы, пришедшие по какому-либо из двух
wan-интерфейсов, отправлялись на тот же самый интерфейс.

Для выполнения поставленной задачи необходимо пометить соединения с
провайдером и после направлять трафик по соответствующим маршрутам, а
так же создать сами маршруты.

Сразу добавим статические маршруты до шлюзов каждого из провайдера,
плюс по маршруту на провайдера для соединений с метками маршрутизации.
Маршрут до гейтов провайдеров можно указать одним правилом с одним на
всех значением Distance, таким образом получив своеобразную балансировку
нагрузки по wan интерфейсам. [По резервированию и Check Gateway чуть
позже]

Маршрут до гетов провайдеров. Балансировка нагрузки

Маршрут до гейтов провайдеров. Балансировка нагрузки

В каждом маршруте для помеченных соединений я указывал IP адреса
интерфейсов wan1 и wan2. В зависимости от типов настроенных соединений
для wan’ов можно указывать IP интерфейса или сам интерфейс. Для
статичных адресов метод с интерфейсами не заработал, так как адреса
статикой были присвоены на бродкастные интерфейсы и с другой стороны wan
интерфейса находятся медиаконвертеры провайдеров без proxy-arp на
интерфейсах. В поле Routing Mark выбираем соответствующую метку.

Маршрут для помеченных пакетов через wan1

Маршрут для помеченных соединений через wan1

Маршрут для помеченных пакетов через wan2

Маршрут для помеченных соединений через wan2

Терминал. Добавляем маршруты

В IP -> Firewall на вкладке Mangle создаём правила для двух
провайдеров, которые будут помечать соединения идущие по цепочке forward
с wan интерфейсов. На вкладке General в поле Chain выбираем forward, в
поле In. Interface выбираем ether1-wan1, затем на вкладке Action
выбираем mark connection, в поле New Connectio Mark пишем произвольную
метку, например wan1-con. Аналогичным образом создаём правило для wan2.

Помечаем соединения для wan1

Помечаем соединения для wan1

Помечаем соединения для wan2

Помечаем соединения для wan2

Следом создаем еще два правила на вкладке Mangle — для помеченных
ранее соединений указываем метки для маршрутизации, чтобы помеченные
ранее соединения продолжали работать через wan интерфейсы, через которые
были установлены (соединения). На вкладке General в поле Chain
выбираем prerouting, в поле Src.Address пишем 192.168.1.0/24 (если за
маршрутизатором несколько подсетей, то удобно занести их в
Firewall->Address Lists и затем указать созданый лист на вкладке
Advanced в поле Src. Address List), в поле Connection Mark выбираем
метку нашего соединения — wan1-con. Переходим на вкладку Action, в поле
Action выбираем mark routing, в поле New Routing Mark пишем wan1-rt.
Аналогично создаем правило для wan2, выбирая wan2-con и вписывая wan2-rt
для Connection Mark и New Routing Mark соответственно.

mikrotik_mark_rt_wan1

Добавляем метку маршрутизации для соединений через wan1

mikrotik_mark_rt_wan2

Добавляем метку маршрутизации для соединений через wan2

Теперь подобным образом создаём пары правил для каждого интерфейса,
чтобы корректно обрабатывать соединения извне с самим маршрутизатором
(например SSH, WinBox, VPN). Для каждого wan выбираем Chain — input,
Dst.Address — ip адрес wan интерфейса, In/Interface — wan интерфейс,
Action — mark connection, New Connection Mark — текстовую марку,
уникальную для каждого правила.

Теперь похожим образом добавляем помеченным маршрутам метку
маршрутизации. Цепочка output, Connection Mark — присвоенная метка
правилом выше для wan интерфейса. Action — mark routing, New Routing
Mark — метка для наших маршрутов через wan интерфейсы.

Пометим
собственные соединения маршрутизатора (DNS запросы от маршрутизатора к
внешним серверам, проверка пакетов в System->Packages). Цепочка
output, Src.Address — адрес wan интерфейса, Action — mark connection,
New Connection Mark — уникальная текстовая метка для каждого wan
интерфейса.

И добавляем метку маршрутизации. Цепочка output, Src.Address — адрес
wan интерфейса, Connection Mark — присвоенная метка правилом выше для
wan интерфейса. Action — mark routing, New Routing Mark — метка для
наших маршрутов через wan интерфейсы.

Терминал. Помечаем соединения и маршруты

Вот и всё. Выпустив роутер в сеть проверяем доступность шлюзов
провайдера — посмотрев на список маршрутов в колонке Gateway к адресу
шлюза будет дописано reachable. Так же в списке появятся динамически
созданные маршруты. Проверяя работу из локальной сети можно отключая
интерфейсы wan в MikroTik’е или просто попеременно выдергивать по одному
проводу из wan’ов. Активные соединения, установленные ранее через
отключенный wan будут теряться, но перезапустив соединение (например
обновив страницу в браузере) оно будет установлено через оставшийся
активный wan.

В приведенном примере оба wan порта работают в подсетях одного
провайдера и DNS серверы для подсетей общие. Если провайдеры разные, то
скорее всего потребуется указать через какой интерфейс ходить до
конкретного DNS сервера, так как к каждому DNS серверу может быть
разрешен доступ только из сети соответствующего ему повайдера. Таким же
образом можно принудительно пускать трафик до конкретных ресурсов через
конкретный wan (например, если до ресурса во внешней сети соединение
оптимально по скорости/стабильности через конкретного провайдера, или
просто только из сети/ip-адреса этого провайдера разрешен доступ).

Перейдем в IP -> Firewall и на вкладке Address Lists создадим для
каждого wan по группе адресов (over-wan1 и over-wan2) попутно добавляя
необходимые адреса или подсети. Каждый последующий элемент добавляется с
выбором группы адресов из списка в поле Name. Допустим есть некий
сервис по адресу 110.110.110.1 до которого минимальные задержки у
провайдера на wan1, а для сервиса по адресу 220.220.220.2 такая же
история, но на wan2. В группу over-wan1 мы добавляем 110.110.110.1, а
в over-wan2 добавляем 220.220.220.2. Так же в соответствующие группы
нужно добавить адреса DNS серверов провайдера, если провайдеры разные. В
приведенном примере добавляем только адреса сервисов.

Создаём списки. Добавляем адреса

Создаём списки. Добавляем адреса

Теперь переходим на вкладку Mangle и создаём по правилу на каждый
список чтобы пометить маршруты. На вкладке General поле Chain =
prerouting и внизу ставим галочку на Connection State — new. Далее на
вкладке Advanced в поле Dst. Address List выбираем список адресов
(over-wan1) и на вкладке Action в поле Action выбираем mark routing, в
поле New Routing Mark выбираем метку (wan1-rt). Таким же образом создаём
правило для следующего списка.

mikrotik_addr_list_mang01

mikrotik_addr_list_mang02

mikrotik_addr_list_mang03

Теперь можно проверить доступность ресурсов из адресных списков
запустив трассировку до узла. Соединение должно идти через шлюз
определенного для выбранного wan провайдера.

Вот  и всё на этом. Удачи Вам!

Материал из MikroTik Wiki

Введение

В статье разбирается настройка двух Интернет-каналов в режиме резервирования. Т. е. в ситуациях, когда один провайдер будет работать постоянно (основной канал), а второй будет включаться в случае, если Интернет через первый канал будет недоступен (резервный канал).

Есть два основных способа настройки работы устройств МикроТик для работы с двумя провайдерами в режиме резервирования. Кратко их можно охарактеризовать, как «быстрый способ» и «комплексный способ». Первый способ является быстрым для настройки. Что явно следует из названия. Второй способ является более сложным в настройке, но при этом лишен недостатков, которые присущи первому способу.

Схема сети

Схема сети двух интернет каналов на оборудовании МикроТик

Внешняя сеть:
Интернет-канал №1
IP-адреса маршрутизатора: 10.1.100.1
IP-адреса провайдера: 10.1.100.254
маска: 255.255.255.0

Интернет-канал №2
IP-адреса маршрутизатора: 10.1.200.1
IP-адреса провайдера: 10.1.200.254
маска: 255.255.255.0

Внутренняя сеть:
IP-адреса маршрутизатора: 192.168.15.1
маска: 255.255.255.0

Быстрый способ

Через графический интерфейс

Приведенные ниже манипуляции подразумевают, что вы уже настроили IP-адреса двум внешним интерфейсам, прописали маршруты и сделали правила masquerade.

Если у вас статические IP-адреса от обоих провайдеров, то простейшая настройка резервирования сводится к установке приоритетов маршрутов на первого и второго провайдера.

Зайти в IP => Routes и для маршрута на Провайдера-1 указываем Check Gateway=ping и Distance=5. В настройках маршрута на Провайдера-2 указываем Check Gateway=ping и Distance=10. Значения параметра Distance не обязательно должны быть такими. Важно, что бы значения для Провайдера-1 было меньше чем для Провайдера-2. Как правило, статические маршруты имеют приоритет (Distance) равный единице. Для примера мы привели другое значение.
При такой схеме весь трафик будет идти через Провайдера-1, путь через Провайдера-2 будет резервным. Шлюзы обоих провайдеров будут периодически пинговаться, и при недоступности шлюза Провайдера-1 маршрут на него будет отключен, а трафик пойдет по маршруту на Провайдера-2. После того, как шлюз Провайдера-1 станет опять доступным трафик опять пойдет через него.

Недостатком данной схемы является то, что в ней проверяется не наличие Интернета, а именно доступность следующего узла. Часто встречаются ситуации, когда оборудование провайдера (следующий узел) доступно, а интернета нет. Очень яркий пример это Интернет через ADSL-модем. Соседний узел (ADSL-модем) будет доступным, а Интернет нет.

Для первого Интернет-канала:

Резервирование Интернет-канала с помощью маршрутизатора МикроТик, простой способ, маршрутизатор №1

Для второго Интернет-канала:

Резервирование Интернет-канала с помощью маршрутизатора МикроТик, простой способ, маршрутизатор №2

Через консоль

Первый маршрутизатор:

/ip route
add check-gateway=ping distance=5 gateway=10.1.100.254

Второй маршрутизатор:

/ip route
add check-gateway=ping distance=10 gateway=10.1.200.254

Комплексный способ

Через графический интерфейс

Приведенные ниже манипуляции подразумевают, что вы уже настроили IP-адреса двум внешним интерфейсам, прописали маршруты и сделали правила NAT.

«Комплексный» способ основан на том, что с помощью встроенной утилиты «Netwatch», мы будем один раз в минуту проверять доступность интернета с помощью команды ping до узла 8.8.4.4 через первый интернет канал. Доступ до этого узла через второй Интернет-канал будет всегда закрыт. Таким образом если ping проходит — это значит, что первый канал находится в рабочем состоянии и он должен быть включен, а 2-ой канал должен быть выключен. И наоборот: если ping не проходит — это значит, что первый канал не работает и он должен быть выключен и включен 2-ой канал. Как только ping начнет проходить произойдет обратной переключение. Нужный маршрут утилита будет определять по комментарию, который мы назначим. Как видите этот способ лишен недостатка первого способа.

Добавить комментарии к маршрутам. К маршруту через первого провайдера добавить комментарий ISP1, к маршруту через второго провайдера добавить комментарий ISP2. Приведем пример для первого провайдера. Для второго действие делается аналогично.

Настройка комментария для маршрута через первый внешний интерфейс на маршрутизаторе МикроТик

Создать статический маршрут до 8.8.4.4. В IP => Routes создать маршрут до адреса 8.8.4.4 через шлюз 1-го интернет провайдера.

Настройка маршрута до адреса 8.8.4.4 через первый внешний интерфейс на маршрутизаторе МикроТик

Добавить правило блокирующее доступ к 8.8.4.4 через 2-ой WAN-интерфейс.

Настройка правила файервола, которое блокирует доступ до 8.8.4.4 через 2-ой внешний интерфейс на маршрутизаторе МикроТик, шаг 1

Настройка правила файервола, которое блокирует доступ до 8.8.4.4 через 2-ой внешний интерфейс на маршрутизаторе МикроТик, шаг 2

Добавить условие переключения. В Tools => Netwatch на вкладке «Host» создать новый «Netwatch host». В графе «Host» указать отслеживаемый ip-адрес, в «Interval» — частоту осуществляемых проверок, а в «Timeout» — время недоступности хоста при котором сработает триггер.

В примере указан адрес 8.8.8.8. Это опечатка. Должен быть адрес 8.8.4.4

Настройка утилиты "Netwatch" на маршрутизаторе МикроТик, шаг 1

На вкладке «Up» добавить скрипт следующего содержания:
/ip route set [find comment="ISP1"] disabled=no
/ip route set [find comment="ISP2"] disabled=yes

Настройка утилиты "Netwatch" на маршрутизаторе МикроТик, шаг 2

На вкладке «Down» добавить скрипт следующего содержания:
/ip route set [find comment="ISP1"] disabled=yes
/ip route set [find comment="ISP2"] disabled=no

Настройка утилиты "Netwatch" на маршрутизаторе МикроТик, шаг 3

Через консоль

/ip route
set comment=ISP1 [find gateway=10.1.100.254]
set comment=ISP2 [find gateway=10.1.200.254]

/ip route
add distance=1 dst-address=8.8.4.4/32 gateway=10.1.100.254

/ip firewall filter
add action=drop chain=output dst-address=8.8.4.4 out-interface=ether4-WAN2 protocol=icmp comment="Deny 8.8.4.4 through reserved internet-channel"

/tool netwatch
add down-script="/ip route set [find comment=\"ISP1\"] disabled=yes\r\
\n/ip route set [find comment=\"ISP2\"] disabled=no" host=8.8.4.4 \
up-script="/ip route set [find comment=\"ISP1\"] disabled=no\r\
\n/ip route set [find comment=\"ISP2\"] disabled=yes"

Полезные материалы по MikroTik

Проверка

  • Mts connect 4g wifi роутер
  • Mikrotik роутер как зайти в настройки роутера
  • Mts 4g wifi роутер личный кабинет
  • Mikrotik роутер настройка с нуля
  • Mt pon at 4 wifi настройка роутера