Инструкция по настройке 2-ух провайдеров на роутере MikroTik. В описании буду рассмотрены два распространённых типа работы двух провайдеров: резервирование и балансировка.
Резервирование(автопереключение) – при обрыве провайдера-1, весь интернет трафик переключается на провайдера-2;
Балансировка – тип настройки, когда две линии интернета работают одновременно. Распределение между провайдером-1 и провайдером-2 может быть в ручном или автоматическом режиме.
Данный набор настроек будет считаться контрольной точкой для дальнейших режимов работы роутера MikroTik, а именно резервирования(автопереключения) и балансировки.
В исходной настройке роутера MikroTik произведена базовая настройка и как минимум один интернет провайдер уже работает.
Начать нужно с того, что требуется физическое подключение 2-ого провайдера. Для этого нужно подготовить свободный порт и исключить его из Bridge(LAN).
Освободить порт для 2-ого провайдера
Настройка находится Bridge→Ports
На данном примере, был удалён ether2 со списка портов, принадлежащих к Bridge-LAN.
Настроить 2-ого провайдера
Настройка находится IP→DHCP client
Add Default Route = no – статическая маршрутизация для 2-ого провайдера будет доставлена вручную.
Настройка находится IP→Addresses
Настройка находится IP→Routes
Настройка находится PPP→Interface
Add Default Route = no – статическая маршрутизация для 2-ого провайдера будет доставлена вручную.
Добавление 2-ого провайдера в список WAN
Настройка находится Interfaces→Interface List
Список WAN должен включать интерфейсы двух провайдеров для того, чтобы правило Masquerade в IP→Firewall→NAT работало сразу для двух провайдеров
Отключить добавление DNS серверов для провайдера-1
Эти действия приведут к тому, что роутер MikroTik не будет использовать DNS сервера текущих интернет провайдеров. К примеру ситуация переключения на резервную линию может спровоцировать отсутствие DNS ответа, т.к. клиент или сам роутер осуществляет DNS запрос через основного провайдера. А он в то время уже перестал работать. Поэтому будут установлены общедоступные DNS сервера, который будут работать с двух провайдеров.
Настройка находится IP→DHCP client
Настройка находится PPP→Interface
Определить общедоступные DNS сервера
Настройка находится IP→DNS
Отсутствие записей DNS серверов в разделе Dynamic Servers указывает на то, что роутер MikroTik не использует автоматические DNS сервера, которые назначаются в автоматическом режиме.
В Servers стоит указать общедоступные DNS сервера типа Cloudflare DNS и удалить любые другие DNS сервера.
Отключить автоматическое добавление маршрутов
Т.к. все маршруты будут добавлены в ручном режиме, следует отключить все динамические маршруты для основного провайдера. Такие маршруты помечены буквой D(Dynamic) в таблице маршрутизации:
Настройка находится IP→Routes
Настройка находится IP→DHCP client
Настройка находится PPP→Interface
Добавление маршрутов для двух провайдеров
Для переключение между провайдерами, будет использоваться скрипт, который будет находить маршрут с комментарием ISP-1 или ISP-2 и выключать или включать его в зависимости от статуса работы интернета. Ниже будет описан метод, как это можно сделать для типов подключения: статический IP, dhcp клиент, PPPoE подключение. Этим методом нужно воспользоваться для назначения комментария двух провайдеров.
Кроме обозначенных комментариев нужно определить distance = 2.
Настройка находится IP→Routes
В случае с DHCP client значение Gateway можно взять с раздела Status самого DCHP клиента
Настройка находится IP→DCHP Client
Настройка находится IP→Routes
Mangle маркировка ответов для двух провайдеров
Правила маркировки маршрутов нужно определять только для белых(постоянных) IP адресов! Этот набор правил будет гарантировать то, что если пришёл input запрос на порт второго(или первого) провайдера, через этот же порт будет отправлен ответ. При отсутствии этих правил, доступ к роутеру по внешним IP может сопровождаться непредсказуемой работой.
Маркировка будет состоять из двух каскадных правил: маркировки соединения и маркировки маршрута
Настройка находится IP→Firewall→Mangle
/ip firewall mangle add action=mark-connection chain=input in-interface=pppoe-out1 \ new-connection-mark=From-ISP-1 add action=mark-routing chain=output connection-mark=From-ISP-1 \ new-routing-mark=To-ISP-1 add action=mark-connection chain=input in-interface=ether2 \ new-connection-mark=From-ISP-2 add action=mark-routing chain=output connection-mark=From-ISP-2 \ new-routing-mark=To-ISP-2
Кроме стандартных правил маршрутизации, нужно добавить маршруты для промаркированных ответов с раздела Mangle.
Настройка находится IP→Routes
И все текущие правила статической маршрутизации будут иметь вид:
/ip route add distance=1 gateway=pppoe-out1 routing-mark=To-ISP-1 add distance=1 gateway=109.87.159.126 routing-mark=To-ISP-2 add comment=ISP-1 distance=1 gateway=pppoe-out1 add comment=ISP-2 distance=2 gateway=109.87.159.126
Как было сказано выше, резервирование или автоматическое переключение между провайдерами это режим работы роутера MikroTik, когда есть основной провайдер и резервный. При отсутствии интернета у основного провайдера, должно происходить переключение на резервного провайдера. А когда услуга интернета на основном провайдере будет восстановлена, то следует снова вернуться с резервной линии на основную.
Резервирование(автопереключение) это самый распространённый метод работы двух и более интернет провайдеров на роутере MikroTik.
Описание переключение на резервную линию условно такое: роутер MikroTik будет отправлять ICMP(ping) запросы на 8.8.8.8(Google DNS) и в случае отсутствия ответа или большой задержки, интернет будет переключаться с основной(провайдер-1) линии на резервную(провайдер-2).
Добавить статический маршрут для Google DNS
Настройка находится IP→Routes
/ip route add comment=Netwatch distance=1 dst-address=8.8.8.8/32 gateway=pppoe-out1
Запретить ICMP запросы через провайдера-2
Настройка находится IP→Firewall
/ip firewall filter add action=drop chain=output comment=Netwatch dst-address=8.8.8.8 \ out-interface=ether2 protocol=icmp
Этим правилом будет гарантирована диагностика статуса интернет канала только через провайдера-1. При попытке отправить аналогичный запрос через провайдера-2, Firewall роутера MikroTik будет это блокировать.
Добавить правило Netwatch для переключения
Настройка находится Tools→Netwatch
/tool netwatch add down-script="/ip route disable [find comment=\"ISP-1\"]\r\ \n/ip route enable [find comment=\"ISP-2\"]\r\ \n:foreach i in=[/ip firewall connection find protocol~\"tcp\"] do={ /ip f\ irewall connection remove \$i }\r\ \n:foreach i in=[/ip firewall connection find protocol~\"udp\"] do={ /ip f\ irewall connection remove \$i }\r\ \nlog warning (\"ISP-1 IS DOWN\")" host=8.8.8.8 up-script="/ip route disab\ le [find comment=\"ISP-2\"]\r\ \n/ip route enable [find comment=\"ISP-1\"]\r\ \n:foreach i in=[/ip firewall connection find protocol~\"tcp\"] do={ /ip f\ irewall connection remove \$i }\r\ \n:foreach i in=[/ip firewall connection find protocol~\"udp\"] do={ /ip f\ irewall connection remove \$i }\r\ \nlog warning (\"ISP-1 IS UP\")"
- Host – узел, на который будут отправляться ICMP(ping) запросы;
- Interval – время, в течении которого будет производиться диагностика для смены статуса;
- Timeout – задержка пакета, которая будет восприниматься как отсутствие связи;
- Status – текущий статус узла;
- Закладка Up – скрипт, который будет выполнен, если провайдер-1 восстановит связь, после её обрыва;
- Закладка Down – скрипт, который будет выполнен, если связь с провайдером-1 будет прервана.
Представленными скриптами с помощью утилиты Netwatch будет происходить переключение между провайдерами. Все соединения, которые были установлены через провайлера-1 будут удалены. Это позволит гарантированно переключиться на провайдера-2.
Существует два метода распределения нагрузки между 2-мя провайдерами в MikroTik:
Ручная балансировка. Все узлы делятся в ручном режиме на 2-ве условные группы и каждая из групп направляется к выделенному ей провайдеру;
Автоматическая балансировка. Узлы роутера MikroTik будут поделены на группы с помощью внутренних инструментов RouterOS.
Пример с балансировкой будет отличаться тем, чтобы в рамках настройки внимание также будет уделено соединениям. Переключение станет более мягким и незаметным и это будет достигнуто благодаря маркировке соединений и частичную их очистку при переключении между провайдерами.
Когда работают оба провайдеры, нагрузка распределяется согласно ручному распределению в Address list.
ISP-1=Down & ISP-2=Up → соединения To-ISP-1 очищаются и начинают работать через ISP-2. При этом соединения To-ISP-2 остаются не тронутыми. При восстановлении связи с ISP-1, соединения To-ISP-1 также очищаются и трафик вместо ISP-2 начинает проходить через ISP-1.
ISP-1=Up & ISP-2=Down → соединения To-ISP-2 очищаются и начинают работать через ISP-1. При этом соединения To-ISP-1 остаются не тронутыми. При восстановлении связи с ISP-2, соединения To-ISP-2 также очищаются и трафик вместо ISP-1 начинает проходить через ISP-2.
Как видно из названия, условную подсеть роутера MikroTik будет поделено на две группы: To-ISP-1 и To-ISP-2.
- pppoe-out1 – это провайдер-1;
- ether2 – это провайдер-2.
Настройка находится IP→Firewall→Address List
И для каждой из групп, нужно промаркировать соединения и маршрут, для плавного переключение между провайдерами в случае обрыва одного из них.
Mangle маркировка соединений для балансировки 2 провайдеров
Настройка находится IP→Firewall→Mangle
Mangle маркировка маршрута для балансировки двух провайдеров
Настройка находится IP→Firewall→Mangle
Аналогичные действия по маркировке соединений и маршрута нужно выполнить для Address List = To-ISP-2.
Общий вид раздела Mangle
/ip firewall address-list add address=192.168.2.2-192.168.2.125 list=To-ISP-1 add address=192.168.2.126-192.168.2.254 list=To-ISP-2 /ip firewall mangle add action=mark-connection chain=prerouting disabled=no dst-address-type=\ !local new-connection-mark=To-ISP-1-Connection src-address-list=To-ISP-1 add action=mark-routing chain=prerouting connection-mark=To-ISP-1-Connection \ disabled=no new-routing-mark=To-ISP-1 src-address-list=To-ISP-1 add action=mark-connection chain=prerouting disabled=no dst-address-type=\ !local new-connection-mark=To-ISP-2-Connection src-address-list=To-ISP-2 add action=mark-routing chain=prerouting connection-mark=To-ISP-2-Connection \ disabled=no new-routing-mark=To-ISP-2 src-address-list=To-ISP-2
Для каждой группы узлов To-ISP-1 и To-ISP-2 будет создано по два маршрута, чтобы обеспечить плавное переключение согласно первоначальным условиям по балансировке 2 провайдеров.
Общий вид таблицы маршрутизации при балансировке 2 провайдеров
Настройка находится IP→Route
/ip route add comment=Group-1-1 distance=1 gateway=pppoe-out1 routing-mark=To-ISP-1 add comment=Group-2-1 disabled=yes distance=2 gateway=109.87.159.126 \ routing-mark=To-ISP-1 add comment=Group-2-2 distance=1 gateway=109.87.159.126 routing-mark=To-ISP-2 add comment=Group-1-2 disabled=yes distance=2 gateway=pppoe-out1 \ routing-mark=To-ISP-2 add comment=Netwatch-2 distance=1 dst-address=8.8.4.4/32 gateway=109.87.159.126 add comment=Netwatch-1 distance=1 dst-address=8.8.8.8/32 gateway=\ pppoe-out1
Контроль ICMP запросов через нужный интерфейс
Эти правила обеспечат контроль статуса интернет соединения для каждого из провайдера. Диагностика статуса интернета будет осуществляться только через те интерфейсы, которые обозначены в таблице маршрутизации с комментариями Netwatch-1 и Netwatch-2.
Настройка находится IP→Firewall→Filter Rules
/ip firewall filter add action=drop chain=output comment=Netwatch-1 dst-address=8.8.8.8 \ out-interface=ether2 protocol=icmp add action=drop chain=output comment=Netwatch-2 dst-address=8.8.4.4 \ out-interface=!ether2 protocol=icmp
Настройка Netwatch для переключения провайдеров
И собственно утилита Netwatch, именно она будет заниматься переключением между провайдерами в случае обрыва связи на одном из них.
Настройка находится Tools→Netwatch
/tool netwatch add down-script="/ip route disable [find comment=\"ISP-2\"]\r\ \n/ip route disable [find comment=\"Group-2-2\"]\r\ \n/ip route enable [find comment=\"Group-1-2\"]\r\ \nlog warning (\"ISP-2 IS DOWN\")\r\ \n:foreach i in=[/ip firewall connection find connection-mark~\"To-ISP-2-C\ onnection\"] do={ /ip firewall connection remove \$i }" host=8.8.4.4 \ up-script="/ip route enable [find comment=\"ISP-2\"]\r\ \n/ip route enable [find comment=\"Group-2-2\"]\r\ \n/ip route disable [find comment=\"Group-1-2\"]\r\ \nlog warning (\"ISP-2 IS UP\")\r\ \n:foreach i in=[/ip firewall connection find connection-mark~\"To-ISP-2-C\ onnection\"] do={ /ip firewall connection remove \$i }" add down-script="/ip route disable [find comment=\"ISP-1\"]\r\ \n/ip route disable [find comment=\"Group-1-1\"]\r\ \n/ip route enable [find comment=\"Group-2-1\"]\r\ \nlog warning (\"ISP-1 IS DOWN\")\r\ \n:foreach i in=[/ip firewall connection find connection-mark~\"To-ISP-1-C\ onnection\"] do={ /ip firewall connection remove \$i }" host=8.8.8.8 \ up-script="/ip route enable [find comment=\"ISP-1\"]\r\ \n/ip route enable [find comment=\"Group-1-1\"]\r\ \n/ip route disable [find comment=\"Group-2-1\"]\r\ \nlog warning (\"ISP-1 IS UP\")\r\ \n:foreach i in=[/ip firewall connection find connection-mark~\"To-ISP-1-C\ onnection\"] do={ /ip firewall connection remove \$i }"
Можно также применить схему, в которой каждое соединение будет промаркировано по принципу:
четный-пакет = провайдер-1
нечетный-пакет = провайдер-2
Настройка находится IP→Firewall→Mangle
/ip firewall mangle add action=mark-connection chain=prerouting disabled=yes dst-address-type=\ !local new-connection-mark=To-ISP-1-Connection src-address-list=To-ISP-1 nth=2,1 add action=mark-routing chain=prerouting connection-mark=To-ISP-1-Connection \ disabled=yes new-routing-mark=To-ISP-1 src-address-list=To-ISP-1 add action=mark-connection chain=prerouting disabled=yes dst-address-type=\ !local new-connection-mark=To-ISP-2-Connection src-address-list=To-ISP-2 nth=2,2 add action=mark-routing chain=prerouting connection-mark=To-ISP-2-Connection \ disabled=yes new-routing-mark=To-ISP-2 src-address-list=To-ISP-2
Балансировка между двумя провайдерами будет производиться в соотношении 50:50, это определяется параметрами nth=2,1 и nth=2,2.
Все остальные действия по настройке маршрутизации, Firewall и Netwatch будут аналогичны описанных в разделе “ →“.
Per Connection Classifier (PCC) позволят разделить трафик на равные потоки с возможностью держать пакеты с определенным набором параметров в одном потоке (определяется в наборе параметров из src-address, src-port, dst-address, dst-port)
Настройка находится IP→Firewall→Mangle
/ip firewall mangle add action=mark-connection chain=prerouting dst-address=\ !192.168.2.0/24 new-connection-mark=To-ISP-1-Connection \ per-connection-classifier=both-addresses-and-ports:2/0 src-address=\ 192.168.2.0/24 add action=mark-routing chain=prerouting connection-mark=To-ISP-1-Connection \ new-routing-mark=To-ISP-1 src-address=192.168.2.0/24 add action=mark-connection chain=prerouting dst-address=\ !192.168.2.0/24 new-connection-mark=To-ISP-2-Connection \ per-connection-classifier=both-addresses-and-ports:2/1 src-address=\ 192.168.2.0/24 add action=mark-routing chain=prerouting connection-mark=To-ISP-2-Connection \ new-routing-mark=To-ISP-2 src-address=192.168.2.0/24
Все остальные действия по настройке маршрутизации, Firewall и Netwatch будут аналогичны описанных в разделе “ →“.
DHCP клиент это один из самых распространённых типов настроек WAN интерфейса. Все настройки проходят в автоматическом режиме и не требуют ни каких дополнительных усилий. Однако в варианте с балансировкой двух провайдеров, используемая настройка требует явного определения шлюза(Gateway) в таблице маршрутизации. А если IP адрес серый(динамический), то правила с балансировкой перестанут работать при его изменении.
Для того, чтобы в правиле статической маршрутизации указывался текущий шлюз(Gateway) провайдера, в свойствах DHCP клиента следует укатать скрипт
Настройка находится IP→DHCP client
{ :local rmark "ISP-2" :local count [/ip route print count-only where comment="ISP-2"] :if ($bound=1) do={ :if ($count = 0) do={ /ip route add gateway=$"gateway-address" comment="ISP-2" distance=2 } else={ :if ($count = 1) do={ :local test [/ip route find where comment="ISP-2"] :if ([/ip route get $test gateway] != $"gateway-address") do={ /ip route set $test gateway=$"gateway-address" } } else={ :error "Multiple routes found" } } } else={ /ip route remove [find comment="ISP-2"] } }
И аналогичный пример, только для первого провайдера с добавлением маршрута к 8.8.4.4.
{ :local rmark "ISP-1" :local count [/ip route print count-only where comment="ISP-1"] :if ($bound=1) do={ :if ($count = 0) do={ /ip route add gateway=$"gateway-address" comment="ISP-1" distance=1 /ip route add gateway=$"gateway-address" comment="Netwatch" distance=1 dst-address=8.8.4.4 } else={ :if ($count = 1) do={ :local test [/ip route find where comment="ISP-1"] :if ([/ip route get $test gateway] != $"gateway-address") do={ /ip route set $test gateway=$"gateway-address" } } else={ :error "Multiple routes found" } } } else={ /ip route remove [find comment="ISP-1"] /ip route remove [find comment="Netwatch"] } }
Скрипт может быть дополнен добавлениями(и удалениями) маршрутов для Routing-mark и Netwatch.
Входящая задача: сделать проброс портов таким образом, чтобы сервер отвечал с того провайдера, с которого пришёл запрос. На практике это может быть Web сервер(443\https), у которого объявлены две DNS записи с двумя внешними IP роутера MikroTik.
Настройка находится IP→Firewall→Mangle
/ip firewall mangle add chain=forward action=mark-connection new-connection-mark=From-ISP-1 in-interface=pppoe-out1 add chain=prerouting action=mark-routing new-routing-mark=To-ISP-1 passthrough=no connection-mark=From-ISP-1 in-interface=bridge add chain=forward action=mark-connection new-connection-mark=From-ISP-2 in-interface=ether2 add chain=prerouting action=mark-routing new-routing-mark=To-ISP-2 passthrough=no connection-mark=From-ISP-2 in-interface=bridge
где
- pppoe-out1 – это провайдер-1;
- ether2 – это провайдер-2;
- bridge – локальный bridge интерфейс.