Из статьи Вы узнаете, что такое Policy-based Routing (PBR), как он используется и настраивается на маршрутизаторах MikroTik.

Стандартная маршрутизация и PBR

Стандартная маршрутизация основывается на адресе назначения (dst. address). Например, на маршрутизатор прилетает ip-пакет с такими полями в заголовке: src. address = 192.168.0.5, dst. address = 8.8.8.8. Маршрутизатор, в этом случае, ищет маршрут основываясь только на dst. address. Если маршрут для адреса найден, то пакет отправляется по маршруту на другой роутер (в другую подсеть).

Стандартная маршрутизация
Стандартная маршрутизация

При этом, более тонкие маршруты (маршруты с большей маской подсети) являются более приоритетными. Так, например, если маршрутизатор имеет два маршрута: 8.8.8.8/24 -> 10.10.10.1 и 0.0.0.0/0 -> 10.10.11.1, то пакет с dst. address = 8.8.8.8 будет маршрутизирован на 10.10.10.1, а пакет с dst. address = 1.1.1.1 будет отправлен на 10.10.11.1.

В примере выше, 10.10.10.1 или 10.10.11.1 это следующий роутер, его ещё называют next hop. Это может быть — роутер провайдера, или ваш другой роутер. То-есть создавая обычный маршрут, мы указываем:

  • направление (dst. address), например 8.8.8.8/24 или 0.0.0.0/0;
  • и адрес следующего роутера (next hop), например 10.10.10.1.

А если для пакета маршрут не будет найден то такой пакет будет отброшен.

Policy-based Routing (PBR) — это маршрутизация, при которой маршрут выбирается основываясь не тольно на dst. address, а ещё на каких-нибудь других параметрах. Основанием для выбора маршрута в этом случае может быть: src. address, src. port, dst. port, protocol и другое.

Также, используя PBR на MikroTik, можно создавать несколько таблиц маршрутизации. Это может пригодиться для использования двух провайдеров на одном маршрутизаторе. Таблица маршрутизации содержит список маршрутов. В одной таблице может быть один список маршрутов, а в другой — список маршрутов будет другим. И, с помощью PBR инструментов, мы можем помещать пакеты в другую таблицу маршрутизации.

Как работает PBR

Ниже я разбираю инструменты доступные в маршрутизаторах MikroTik для настройки PBR и небольшие примеры их использования. Но в статье не будет примера настройки dual wan (двух провайдеров на одном роутере), это тема для другой статьи.

Создание двух маршрутов по умолчанию

И так, на роутере Mikrotik, уже настроена адресация:

/ip address
add address=192.168.0.1/24 comment=lan interface=ether2 network=192.168.0.0
add address=10.10.10.5/24 comment=wan1 interface=ether3 network=10.10.10.0
add address=10.10.11.5/24 comment=wan2 interface=ether4 network=10.10.11.0

То есть, у меня 3 интерфейса и 3 ip-адреса:

  • lan — 192.168.0.1/24;
  • wan1 — 10.10.10.5/24;
  • wan2 — 10.10.11.5/24;

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

Connected маршруты

Connected маршруты — это маршруты связанные с интерфейсом, на который был назначен ip-адресс. То есть, мы назначили на ether2 адрес 192.168.0.1/24, и получили маршрут 192.168.0.0/24 > ether2.

Теперь нам нужно прописать маршрут по умолчанию (dst. address = 0.0.0.0/0) на шлюз нашего провайдера. Но что делать, если у нас 2 провайдера. Если мы просто создадим два маршрута по умолчанию, то один из них станет не активным:

И действительно, в одной таблице маршрутизации не может быть двух маршрутов с одинаковыми направлениями (dts. address). Кстати, в 7 версии RouterOS, в этом случае второй маршрут окажется активным, так как автоматически включается ECMP, но этот протокол в этой статье я не рассматриваю. И все проделываю на 6 версии (6.48.6).

А чтобы создать два маршрута с одинаковым dst. address нужно на втором маршруте указать Routing Mark. Вот так создаются два маршрута по умолчанию, при этом второй будет в своей таблице маршрутизации:

/ip route
add comment=isp2 distance=1 gateway=10.10.11.1 routing-mark=2
add comment=isp1 distance=1 gateway=10.10.10.1

А вот так это выглядит в окне WinBox:

Два маршрута по умолчанию в разных таблицах маршрутизации

Первый маршрут (0.0.0.0/0 > 10.10.10.1) находится в основной таблице маршрутизации, которая называется main. А второй маршрут (0.0.0.0/0 > 10.10.11.1) находится в новой таблице маршрутизации, которая получила название от Routing Mark2. Не обязательно использовать только цифры в названиях, можно было её назвать isp2 или по другому.

И чтобы клиенты выходили через роутер в интернет необходимо настроить nat:

/ip firewall nat
add action=src-nat chain=srcnat comment=wan1 out-interface=ether3 to-addresses=10.10.10.5
add action=src-nat chain=srcnat comment=wan2 out-interface=ether4 to-addresses=10.10.11.5

Получилась вот такая схема сети:

Схема сети с двумя 0.0.0.0/0 маршрутами

Выбор таблицы маршрутизации (routes / rule)

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

Например, создадим правило, которое помещает пакеты во вторую таблицу маршрутизации, если адрес источника равен 192.168.0.6:

/ip route rule
add src-address=192.168.0.6/32 table=2

Вот так это выглядит в окне WinBox:

Создание правила в ip / routes / rule

То есть пакеты от компьютера с адресом 192.168.0.6 будут помещены во вторую таблицу маршрутизации. А в ней есть маршрут — 0.0.0.0/0 > 10.10.11.1. Получается что трафик с компьютера 192.168.0.6 пойдет через второго провайдера, а все остальные компьютеры будут работать через первого провайдера.

Исходящий трафик от MikroTik через 2-ого провайдера

Исходящим трафиком от самого MikroTik может быть:

  • исходящий vpn;
  • отправка email;
  • ping с самого роутера;
  • и другое.

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

/ip firewall mangle
add action=mark-routing chain=output dst-address=0.0.0.0/0 new-routing-mark=2 passthrough=no

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

Что делать, если локальные сети у провайдеров одинаковые

В предыдущем примере у нас локальные сети провайдеров разные:

  • 10.10.10.0/24 — у первого провайдера;
  • 10.10.11.0/24 — у второго провайдера.

А если бы они были абсолютно одинаковые и вам бы, в добавок, выдали одинаковые ip-адреса для wan:

  • Провайдер 1 — ip 10.10.10.5, gw — 10.10.10.1;
  • Провайдер 2 — ip 10.10.10.5, gw — 10.10.10.1.

В этом случае применяем VRF:

Используя VRF

В консоли это будет выглядеть так:

/ip route vrf
add interfaces=ether4 routing-mark=2

После проделанного, у вас должно получиться примерно следующее:

Настройки MikroTik

Я поменял ip-адрес для wan второго провайдера (ether4), он стал таким-же как и у первого провайдера (ether3).

В настройках nat, я изменил адрес (to addresses) для выхода через ether4 — 10.10.10.5.

Ну и после добавления в VRF ether4 во вторую таблицу маршрутизации, у наc connected маршрут от ether4 ушел в свою таблицу маршрутизации.

Получилась следующая схема сети:

Использование VRF

Выбор таблицы маршрутизации (ip / firewall / mangle)

Инструмент ip / routes / rule позволяет выбрать таблицу маршрутизации, основываясь на src. address, то есть на ip-адресе или подсети источника.

Но с помощью ip / firewall / mangle мы можем пометить трафик, основываясь на других параметрах. Это может быть исходящий порт, протокол, адрес лист и многое другое.

Если исходящий трафик мы помечали в цепочке output, то проходящий трафик нужно помечать в цепочке prerouting. Сделаем так, чтобы компьютер с адресом 192.168.0.9 ходил через второго провайдера:

/ip firewall mangle
add action=mark-routing chain=prerouting comment="to isp2" new-routing-mark=2 passthrough=no src-address=192.168.0.9

Но это ещё не все. У меня второй провайдер (ether4) во второй таблице маршрутизации, для этого я использовал VRF. И нужно возвращённый трафик из интернета в локальную сеть возвращать в таблицу main. Для этого создаем в ip / routes / rule следующее правило:

/ip route rule
add dst-address=192.168.0.0/24 table=main

В окне WinBox это выглядит так:

Трафик для локальной сети возвращаем в таблицу main

Помещаем принятый трафик в нужную таблицу маршрутизации

Иногда нужно пометить приходящий трафик (из интернета) и поместить его в свою таблицу маршрутизации. PBR на MikroTik позволяет это сделать двумя правилами в ip / firewall / mangle:

/ip firewall mangle
add action=mark-connection chain=prerouting in-interface=ether4 new-connection-mark=from-2 passthrough=yes
add action=mark-routing chain=prerouting connection-mark=from-2 new-routing-mark=2 passthrough=no

То есть, я маркирую соединения пришедшие на ether4 (ISP2) меткой from-2. А уже все соединения с меткой from-2, помещаю в таблицу маршрутизации 2 (new-routing-mark=2).

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

Итог

Мы рассмотрели несколько инструментов MikroTik для настройки PBR:

  • /ip route rule — позволяет поместить трафик в нужную таблицу маршрутизации основываясь только на src. address;
  • /ip firewall mangle — позволяет пометить трафик и поместить его в нужную таблицу маршрутизации основываясь на большем числе параметров (но сильнее нагружая процессор). Трафик можно метить (new-routing-mark) в двух цепочках:
    • output — для исходящего трафика с самого роутера;
    • prerouting — для проходящего трафика через роутер, например из локальной сети в интернет;
  • /ip route vrf — позволяет поместить интерфейс в нужную таблицу маршрутизации. Тогда connected маршруты для этих интерфейсов будут в своих таблицах маршрутизации.

Больше информации по маршрутизации в роутерах MikroTik вы можете получить перейдя по этим ссылкам:

Спасибо за внимание!

Сводка
Policy-based Routing (PBR) на MikroTik
Имя статьи
Policy-based Routing (PBR) на MikroTik
Описание
Из статьи Вы узнаете, что такое Policy-based Routing (PBR), как он используется и настраивается на маршрутизаторах MikroTik

2 Replies to “Policy-based Routing (PBR) на MikroTik”

  1. /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 и т.д. (маркировка пакетов отсутствует, только статика)

    Однако, в каждой конфигурации это индивидуально, сделать исходящий с роутера нужно в зависимости, как остальные правила настроены.

  2. ещё вариант:
    либо как в статье, но вместо dst-address установить Out Interface (list) = IPS interface (ISP list)

    p.s. вариант постом выше пошёл всё равно по другому маршруту, т.е. не факт что работает как задумано, при моей конфигурации.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *