В этой статье будет описана маршрутизация на роутерах MikroTik c версией RouterOS 7. Вы узнаете про обычную маршрутизацию, а также что такое Policy-based Routing (PBR) и какие инструменты нам предоставляет RouterOS.
Стандартная маршрутизация
Стандартная маршрутизация на роутерах MikroTik основывается на адресе назначения (dst. address). Например, на роутер прилетает ip-пакет с такими полями в заголовке: src. address = 192.168.0.5, dst. address = 8.8.8.8. Маршрутизатор, в этом случае, ищет маршрут основываясь только на dst. address. Если маршрут для адреса найден, то пакет отправляется по маршруту (на другой роутер).

Порядок выбора маршрута
Маршрутизация на MikroTik позволяет создавать множество маршрутов. И может возникнуть ситуация, что для одного пакета может подойти два разных маршрута. Давайте теперь разберёмся в каком порядке применяются правила маршрутизации.
Более тонкие маршруты (маршруты с большей маской подсети) являются более приоритетными. Так, например, если роутер имеет два маршрута:
- 8.8.8.8/24 -> 10.10.10.1
- 8.8.8.8/20 -> 10.10.11.1
То пакет с dst. address = 8.8.8.8 будет маршрутизирован на 10.10.10.1, хотя 10.10.11.1 тоже подходящий маршрут.
Самый широкий маршрут (dst. address = 0.0.0.0/0) называется маршрутом по умолчанию (default route). Все пакеты для которых не будет найден более узкий маршрут будет отправлен в маршрут по умолчанию.
Next hop или gateway
В примере выше, 10.10.10.1 или 10.10.11.1 это следующий роутер, его ещё называют next hop или gateway. Создавая обычный маршрут, мы указываем:
- направление (dst. address), например 8.8.8.8/24 или 0.0.0.0/0;
- адрес следующего роутера (next hop или gateway), например 10.10.10.1.
На этих двух параметрах и основана стандартная маршрутизация в MikroTik. А если для пакета не будет найден маршрут, то такой пакет будет отброшен.
Создание маршрутов на MikroTik
Для создания маршрутов в роутере MikroTik перейдите по меню IP / Routes. При создании маршрута укажите dst. address и gateway.

Рекурсия в маршрутизации
При создании маршрута выше, роутер сразу определил интерфейс (ether2), куда нужно отправить пакет по этому маршруту. Это происходит из-за рекурсии.
Мы указали что пакет с dst. address=8.8.8.0/24 должен отправится на 10.10.10.1. Дальше роутер ищет где находится 10.10.10.1, а на скрине выше вы видите что у меня был маршрут dst.address=10.10.10.0/24 на ether2.

Обратите внимание что у маршрута dst. address=8.8.8.0/24 параметр Target Scope=10, это значит что по рекурсии будут искаться следующие маршруты со значением Scope равным или меньшим 10. И будет найден маршрут dst.address=10.10.10.0/24 на ether2, который является Connected маршрутом.
Connected маршруты
На моём роутере, уже настроена адресация (IP / Addresses):

После создания таких ip-адресов, у меня создались следующие connected маршруты (IP / Routes):

Connected маршруты — это маршруты связанные с интерфейсом, на который был назначен ip-адрес. То есть, мы назначили на ether1 адрес 192.168.0.1/24, и получили маршрут 192.168.0.0/24 > ether1.
Connected маршруты в Mikrotik получают Scope=10, а на Target Scope можете не смотреть, так как такие маршруты указывают на интерфейс, а если найден интерфейс, то поиск завершается.
Policy-based Routing
Policy-based Routing — это маршрутизация в MikroTik, при которой маршрут выбирается основываясь не тольно на dst. address, а ещё на каких-нибудь других параметрах. Например на: src. address, src. port, dst. port, protocol и т.п.
Также, используя PBR на MikroTik, можно создавать несколько таблиц маршрутизации. Это может пригодиться для использования двух провайдеров на одном маршрутизаторе. Таблица маршрутизации содержит список маршрутов. В одной таблице может быть один список маршрутов, а в другой — список маршрутов будет другим. И, с помощью PBR инструментов, мы можем помещать пакеты в другую таблицу маршрутизации.
Например, может быть правило, если dst.port=53, то используем вторую таблицу маршрутизации:

Ниже я разбираю инструменты доступные в роутерах MikroTik для настройки PBR. Но в статье не будет примера настройки dual wan (двух провайдеров на одном роутере). Данная статья больше теоретическая и показывает инструменты роутинга в MikroTik. А если вам интересна тема dual wan, можете почитать другую статью — MikroTik (RouterOS 7) — маркировка и балансировка.
Создание двух маршрутом по умолчанию
Создадим маршруты по умолчанию на шлюзы наших провайдеров. Допустим у нас 2 провайдера. Если мы просто создадим два маршрута по умолчанию, то у нас включится в работу протокол ECMP. И пакеты будут ходить поочереди через обоих провайдеров. Это видно по знаку + возле второго маршрута по умолчанию.

В некоторых случаях это можно использовать как балансировку, но в этой статье я ECMP не рассматриваю. Кстати на версии RouterOS 6 у вас бы один из маршрутов оказался не активным, так как там ECMP автоматически не включался.
А чтобы создать два маршрута с одинаковым dst. address нужно на втором маршруте указать таблицу маршрутизации (Routing Table) отличную от используемой по умолчанию (main). Но вначале нужно создать такую таблицу маршрутизации. Делается это в меню Routing / Tables. Кстати, а в RouterOS 6 такая таблица создалась бы автоматически, но в 7 версии её нужно создавать вручную.

Обязательно поставьте флаг FIB, что это такое, при желании почитайте здесь (https://wiki.mikrotik.com/Manual:IP/Route).
И при создании второго маршрута просто укажите Routing Table:

Вот так будут выглядеть маршруты после настройки:

- Первый маршрут (0.0.0.0/0 -> 10.10.10.1) в основной таблице маршрутизации (main).
- Второй маршрут (0.0.0.0/0 -> 10.10.11.1) в новой таблице маршрутизации (isp2).
Получилась вот такая схема сети:

Не забываем про NAT
Чтобы клиенты могли выходить через роутер в интернет необходимо настроить NAT, а если у нас 2 пути (провайдера), то нужно настроить 2 правила (IP / Firewall / Вкладка NAT).
Правило для первого провайдера:

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

И два правила вместе:

Копирование Connected маршрутов во вторую таблицу маршрутизации
Вы могли заметить что во второй таблице маршрутизации у меня всего один маршрут:

То есть пакет не сможет добраться до подсети 192.168.0.0/24, так как он тоже пойдёт по правилу маршрутизации на 10.10.11.1. Поэтому берём наш Connected маршрут и копируем его во вторую таблицу маршрутизации. При копировании поменяйте таблицу маршрутизации на isp2 и Distance измените на 1. После копирования у вас должны получиться такие маршруты:

Выбор таблицы маршрутизации (Routing / Rules)
В предыдущем пункте мы создали два маршрута по умолчанию в разных таблицах маршрутизации. Трафик, по умолчанию, всегда выберет маршрут в таблице main (это главная таблица маршрутизации на роутере). Но, мы можем поместить трафик во вторую таблицу маршрутизации используя инструмент Routing / Rules.
Например, создадим правило, которое помещает пакеты во вторую таблицу маршрутизации, если адрес источника равен 192.168.0.6:

То есть пакеты от компьютера с адресом 192.168.0.6 будут помещены в таблицу маршрутизации isp2. А в ней есть маршрут — 0.0.0.0/0 > 10.10.11.1. Получается что трафик с компьютера 192.168.0.6 пойдет через второго провайдера, а все остальные компьютеры в сети 192.168.0.0/24 будут работать через первого провайдера.
Выбор таблицы маршрутизации (IP / Firewall / Mangle)
Инструмент Routing / Rules позволяет выбрать таблицу маршрутизации, основываясь на Src.Address, Dst.Address и входящем интерфейсе.
Но с помощью другого инструмента IP / Firewall / Mangle мы можем пометить трафик, основываясь на других параметрах. Это может быть исходящий порт, протокол, адрес лист и т.п. То есть это более мощный инструмент, но потребляющий больше ресурсов.
Имейте ввиду что правила IP / Firewall / Mangle имеют приоритет над Routing / Rules и желательно в одной конфигурации использовать что-то одно. Если вам действительно нужно использовать оба инструмента, имейте в виду, если трафик помеченный в mangle может быть разрешён в таблице маршрутизации, то правила Routing / Rules никогда не применятся к этому трафику.
Проходящий трафик из локалки в интернет
Проходящий трафик из локалки в интернет нужно помечать в цепочке prerouting. Сделаем так, чтобы компьютер с адресом 192.168.0.9 ходил через второго провайдера (IP / Firewall / Mangle):

Исходящий трафик от роутера в интернет
Исходящим трафиком от самого MikroTik может быть:
- исходящий vpn;
- отправка email;
- ping с самого роутера;
- и другое.
Чтобы выпустить такой трафик через второго провайдера, нужно поместить его во вторую таблицу маршрутизации. Это делается с помощью правила IP / Firewall / Mangle, но в цепочке output.

В цепочке output содержится только исходящий с самого роутера трафик. Вот этот трафик для всех адресов (0.0.0.0/0) и будет помещён во вторую таблицу маршрутизации (isp2).
Получились такие правила:

Проходящий трафик из интернета в локалку
Например, у нас проброшен порт в локалку к какому-нибудь сервису. Вот для такого трафика мы тоже можем выбирать таблицу маршрутизации.
Первым правилом нужно промаркировать входящее соединение. Всё что придёт из интернета на ether3, будет помечено маркой соединения from-isp2. Обратите внимание, метим только новые соединения.

Вторым правилом, в рамках промаркированного соединения (from-isp2) маркируем пакеты:

Вот итоговая схема с правилами в mangle:

- 1 правило для проходящего трафика из локалки в интернет;
- 2 правило для исходящего трафика от роутера в интернет;
- 3 и 4 правило для проходящего трафика из интернета в локалку, чтобы ответный трафик (из локалки) шёл через того-же провайдера через которого пришёл запрос.
Итог
Нами была рассмотрена маршрутизация на роутерах MikroTik версии RouterOS 7. Мы изучили несколько инструментов:
- Routing / Tables — позволяет создавать свои таблицы маршрутизации.
- Routing / Rules — позволяет поместить трафик в нужную таблицу маршрутизации основываясь только на на Src.Address, Dst.Address и входящем интерфейсе, этот инструмент потребляем меньше ресурсов роутера.
- IP / Firewall / Mangle — позволяет пометить трафик и поместить его в нужную таблицу маршрутизации основываясь на большем числе параметров, но сильнее нагружая роутер. Трафик можно помещать в таблицы маршрутизации (new-routing-mark) в двух цепочках:
- output — для исходящего трафика с самого роутера;
- prerouting — для проходящего трафика через роутер, например из локальной сети в интернет;
Больше информации по маршрутизации в роутерах MikroTik вы можете получить перейдя по этим ссылкам:
- https://help.mikrotik.com/docs/spaces/ROS/pages/48660587/Mangle
- https://help.mikrotik.com/docs/spaces/ROS/pages/59965508/Policy+Routing
- https://help.mikrotik.com/docs/spaces/ROS/pages/328084/IP+Routing
Если понравилась статья, подпишись на мой канал в VK или Telegram.
/ip firewall mangle
add action=mark-routing chain=output dst-address=0.0.0.0/0 new-routing-mark=2 passthrough=no
это может привести к отказу сети, в зависимости от Вашей конфигурации, если он не точ в точ, как описано выше, и что чаще так и бывает,
особенно, если более 3 операторов, и сложная статическая маршрутизация.
Другой вариант решения через Routing\Rules
Src/ Address: [выделенный адрес роутера]/32
Dest/ Address: 0.0.0.0/0
Interface: [интерфейс на котором сидит управление роутера]
Action: lookup only in table
Table: [таблица оператора]
правило должно быть последним.
проверено, работает в неограниченным количеством ISP, в моём варианте с 6тью ISP, ECMP, 44vlans, 46 NAT rules, 47 Mangle chains, 25 static rules и т.д. (маркировка пакетов отсутствует, только статика)
Однако, в каждой конфигурации это индивидуально, сделать исходящий с роутера нужно в зависимости, как остальные правила настроены.
ещё вариант:
либо как в статье, но вместо dst-address установить Out Interface (list) = IPS interface (ISP list)
p.s. вариант постом выше пошёл всё равно по другому маршруту, т.е. не факт что работает как задумано, при моей конфигурации.