В данной статье мы затронем тему маркировки пакетов (mangle) и настройку Dual WAN на MikroTik как одну из основных тем. В Mikrotik данный функционал реализован через Mangle — используется для того чтобы пометить пакеты/соединения для дальнейшей их обработки очередями (простыми или деревьями), NAT правилами, таблицами маршрутизации или изменению таких параметров как:
- TOS (DSCP);
- TTL;
- MSS;
На одном пакете/соединении может быть только одна метка
Данные метки работают только на определённом роутере и не передаются по сети другим участникам, хотя при желании можно на это повлиять.
В сегодняшнем примере мы будем настраивать Dual WAN. Предполагается что у вас есть 2 провайдера, основной и резервный, с помощью Mangle мы сделаем правильную маркировку и выпустим клиентов через основного провайдера. Так же прикрутим скрипт, который будет проверять доступность выхода в интернет через обоих провайдеров, и в случае недоступности через основной, переключать на резервный канал.
Схема сети
- Предположим, что у нас имеется:
- Широковещательная плоская 192.168.1.0/24;
- Два белых статических IP адреса;
- Один роутер;
- Два свича;
- RouterOS 6.48.1.
Настройка правил NAT
Для того чтобы наши внутренние клиент выходили в интернет, нам нужно 2 правила NAT. Один под основного провайдера, другой для резервного.
Маркировка трафика
Следующая задача, промаркировать трафик для каждого провайдера, на вход и на выход. Открываем на микротике IP – Firewall – Mangle, создаём новое правило. Интересует цепочка Prerouting, входящий интерфейс первого оператора. Маркируем соединение и задаём понятное имя марки. Для оптимизации нагрузки можно выбрать только новые соединения.
Следующим правилом создаём маркировку роутинга для нашей ранее созданной метки соединения.
Теперь займемся output. На основе коннекшен марки создаём правило роутинга.
Последним правилом маркировки для ISP1 будет цепочка output.
Для первого оператора метки заданы. По аналогии создаём и для второго, только придумываем другие имена меткам и в последнем правиле указываем соответствующий адрес.
Задаём соответствующий входящий интерфейс.
Создаём маркировку роутинга на основе connection mark.
И 2 правила на output.
В итоге вся маркировка трафика у нас будет выглядеть таким образов.
Настройка Routing Rules
Следующий этап, это настройка правил и таблиц маршрутизации. Следует разнести трафик по соответствующим провайдерам. Создаём Rule с src address первого оператора, впишем вручную новую table.
По аналогии и для второго провайдера.
Порядок имеет значение. Необходимо указать все наши локальные сети, трафик к ним будет идти через табличку main.
А теперь все наши mark routing выпустим через соответствующие таблички.
Создание таблиц маршрутизации
В основной таблице маршрутизации нужно создать 2 маршрута, основной и резервный. Для этого вам нужно определиться кто из них какую роль будет выполнять. Т.к. активный будет всегда один. У первого метрика 10.
У второго метрика 20.
Открываем table-ISP1 и создаём default route с любой метрикой через шлюз провайдера.
Аналогично и для table-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.
Тестируем работу через консоль.
Как мы видим все отлично.
Добавляем задание в планировщик. Обязательно указываем интервал. В данном случае раз в 15 сек. Это самый минимальный рекомендуемый интервал, ниже ставить не советую.
Из особенностей, очищает все соединения, когда происходит переключение. Вы так же можете добавить свои команды в конце тела.
Проверка работоспособности
Итак, мы все настроили и ждём чуда. Т.к. запросы у нас ICMP, для ускорения результата, на вышестоящем оборудовании включу блокировку данного трафика.
Если отключу блокировку, то все встаёт на свои места.
Вы можете прикрутить отправку письма вам на e-mail в случае переключения, или допустим полный сброс роутера))). Вот и все — в этой статье мы рассмотрели настройку настройка Dual WAN на MikroTik, для этого использовали маркировку трафика «mangle». Теперь основываясь на этом примере можете создавать свои собственные конфигурации.
Сначала показалось, что всё логично и красиво.
Хотел кучу своих правил маршрутизации переписать согласно этой статье и привести к такому же красивому виду.
Однако, выяснилось, но поздно, что схема работает в полном объеме.
Лучше бы сначала погонял на стенде и не словил бы этот косяк.
Срочно пришлось возвращаться к старым правилам.
1. Из внутренней сети (сетей, их несколько больше чем одна) внешние IP не пингуются. До применения этих правил всё пинговалось.
2. Был проброс портов через DST-NAT на почтовый сервер с жесткой маршутизацией по альтернативной таблице через один из WAN Uplink-ов (правила маршрутизации Only in Table).
Поле применения правил, описанных в этой статье, исходящая почта продолжала уходить по правильному Uplink-у, а входящая перестала приходить.
3. Применение этих правил негативно не повлияло на кучу IPSec + GRE навешанных на Uplink-и разных провайдеров.
Почему приведенная схема не работает буду разбираться в выходные.
Здравствуйте.
У всех конфиг может быть разный, вы же понимаете что мои примеры описывают саму суть реализации.
Как у вас устроено и как это применить у вас, только вам известно. И конечно, прежде чем выкатывать в прод, конфиг надо откатать на тесте.
«Встроенных средств у Mikrotik нет (для проверки доступности интернета), и по этой причине будем использовать простенький скрипт ниже.»
Netwatch же придумали…
Добрый день.
А как вы будите через него проверять доступность на каждом ISP?
Не большой вопрос, я правельно понимаю что если надо строить failover между 3 каналами то в скрипт надо будет просто больше интерфейсов натолкать?
Добрый день
Да, но нужно так же логику его менять соответственно.
Так же маркировку добавлять, таблицу и Route Rules
А почему именно через скрипт?
Почему не через рекурсию?
Просто искал настройку gre тунелей междву двумя микротиками по 2 провайдера на каждом. Нашел что нужна рекурсивная маршрутизация, манглы и собственно сами тунели.
После этой статьи совсем запутался, манглы настраваются иначе, дополнительные таблицы маршрутов.
Добрый день
Потому что через рекурсию нельзя делать доп фишки и чистить соединения (а с sip это актуально)
Ну и рекурсию не все понимают)
Добрый день, а есть ли пример настройки двух wan портов одновременно работающих? Т.е. во внутренней сети есть разные подсети которые работают каждая по своему каналу от магистрального провайдера. И нужно им указать кто куда будет ходить. Кто направо, а кто налево.
Добрый день
Примера нет, но это делается через маркировку prerouting по подсетям в свои таблицы маршрутизации
Добрый день.
Подскажите, пожалуйста, какое устройство является минимально необходимым для использования Dual WAN?
Нужно реализовать переключение с основного провайдера на резервный при условии троекратной потери пинга с интервалом 3-5 секунд, а также обратное переключение при восстановлении соединения.
Добрый день
Любой девайс может это, кроме свитчей css