Рекурсивная маршрутизация на MikroTik

Из этой статьи вы узнаете что такое рекурсивная маршрутизация, как она настраивается на MikroTik и для чего используется.

Обычная маршрутизация

Для начала разберёмся с обычной маршрутизацией. Когда вы настраиваете роутер для выхода в интернет, вы должны настроить 3 параметра:

  • ip-адрес для локальной сети, например 192.168.0.1/24 на ether2;
  • ip-адрес для выхода в интернет, например 91.204.125.35/29 на ether1;
  • ip-адрес шлюза провайдера, например 91.204.125.33.
Схема выхода в интернет
Выход в интернет

Конечно это не всё, но для разбора темы про маршрутизацию достаточно.

Маршрут 0.0.0.0/0 > 91.204.125.33 — означает что все неизвестные сети (0.0.0.0/0) должны идти на ip адрес 91.204.125.33. А известными сетями для роутера будут 91.204.125.35/29 — её обслуживает интерфейс ether1, и 192.168.0.1/24 — она находится за ether2.

Эти три настройки дадут нам следующую таблицу маршрутизации:

0.0.0.0/0        > 91.204.125.33 - статический маршрут
91.204.125.35/29 > ether1        - connected маршрут 1
192.168.0.1/24   > ether2        - connected маршрут 2
  • Статический маршрут — это маршрут, который добавляют вручную. Статический маршрут в котором одни нули — называют Маршрутом по умолчанию.
  • Connected маршрут — такой маршрут появляется автоматически и зависит от назначенного ip-адреса на интерфейсе. И он всегда указывает на интерфейс, а не на ip-адрес.

Задача маршрутизатора определить не ip-адрес, а интерфейс на который нужно отправить пакет. Например, мы отправляет из локальной сети запрос на 8.8.8.8. Маршрутом для него является 0.0.0.0 > 91.204.125.33. Но, так как 91.204.125.33 это не интерфейс, то поиск продолжается.

На на втором шаге поиска нужного маршрута, ищется маршрут для адреса 91.204.125.33. Но уже не пробегаемся по всем маршрутам в таблице. Ведь уже не нужно пробегаться по 0.0.0.0/0 > 91.204.125.33 маршруту. Уже и так известно что он ведёт на ip-адрес, а мы ищем интерфейс. Поэтому именно этот маршрут можно исключить из поиска. По какому же алгоритму исключаются маршруты из поиска, об этом узнаем ниже.

Scope и Target-scope

Для того чтобы понять, какие маршруты можно исключить из поиска, используются параметры: scope и target-scope. Они существуют в Linux и от туда попали в RouterOS (операционную систему MikroTik).

  • Scope — текущая область маршрута;
  • Target-scope — область поиска.

Если маршрут не указывает на интерфейс, а указывает на ip-адрес, то поиск продолжается. Но ищутся маршруты со scope не превышающим target-scope у найденного на первом шаге маршрута.

Scope и target-scope у статических маршрутов можно менять, а у connected нельзя. А вот такие значения используются по умолчанию:

  • статический маршрут: scope = 30, target-scope = 10;
  • connected маршрут: scope = 10, target-scope = 10. Но target-scope здесь не важен, так как такой маршрут всегда указывает на интерфейс. А если найден интерфейс, то поиск заканчивается.

Добавим понятия scope и target-scope в нашу таблицу маршрутизации и всё станет ясно:

0.0.0.0/0        > 91.204.125.33 | Scope = 30 | Target Scope = 10
91.204.125.35/29 > ether1        | Scope = 10 | Target Scope = 10
192.168.0.1/24   > ether2        | Scope = 10 | Target Scope = 10
Scope 30Scope 10
0.0.0.0/0 > 91.204.125.33 (Target Scope = 10)91.204.125.35/29 > ether1
192.168.0.1/24 > ether2
Таблица маршрутов разделённых по значению Scope

На первом шаге поиска маршрута роутер пробегается по всем маршрутам и находит самый подходящий (для 8.8.8.8 это 0.0.0.0/0 > 91.204.125.33). Так как найденный маршрут указывает на ip адрес а не на интерфейс, то поиск продолжается.

На втором шаге поиска маршрута роутер смотрим на Target Scope уже найденного маршрута и пробегается по маршрутам у которых Scope не больше. В нашем случае не больше 10. И так как уже ясно что путь к 8.8.8.8 будет через 91.204.125.33, то ищется маршрут для 91.204.125.33. В нашем случае будет найден маршрут 91.204.125.35/29 > ether1. Вот так роутер определил в какой интерфейс отправить пакет.

Поиск маршрута
Поиск маршрута

Check Gateway

У MikroTik в настройках маршрутов есть замечательный параметр — Check Gateway, который пингует шлюз и если тот не доступен то маршрут отключается. Обычно это используется для переключения на резервного провайдера. Но может случиться ситуация, что шлюз провайдера у нас пингуется, а интернета нет. В этом случае спасает рекурсивная маршрутизация и параметр Check Gateway на маршрутах в MikroTik.

Рекурсивная маршрутизация в MikroTik

Хитрость в том, что вместо одного статического маршрута мы можем сделать два: обычный и рекурсивный. Получится следующая таблица маршрутизации:

0.0.0.0/0        > 1.1.1.1       | Scope = 30 | Target Scope = 20 | Check Gateway = On
1.1.1.1          > 91.204.125.33 | Scope = 20 | Target Scope = 10
91.204.125.35/29 > ether1        | Scope = 10 | Target Scope = 10
192.168.0.1/24   > ether2        | Scope = 10 | Target Scope = 10

Теперь нашим шлюзом по умолчанию является 1.1.1.1 и Check Gateway будет пинговать именно этот узел. Обратите внимание, у этого маршрута я поменял Target Scope на 20. Поэтому на втором шаге поиска будут обрабатываться маршруты со Scope = 20 или меньше. У второго статического маршрута мы изменили Scope на 20, поэтому он попадёт в область поиска.

Давайте теперь заново пробежимся по шагам поиска маршрута для 8.8.8.8:

  1. Вначале мы пробегаемся по всем маршрутам и понимаем что нам подойдёт только маршрут по умолчанию (0.0.0.0/0 > 1.1.1.1). Теперь нужно понять, как добраться до 1.1.1.1.
  2. Пробегаемся уже не по всем маршрутам, а только по тем, у которых scope=20 или меньше. И понимаем что для 1.1.1.1 нам подойдет маршрут — 1.1.1.1 > 91.204.125.33. Теперь нужно понять, как добраться до 91.204.125.33.
  3. На третьем шаге пробегаемся по маршрутам у которых Scope = 10 или меньше. И находим подходящий маршрут (91.204.125.35/29 > ether1) ведущий на интерфейс.
Поиск маршрута
Поиск маршрута

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

Практика

Настройка ip адресации

Мы уже знаем что рекурсивная маршрутизация вместе с параметром Check Gateway применяется исключительно для переключения на резервный канал, в том случае если через основного провайдера не работает Интернет.

На практике соберём следующую схему.

Резервирование 2-ух провайдеров

Настраивать будем только Router.

Во-первых, настроим IP адресацию:

/ip/address/add 
address=192.168.0.1/24 interface=ether4 comment=lan
address=91.205.132.85/29 interface=ether2 comment=isp1
address=91.205.147.85/29 interface=ether3 comment=isp2

После этого у нас должна появится ip связность со шлюзами провайдеров, проверим это:

[admin@Router] > ping 91.205.132.81
  SEQ HOST                                     SIZE TTL TIME       STATUS                                                       
    0 91.205.132.81                              56  64 402us     
    1 91.205.132.81                              56  64 235us     
    2 91.205.132.81                              56  64 307us     
    sent=3 received=3 packet-loss=0% min-rtt=235us avg-rtt=314us max-rtt=402us 

[admin@Router] > ping 91.205.147.81
  SEQ HOST                                     SIZE TTL TIME       STATUS                                                       
    0 91.205.147.81                              56  64 212us     
    1 91.205.147.81                              56  64 323us     
    2 91.205.147.81                              56  64 279us     
    sent=3 received=3 packet-loss=0% min-rtt=212us avg-rtt=271us max-rtt=323us

Видим, что всё ОК!

Настройка маршрутизации

Создаём первый дефолтный рекурсивный маршрут и маршрут для доступа через ISP1:

/ip/route/add 
dst-address=0.0.0.0/0 gateway=1.1.1.1 check-gateway=ping distance=1 target-scope=20 comment=isp1
dst-address=1.1.1.1 gateway=91.205.132.81 distance=1 scope=19 comment=isp1

То есть дефолтный маршрут (dst-address=0.0.0.0/0) у нас идет на 1.1.1.1, а 1.1.1.1 идет к ISP1 (gateway=91.205.132.81). При этом мы поменяли target-scope=20 у рекурсивного маршрута и scope=19 у маршрута через который идет рекурсия.

Теперь создадим рекурсивный маршрут через второго провайдера:

/ip/route/add 
dst-address=0.0.0.0/0 gateway=8.8.8.8 distance=2 target-scope=20 comment=isp2 
dst-address=8.8.8.8 gateway=91.205.147.81 distance=1 scope=19 comment=isp2    

Обратите внимание, что здесь мы не используем check-gateway. Этот параметр мы использовали только для дефолтного рекурсивного маршрута для первого провайдера. Так как второй дефолтный маршрут нужно сделать резервным, то для этого используем параметр distance=2. Чтобы один из двух одинаковых маршрутов стал главным, а второй резервным, нужно резервному задать параметр distance больше чем у главного.

У нас должны запинговаться наши проверочные узлы:

[admin@Router] > ping 8.8.8.8
  SEQ HOST                                     SIZE TTL TIME       STATUS                                                                                                                
    0 8.8.8.8                                    56  63 358us     
    1 8.8.8.8                                    56  63 428us     
    2 8.8.8.8                                    56  63 471us     
    sent=3 received=3 packet-loss=0% min-rtt=358us avg-rtt=419us max-rtt=471us 

[admin@Router] > ping 1.1.1.1
  SEQ HOST                                     SIZE TTL TIME       STATUS                                                                                                                
    0 1.1.1.1                                    56  63 359us     
    1 1.1.1.1                                    56  63 390us     
    2 1.1.1.1                                    56  63 449us     
    sent=3 received=3 packet-loss=0% min-rtt=359us avg-rtt=399us max-rtt=449us

Кстати, 8.8.8.8 идет сейчас через второго провайдера, а 1.1.1.1 идет через первого провайдера. А всё остальное будет идти через маршрут по умолчанию, то есть через первого провайдера, или через второго, если с первым что-нибудь случится.

Рекурсивная маршрутизация
Рекурсивная маршрутизация

Настройка SRCNAT и DNS

Настроим исходящий нат:

/ip/firewall/nat/add 
chain=srcnat  src-address=192.168.0.0/24 out-interface=ether2 action=src-nat to-addresses=91.205.132.85 comment=isp1
chain=srcnat  src-address=192.168.0.0/24 out-interface=ether3 action=src-nat to-addresses=91.205.147.85 comment=isp2

То есть, если мы выходим через интерфейс первого провайдера, то получаем его ip адрес. А если выходим через второго провайдера, то получаем его ip адрес.

Чтобы у нас всегда работали dns, мы можем использовать общий dns сервер вместо серверов провайдеров, например 77.88.8.8:

/ip/dns
set allow-remote-requests=yes servers=77.88.8.8

Итог

Рекурсивная маршрутизация действительно используется очень часто. Поэтому полезно знать про этот инструмент. А основными инструментами для создания рекурсивных маршрутов являются параметры Scope и Target-scope, которые мы рассмотрели в этой статье.

Другой параметр check-gateway, применяется для выключения маршрута, если его адрес не доступен.

А чтобы создать два одинаковых маршрута используется параметр distance. У резервного маршрута он должен быть больше чем у основного.

Спасибо за прочтение, рад если моя статья вам помогла. Также, если интересуетесь маршрутизацией на MikroTik, вам может понравится следующая статья: Policy-based Routing (PBR) на MikroTik.

Дополнительно, о маршрутизации на RouterOS вы можете почитать в официальной документации.

2 комментария к “Рекурсивная маршрутизация на MikroTik”

  1. Отличные статьи, спасибо!
    Было бы интересно рассмотреть кейс, когда провайдеры выдают IP по DHCP. Видимо, нужно добавлять маршруты через DHCP lease script, но как это правильно сделать с учетом рекурсивной маршрутизации не очевидно.

    Ответить
    • Спасибо и вам, что читаете! Мне пока не доводилось такое настраивать с dhcp. Хотя 1 раз я настраивал резервирование и 2-ой провайдер давал адрес по dhcp. Я просо выставил в dhcp клиенте distance 2 и он был у меня запасным. Никаких рекурсивных маршрутов или балансировки:)

      Ответить

Оставьте комментарий