Policy based routing в Mikrotik

В этой заметке я не буду разъяснять, зачем нужен policy based routing – на эту тему дядюшка Гугл даст много ответов. Если кратко – то для любой группы хостов может быть создана своя собственная таблица маршрутизации, которые друг от друга никак не зависят. Таким образом, например, плохих клиентов, которые не заплатили вовремя можно заворачивать на специальный сервер, который покажет им большое и красивое сообщение. Да мало ли зачем нужны эти таблицы? Можно, например, раздавать трафик от двух провайдеров двум разным клиентам при помощи одного роутера. Сценарий – тьма. Приступи же к делу…

На картинке типичная схема PBR: одних клиентов рулим одному провайдеру, других провайдеров – другому. Не спрашивайте, зачем – так надо…


Предположим, что у нас есть роутер, в первые два порта которого входят аплинки от двух провайдеров, а к третьему и четвертому подключены клиенты

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

/ip address add address=192.168.88.1/30 interface=ether3
/ip address add address=192.168.89.1/30 interface=ether4

Затем создаем интерфейсы, которые смотрят на провайдеров:

/ip address add address=1.1.1.2/30 interface=ether1
/ip address add address=2.2.2.2/30 interface=ether2

Теперь добавляем маршруты:

/ip route add gateway=1.1.1.1 routing-mark=ISP1
/ip route add gateway=2.2.2.2 routing-mark=ISP2
#Основным шлюзом для самого устройства будет первый провайдер
/ip route add gateway=1.1.1.1

Теперь добавляем правила маршрутизации:

/ip route rule add dst-address=192.168.88.0/24 action=lookup table=main
/ip route rule add dst-address=192.168.89.0/24 action=lookup table=main
/ip route rule add dst-address=1.1.1.0/30 action=lookup table=main
/ip route rule add dst-address=2.2.2.0/30 action=lookup table=main
/ip route rule add src-address=1.1.1.0/30 action=lookup table=ISP1
/ip route rule add src-address=2.2.2.0/30 action=lookup table=ISP2
/ip route rule add routing-mark=ISP1 action=lookup table=ISP1
/ip route rule add routing-mark=ISP2 action=lookup table=ISP2

Осталось прописать правила фаервола, которые промаркируют трафик нужным нам образом:

/ip firewall mangle add chain=prerouting src-address=192.168.88.0/24 action=mark-routing \
new-routing-mark=ISP1 passthrough=no

/ip firewall mangle add chain=prerouting src-address=192.168.89.0/24 action=mark-routing \
new-routing-mark=ISP2 passthrough=no

/ip firewall mangle add chain=prerouting action=mark-routing \
new-routing-mark=ISP2 passthrough=no

И пропишем правила NAT:

/ip firewall nat add chain=srcnat action=masquerade out-interface=ether1 src-address=192.168.88.0/24
/ip firewall nat add chain=srcnat action=masquerade out-interface=ether2 src-address=192.168.89.0/24

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

41 Comments

  1. У вас похоже опечатка в 3 поле с кодом,

    /ip route add gateway=1.1.1.1 routing-mark=ISP2
    /ip route add gateway=2.2.2.2 routing-mark=ISP1

    ISP должны быть наоборот т.е.
    /ip route add gateway=1.1.1.1 routing-mark=ISP2
    /ip route add gateway=2.2.2.2 routing-mark=ISP1

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

    1. В правилах mangle маркируйте пакеты с нужных хостов (вплоть до /32) нужными метками.

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

  3. Спасибо за статью, все работает, еще есть вопрос, а можно ли сделать так чтоб трафик по 80-8080-443 портам ходил через одного прова, например через 3G, а скажем 3389 через иного?

    1. Разумеется. Делается все по аналогии – только при маркировке пакетов указывается еще протокол (tcp) и нужные Вам порты.

  4. А почему не работает drop? Вот здесь:
    /ip route rule add src-address=1.1.1.0/30 action=drop table=ISP1
    вместо lookup указываю дроп, и трафик все равно ходит? Можно ли вместо сорс ип указать интерфейс на который приходит интернет?

  5. скажите, пожалуйста, а как быть если провайдеры “поднимаются” в самом Mikrotik?
    1. в первый порт входит провайдер1 (ростелеком) PPPOE-OUT1
    2.usb-Modem Beelne
    они автоматом добавляют Dynamic маршруты…

    1. С динамической маршрутизацией сложнее, надо делать через mangle-цепочки фаервола. Но вполне реализуемо.

    1. Добрый день!
      А он и так должен быть (если фаервол позволяет). PBR работает только для “внешних”, по отношению к роутеру, сетей

  6. Доброго времени суток!
    Интересно взглянуть на реализацию с манглом при динамической маршрутизации.
    Т.к. у нас все провайдеры только динамику раздают! Да и как быть при таких жестких правилах в нате если один из каналов упадет?

  7. Все классно работает!Но что делать если провайдеры одинаковые и дают один и тот же gateway и маску.Как быть?Нужна помощь!Я конечно понимаю что какой толк от бвух одинаковых провайдеров но затеи великих нам холопам не понятны)))

      1. Подскажи если не сложно (боюсь сам не справлюсь) как применить vrf к данной ситуации, микротик настроен согласно твой инструкции!?

      2. Еще прочитал если в маршруте после gateway%(указать интерфейс то пойдет по нужному маршруту)1.1.1.1%erher1 ??

          1. Да все получилось!Хоть пока второй провайдер не воткнут но ip адреса уже забиты маршруты прописаны.Все работает!

  8. Подскажите, как реализовать правильно проброс порта RDP, когда есть два роутера соединённые через EOIP поверх PPTP. Нужно порт 3389 переадресовать в сеть с другим роутером. Подсеть у них одна.

      1. Вот как-то так: http://savepic.net/8779445.png
        Ни разу схемы и не составлял. Но вроде основные моменты понятны. Если надо – переделаю. Нужно, чтобы работал проброс порта от ISP1 в сеть за вторым роутером (eth2). Я думал через eoip будет всё работать по умолчанию. Но не всё так просто оказалось. Спасибо за помощь.

        1. Т.е. вы хотите обращаясь из инета на порт первого роутера попадать на комп за вторым роутером? А шлюзом по умолчанию для сети 192.168.5.0/24 кто является?

        1. Ну вообще раз подсеть у вас одна, то и шлюз должен быть в ней один – первый микротик или второй, не суть важно. Тогда через него же сможете спокойно делать проброс портов. И EoIP тут особо ни при чем.

      2. Всё оказалось банально просто. На микротиках стояли последние версии ПО. Откатил на предыдущую стабильную (bug fix only). И всё заработало само без всяких костылей-настроек. А столько времени и нервов было потрачено впустую. Эээхх.

  9. /ip firewall mangle add chain=prerouting src-address=192.168.88.0/24 action=mark-routing \
    new-routing-mark=ISP1 passthrough=no
    Все понятно – пометили пакет

    /ip firewall mangle add chain=prerouting src-address=192.168.89.0/24 action=mark-routing \
    new-routing-mark=ISP2 passthrough=no
    Все понятно – пометили пакет

    /ip firewall mangle add chain=prerouting action=mark-routing \
    new-routing-mark=ISP2 passthrough=no
    ^^^^^^^^^^^^^^^^^ не могу понять смысл этой команды? Все пакеты, не попавшие под 1-2 правило метим как ISP2? А зачем?

    1. В общем случае эта строчка не нужна. Она скорее обозначает направление “по умолчанию”. А вообще, я бы вам посоветовал пользоваться более новым вариантом:
      https://nixman.info/?p=2729

Leave a Reply