Из этой статьи вы узнаете что такое рекурсивная маршрутизация, как она настраивается на 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 30 | Scope 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 |
На первом шаге поиска маршрута роутер пробегается по всем маршрутам и находит самый подходящий (для 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:
- Вначале мы пробегаемся по всем маршрутам и понимаем что нам подойдёт только маршрут по умолчанию (0.0.0.0/0 > 1.1.1.1). Теперь нужно понять, как добраться до 1.1.1.1.
- Пробегаемся уже не по всем маршрутам, а только по тем, у которых scope=20 или меньше. И понимаем что для 1.1.1.1 нам подойдет маршрут — 1.1.1.1 > 91.204.125.33. Теперь нужно понять, как добраться до 91.204.125.33.
- На третьем шаге пробегаемся по маршрутам у которых Scope = 10 или меньше. И находим подходящий маршрут (91.204.125.35/29 > ether1) ведущий на интерфейс.
Вот так работает рекурсивная маршрутизация в MikroTik. Такие настройки могут понадобится только в одном случае — если у вас несколько провайдеров и нужно, с помощью параметра Check Gateway, обеспечить переключение на резервный канал.
Практика
Настройка ip адресации
Мы уже знаем что рекурсивная маршрутизация вместе с параметром Check Gateway применяется исключительно для переключения на резервный канал, в том случае если через основного провайдера не работает Интернет.
На практике соберём следующую схему.
Настраивать будем только 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 вы можете почитать в официальной документации.
Отличные статьи, спасибо!
Было бы интересно рассмотреть кейс, когда провайдеры выдают IP по DHCP. Видимо, нужно добавлять маршруты через DHCP lease script, но как это правильно сделать с учетом рекурсивной маршрутизации не очевидно.
Спасибо и вам, что читаете! Мне пока не доводилось такое настраивать с dhcp. Хотя 1 раз я настраивал резервирование и 2-ой провайдер давал адрес по dhcp. Я просо выставил в dhcp клиенте distance 2 и он был у меня запасным. Никаких рекурсивных маршрутов или балансировки:)