Рекурсивная маршрутизация на 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 вы можете почитать в официальной документации.



2022-07-07T12:49:43
MikroTik