Skip to content

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 работает, и каждый из клиентов будет ходить только через указанного в настройках провайдера.

40 комментариев

  1. tismoid tismoid

    У вас похоже опечатка в 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

    • admin admin

      Да, спасибо! Поправил.

  2. timsoid timsoid

    Спасибо, всё работает.

  3. Pav_S Pav_S

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

    • admin admin

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

      • Alexey Alexey

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

  4. Pav_S Pav_S

    Спасибо всё получилось

  5. vital vital

    Статья класс. Спасибо, все работает!

    • admin admin

      Заходите еще 😉

  6. Kaldun Kaldun

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

    • admin admin

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

  7. Александр Александр

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

    • admin admin

      Потому что дропать нужно в фаерволе (ip firewall filter)

  8. chas99 chas99

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

    • admin admin

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

  9. neyva neyva

    Добрый день!

    А как сделать чтобы из сети 88.1 был доступ по rdp к сети 89.1 ?

    • admin admin

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

  10. Павел Павел

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

    • admin admin

      Думаю, попробую собрать такую схему в ближайшее время и проверить.

  11. Серега Серега

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

    • Использовать два устройства или настраивать vrf, чисто теоретически.

      • Серега Серега

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

      • Серега Серега

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

      • Я понял, о чем вы, но не проверял. Проверите — скажите, помогло или нет 🙂

      • Серега Серега

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

    • Добрый день.
      о какой ссылке речь?

  12. Ilya Ilya

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

    • А схему сети с указанием адресации можете приложить?

      • Ilya Ilya

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

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

      • Ilya Ilya

        Всё правильно. Получается, что там два шлюза — 192.168.5.1 и 192.168.5.2.

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

      • Ilya Ilya

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

  13. Сергей Сергей

    http://f6.s.qip.ru/cMfvWVJ7.png
    Подскажите пожалуйста, не совсем понимаю на каком из микротиков нужно маркировать трафик, для выполнения задачи на рисунке

    • Собственно на том, на который вам нужно пробросить порт. Т.е. на втором

  14. /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? А зачем?

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

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

%d такие блоггеры, как: