Vrf interface mikrotik что это
Перейти к содержимому

Vrf interface mikrotik что это

  • автор:

Blog of Khlebalin Dmitriy

Туннели настроены, BGP тоже. Хотел еще посмотреть на VRF и на OSPF.

Сегодня про VRF.

Моя текущая общая схема такова:

1

VRF попробую сэмулировать на Mikrotik BRANCH1.

Соответственно меня будет интересовать вот этот кусок схемы:

2

Несколько дополню ее:

3

Сначала для понимания про VRF: http://ciscotips.ru/vrf

Несколько перенастроим Mikrotik:

4

5

Создаем второй бридж, куда добавляем необходимые порты, 2 порт у нас смотрит в 20 подсеть, 4 порт в 50 подсеть.

6

7

Назначим адрес на второй бридж:

8

Добавим второй пул на DHCP Server:

9

10

Без стакана тут не разобраться. Пришлось вновь обратиться за разъяснениями к знающим людям (спасибо Стасу за необходимые разъяснения).

Теперь настроим VRF согласно первоначальному заданию: Необходимо, чтоб 20 подсеть выходила в интернет через провайдера WAN_prime, а 50 подсеть выходила через WAN_sec.

У нас есть MAIN таблица маршрутизации по умолчанию, сейчас в ней все наши маршруты.

Создадим еще две таблицы для основного и резервного провайдера.

11

Как только создали две новые таблицы маршрутизации, все наши маршруты остались в таблице MAIN, соответственно все маршруты в том числе и прилетающие по BGP «канули в лету» и SSTP туннели к Голове отвалились.

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

12

13

После чего маршруты благополучно снова прилетели и SSTP туннели снова поднялись.

Далее создадим правила:

Трафик направляющийся на основной и резервные каналы нашего Головного офиса кладем в наши созданные таблицы маршрутизации.

14

15

Ну и соответственно создаем правила чтобы из 20 подсети выходили в интернет через основного провайдера, а с 50 с резервного провайдера.

16

17

18

19

Настроим правило mangle для подробного анализа логов.

20

21

22

В итоге получается вот такая таблица маршрутизации:

23

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

24

Почему? -Так пока непонятно… Если есть версии, прошу написать в комментарии…

Основы статической маршрутизации в Mikrotik RouterOS

Маршрутизация — процесс поиска оптимального пути для передачи пакетов в сетях TCP/IP. Любой устройство подключенное к сети IPv4 содержит процесс и таблицы маршрутизации.

Данная статья не является HOWTO, она описывает на примерах статическую маршрутизацию в RouterOS, я намеренно опускал остальные настройки (например srcnat для доступа в сеть интернет), поэтому для понимания материала требуется определенный уровень знания по сетям и RouterOS.

Коммутация и маршрутизация

Коммутация — процесс обмена пакетами в пределах одного Layer2 сегмента (Ethernet, ppp, . ). Если устройство видит, что получатель пакета находится с ним в одной Ethernet подсети, оно узнает mac адрес по протоколу arp и передает пакет напрямую, минуя маршрутизатор. У ppp (point-to-point) соединения может быть только два участника и пакет всегда отправляется на один адрес 0xff.

Маршрутизация — процесс передачи пакетов между Layer2 сегментами. Если устройство хочет отправить пакет, получатель которого находится за пределами Ethernet сегмента, оно смотрит в свою таблицу маршрутизации и передает пакет шлюзу, который знает куда отправить пакет дальше (а может и не знает, изначальный отправитель пакета про это не осведомлен).

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

Если вам все понятно или вы и так это знали, то читайте дальше. Остальным настоятельно рекомендую ознакомиться с маленькой, но очень емкой статьей.

Маршрутизация в RouterOS и PacketFlow

Практически весь функционал относящийся к статической маршрутизации находится в пакете system. Пакет routing добавляет поддержку алгоритмов динамической маршрутизации (RIP, OSPF, BGP, MME), Routing Filters и BFD.

Основное меню для настройки маршрутизации: [IP]->[Route] . Сложные схемы могут потребовать предварительную маркировку пакетов маршрутной меткой в: [IP]->[Firewall]->[Mangle] (цепочки PREROUTING и OUTPUT ).

На PacketFlow можно выделить три места, где принимаются решения о маршрутизации IP пакетов:

  1. Маршрутизация пакетов поступивших на роутер. На данном этапе решается уйдет пакет локальному процессу или будет отправлен дальше в сеть. Транзитные пакеты получают Output Interface
  2. Маршрутизация локальных исходящих пакетов. Исходящие пакеты получают Output Interface
  3. Дополнительный этап маршрутизации для исходящих пакетов, позволяет изменить решение о маршрутизации в [Output|Mangle]
  • Путь пакета в блоках 1, 2 зависит от правил в [IP]->[Route]
  • Путь пакета в пунктах 1, 2 и 3 зависит от правил в [IP]->[Route]->[Rules]
  • На путь пакета в блоках 1, 3 можно повлиять используя [IP]->[Firewall]->[Mangle]

RIB, FIB, Routing Cache

Routing Information Base
База в которой собираются маршруты от протоколов динамической маршрутизации, маршруты от ppp и dhcp, статические и подключенные (connected) маршруты. Данная база содержит все маршруты, за исключением отфильтрованных администратором.

Условно, можно считать что [IP]->[Route] отображает RIB.

Forwarding Information Base

База в которой собираются наилучшие маршруты из RIB. Все маршруты в FIB являются активными и используются для пересылки пакетов. Если маршрут становится неактивным (отключен администратором (системой), или интерфейс через который должен отправляться пакет не активен) маршрут удаляется из FIB.

Для принятия решения о маршрутизации в таблице FIB используются следующие данные о IP пакете:

  • Source Address
  • Destination Address
  • Source Interface
  • Routing mark
  • ToS (DSCP)

Попадая в FIB пакет проходит следующие стадии:

  • Пакет предназначен локальному процессу роутера?
  • Пакет попадает под системные или пользовательские правила PBR?
    • Если да, то пакет отправляется в указанную таблицу маршрутизации

    Условно, можно считать что [IP]->[Route Active=yes] отображает FIB.

    Routing Cache
    Механизм кэширования маршрутов. Маршрутизатор запоминает куда были отправлены пакеты и если встречаются похожие (предположительно из одного соединения) пускает их по тому-же маршруту, без проверки в FIB. Кэш маршрутов периодически очищается.

    Для администраторов RouterOS не сделали средств просмотра и управления Routing Cache, но при его можно отключить в [IP]->[Settings] .

    Данный механизм был удален из ядра linux 3.6, но в RouterOS до сих пор используется kernel 3.3.5, возможно Routing cahce — одна из причин.

    Диалог добавления маршрута

    [IP]->[Route]->[+]

    1. Подсеть для которой необходимо создать маршрут (по умолчанию: 0.0.0.0/0)
    2. IP шлюза или интерфейс на который будет отправлен пакет (может быть несколько, см. ниже ECMP)
    3. Проверка доступности шлюза
    4. Тип записи
    5. Дистанция (метрика) для маршрута
    6. Таблица маршрутизации
    7. IP для локальных исходящих пакетов через данный маршрут
    8. Про назначение Scope и Target Scope написано в конце статьи

    Флаги маршрутов

    • X — Маршрут отключен администратором ( disabled=yes )
    • A — Маршрут используется для передачи пакетов
    • D — Маршрут добавлен динамически (BGP, OSPF, RIP, MME, PPP, DHCP, Connected)
    • C — Подсеть подключена непосредственно к маршрутизатору
    • S — Статический маршрут
    • r,b,o,m — Маршрут добавлен одним из протоколов динамической маршрутизации
    • B,U,P — Фильтрующий маршрут (отбрасывает пакеты вместо передачи)

    Что указывать в gateway: ip-адрес или интерфейс?

    Система позволяет указывать и то, и другое, при этом не ругается и не дает подсказок, если вы что-то сделали неправильно.

    IP адрес
    Адрес шлюза должен быть доступен по Layer2. Для Ethernet это означает, что роутер должен иметь на одном из активных интерфейсов ip адрес из той же подсети, для ppp — что адрес gateway указан на одном из активных интерфейсов в качестве адреса подсети.
    Если условие доступности по Layer2 не выполняется — маршрут считается неактивным и не попадает в FIB.

    Интерфейс
    Все сложнее и поведение маршрутизатора зависит от типа интерфейса:

    • PPP (Async, PPTP, L2TP, SSTP, PPPoE, OpenVPN*) соединение предполагает наличие только двух участников и пакет всегда будет направлен шлюзу для передачи, если шлюз обнаружит, что получателем является он сам, то передаст пакет своему локальному процессу.
    • Ethernet предполагает наличие множества участников и будет отправлять на интерфейс arp запросы с адресом получателя пакета, это ожидаемое и вполне нормальное поведение для connected маршрутов.
      Но при попытке использовать интерфейс в качестве маршрута для удаленной подсети вы получите следующую ситуацию: маршрут активен, ping до шлюза проходит, но не доходят до получателя из указанной подсети. Если посмотрите на интерфейс через сниффер, то увидите arp запросы с адресами из удаленной подсети.
      />

    Старайтесь указывать ip адрес в качестве gateway всегда когда это возможно. Исключение — connected маршруты (создаются автоматически) и PPP (Async, PPTP, L2TP, SSTP, PPPoE, OpenVPN*) интерфейсы.

    OpenVPN не содержит PPP заголовка, но можно использовать имя OpenVPN интерфейса для создания маршрута.

    More Specific Route

    Основное правило маршрутизации. Маршрут описывающий более маленькую подсеть (с наибольшей маской подсети) имеет больший приоритет при принятии решения о маршрутизации пакета. Положение записей в таблице маршрутизации не имеет отношения к выбору — основное правило More Specific.

    Все маршруты из указанной схемы активны (находятся в FIB), т.к. указывают на различные подсети и не конфликтуют между собой.

    Если один из шлюзов станет недоступным, связанный маршрут будет считаться неактивным (удален из FIB) и для пакетов будет производиться поиск из оставшихся маршрутов.

    Маршруту с подсетью 0.0.0.0/0 иногда придают особое значение и называют «Маршрут по умолчанию» (Default Route) или «Шлюз последней надежды» (gateway of last resort). На самом деле в нем нет ничего магического и он просто включает все возможные адреса IPv4, но данные названия хорошо описывают его задачу — он указывает на шлюз, куда пересылать пакеты для которых нет других, более точных, маршрутов.

    Максимально возможная маска подсети для IPv4 — /32, такой маршрут указывает на конкретный хост и может использоваться в таблице маршрутизации.

    Понимание More Specific Route является фундаментальным для любых устройств работающих с TCP/IP.

    Distance

    Дистанции (или Метрики) необходимы для административной фильтрации маршрутов до одной подсети доступной через несколько шлюзов. Маршрут с меньшей метрикой считается приоритетным и попадет в FIB. Если маршрут с меньшей метрикой перестанет быть активным, то в FIB он будет заменен на маршрут с большей метрикой.

    Если присутствует несколько маршрутов до одной подсети с одинаковой метрикой, маршрутизатор добавить в таблицу FIB только один из них, руководствуясь своей внутренней логикой.

    Метрика может принимать значение от 0 до 255:

    • 0 — Метрика для подключенных (connected) маршрутов. Дистанция 0 не может быть выставлена администратором
    • 1-254 — Метрики доступные администратору для установки маршрутам. Метрики с меньшим значением имеют больший приоритет
    • 255 — Метрика доступная администратору для установки маршрутам. В отличии от 1-254, маршрут с метрикой 255 всегда остается неактивным и не попадает в FIB
    • Особые метрики. У маршрутов полученных от протоколов динамической маршрутизации, есть стандартные значения метрик

    Check gateway

    Check gateway — расширение MikroTik RoutesOS для проверки доступности шлюза по icmp или arp. Раз в 10 секунд (изменить нельзя) на шлюз отправляется запрос, если дважды не приходит ответ маршрут считается недоступным и удаляется из FIB. Если check gateway отключил маршрут проверки продолжается и маршрут снова станет активным после одной успешной проверки.

    Check gateway отключает запись, в которой он настроен и все остальные записи (во всех таблицах маршрутизации и ecmp маршрутах) с указанным шлюзом.

    В целом check gateway работает нормально, если не возникает проблем с потерей пакетов до шлюза. Check gateway не знает, что происходит со связью за пределами проверяемого шлюза, для этого необходимы дополнительные инструменты: скрипты, рекурсивная маршрутизация, протоколы динамической маршрутизации.

    Большинство VPN и туннельных протоколов содержат встроенные средства для проверки активности соединения, включать для них check gateway — это дополнительная (но очень маленькая) нагрузка на сеть и производительность устройства.

    ECMP маршруты

    Equal-Cost Multi-Path — отправка пакетов до получателя используя одновременно несколько шлюзом с перебором по алгоритму Round Robin.

    ECMP маршрут создается администратором, путем указания нескольких gateway для одной подсети (либо автоматический, при наличии двух равноценных маршрутов OSPF).

    ECMP используется для балансировки нагрузки между двумя каналами, в теории, если в ecmp маршруте два канала, то для каждого пакета исходящий канал должен отличаться. Но механизм Routing cache отправляет пакеты из соединения по маршруту, которым пошел первый пакет, в итоге получаем подобие балансировки на базе соединений (per-connection loading balancing).

    Если отключить Routing Cache, то пакеты в ECMP маршруте будут делиться правильно, но возникает проблема с NAT. Правило NAT обрабатывает только первый пакет из соединения (остальные обрабатываются автоматически) и получается ситуация, что с различных интерфейсов уходят пакеты с одним адресом источника.

    В ECMP маршрутах не работает check gateway (баг RouterOS). Но можно обойти это ограничение, если создать дополнительные маршруты для проверки, которые будут отключать записи в ECMP.

    Фильтрация средствами Routing

    Опция Type определяет, что сделать с пакетом:

    • unicast — отправить на указанный шлюз (интерфейс)
    • blackhole — отбросить пакет
    • prohibit, unreachable — отбросить пакет и отправить icmp сообщение отправителю

    Фильтрацию обычно используют, когда нужно обезопасить отправку пакетов не по тому пути, конечно можно фильтровать подобное через firewall.

    Пара примеров

    Для закрепления базовых вещей о маршрутизации.

    Типичный домашний роутер

    1. Статический маршрут до 0.0.0.0/0 (default route)
    2. Connected маршрут на интерфейсе с провайдером
    3. Connected маршрут на интерфейсе с локальной сетью

    Типичный домашний роутер с PPPoE

    1. Статический маршрут до default route, добавлен автоматически т.к. это указано в свойствах подключения
    2. Connected маршрут для PPP соединения
    3. Connected маршрут на интерфейсе с локальной сетью

    Типичный домашний роутер с двумя провайдерами и резервированием

    1. Статический маршрут до default route через первого провайдера с метрикой 1 и проверкой доступности шлюза
    2. Статический маршрут до default route через второго провайдера с метрикой 2
    3. Connected маршруты

    Трафик до 0.0.0.0/0 идет через 10.10.10.1, пока данный шлюз доступен, иначе переключается на 10.20.20.1

    Такую схему можно считать резервированием канала, но она не лишена недостатков. Если произойдет обрыв за пределами шлюза провайдера (например внутри операторской сети), ваш роутер об этом не узнает и продолжит считать маршрут активным.

    Типичный домашний роутер с двумя провайдерами, резервированием и ECMP

    1. Статические маршруты для проверки chack gateway
    2. Маршрут ECMP
    3. Connected маршруты

    Маршруты для проверки синего цвета (цвет неактивных маршрутов), но это не мешает работе check gateway. В текущей версии (6.44) RoS автоматический приоритет отдается ECMP маршруту, но лучше добавить проверочные маршруты в другие таблицы маршрутизации (опция routing-mark )

    На Speedtest и прочих подобных сайтах прироста скорости не будет (ECMP делит трафик по соединениям, а не по пакетам), но p2p приложения должны загружать быстрее.

    Фильтрация через Routing

    1. Статический маршрут до default route
    2. Статический маршрут до 192.168.200.0/24 через ipip туннель
    3. Запрещающий статический маршрут до 192.168.200.0/24 через маршрутизатор провайдера

    Вариант фильтрации при которой туннельный трафик не уйдет на маршрутизатор провайдера при отключении ipip интерфейса. Подобные схемы требуются редко, т.к. можно реализовать блокировку через firewall.

    Routing Loop
    Петля маршрутизации — ситуация когда пакет бегает между маршрутизаторами до истечения ttl. Обычно является следствием ошибки конфигурации, в больших сетях лечится внедрением протоколов динамической маршрутизации, в маленьких — внимательностью.

    Выглядит это примерно так:

    Пример (наипростейший) как получить подобный результат:
    />

    Пример с Routing loop не имеет практического применения, но он показывает что маршрутизаторы понятия не имеют о таблице маршрутизации своих соседей.

    Policy Base Routing и дополнительные таблицы маршрутизации

    При выборе маршрута, роутер использует только одно поле из заголовка пакета (Dst. Address) — это базовая маршрутизация. Маршрутизация на базе других условий, например адреса источника, типа трафика (ToS), балансировка без ECMP, относится к Policy Base Routing (PBR) и использует дополнительные таблицы маршрутизации.

    More Specific Route является основным правилом выбора маршрута, в пределах таблицы маршрутизации.

    По умолчанию все правила маршрутизации добавляются в таблицу main. Администратор может создать произвольное количество дополнительных таблиц маршрутизации и направлять пакеты в них. Правила в разных таблицах не конфликтуют между собой. Если пакет не нашел подходящего правила в указанной таблице, он уйдет в таблицу main.

    Пример с распределением через Firewall:

    • 192.168.100.10 -> 8.8.8.8
      1. Трафик от 192.168.100.10 получает метку via-isp1 в [Prerouting|Mangle]
      2. На этапе Routing в таблице via-isp1 производится поиск маршрута до 8.8.8.8
      3. Маршрут найден, трафик отправляется на шлюз 10.10.10.1
    • 192.168.200.20 -> 8.8.8.8
      1. Трафик от 192.168.200.20 получает метку via-isp2 в [Prerouting|Mangle]
      2. На этапе Routing в таблице via-isp2 производится поиск маршрута до 8.8.8.8
      3. Маршрут найден, трафик отправляется на шлюз 10.20.20.1
    • Если один из шлюзов (10.10.10.1 или 10.20.20.1) станет недоступным, то пакет уйдет в таблицу main и будет искать подходящий маршрут там

    Проблемы терминологии

    В RouterOS есть определенные проблемы с терминологией.
    При работе с правилами в [IP]->[Routes] указывается таблица маршрутизации, хотя и написано что метка:

    В [IP]->[Routes]->[Rule] все правильно, в условии метки в действии таблицы:

    Как отправить пакет в определенную таблицу маршрутизации

    RouterOS дает несколько инструментов:

    • Правила в [IP]->[Routes]->[Rules]
    • Маршрутные метки ( action=mark-routing ) в [IP]->[Firewall]->[Mangle]
    • VRF

    Правила [IP]->[Route]->[Rules]
    Правила обрабатываются последовательно, если пакет совпал с условиями правила он не проходит дальше.

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

    Правила состоят из условий и действия:

    • Условия. Практически повторяют список признаков по которым пакет проверяется в FIB, отсутствует только ToS.
    • Действия
      • lookup — отправить пакет в таблицу
      • lookup only in table — запереть пакет в таблице, если маршрут не будет найден пакет не уйдет в таблицу main
      • drop — отбросить пакет
      • unreacheable — отбросить пакет с уведомлением отправителя

      В FIB трафик до локальных процессов обрабатывается в обход правил [IP]->[Route]->[Rules] :

      Маркировка [IP]->[Firewall]->[Mangle]
      Маршрутные метки позволяют устанавливать шлюз для пакета используя практически любые условия Firewall:

      Практически, потому что не все из них имеет смысл, а некоторые могут работать нестабильно.

      Маркировать пакет можно двумя способами:

      • Сразу ставить routing-mark
      • Сначала ставить connection-mark, потом на основе connection-mark ставить routing-mark

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

      Примеры использования

      Переходим к примерам использования Policy Base Routing, на них гораздо проще показать зачем все это нужно.

      MultiWAN и ответный исходящий (Output) трафик
      Распространенная проблема, при MultiWAN конфигурации: Mikrotik доступен из сети интернет только по «активному» провайдеру.

      Роутеру не важно на какой ip пришел запрос, при генерации ответа он будет искать маршрут в таблице маршрутизации, где активен маршрут через isp1. Дальше такой пакет скорее всего будет отфильтрован по пути до получателя.

      Еще один интересный момент. Если на интерфейсе ether1 настроен «простой» source nat: /ip fi nat add out-interface=ether1 action=masquerade пакет уйдет в сеть с src. address=10.10.10.100, что еще больше усугубит ситуацию.

      Исправить проблему можно нескольким способами, но для любого из них потребуются дополнительные таблицы маршрутизации:

      Использование [IP]->[Route]->[Rules]
      Указываем таблицу маршрутизации которая будет использована для пакетов с указанными Source IP.

      Можно использовать action=lookup , но для локального исходящего трафика указанный вариант полностью исключает соединения с неправильного интерфейса.

      • Система генерирует ответный пакет с Src. Address: 10.20.20.200
      • На этапе Routing Decision(2) происходит проверка [IP]->[Routes]->[Rules] и пакет отправляется в таблицу маршрутизации over-isp2
      • В соответствии с таблицей маршрутизации пакет должен быть отправлен на шлюз 10.20.20.1 через интерфейс ether2

      Данный способ не требует рабочий Connection Tracker, в отличии от использования таблицы Mangle.

      Использование [IP]->[Firewall]->[Mangle]
      Соединение начинается со входящего пакета, поэтому маркируем его ( action=mark-connection ), для исходящих пакетов от маркированного соединения устанавливаем маршрутную метку ( action=mark-routing ).

      Если на одном интерфейсе настроено несколько ip, можно добавить в условие dst-address для уточнения.

      • На интерфейс ether2 поступает пакет открывающий соединение. Пакет попадает в [INPUT|Mangle] где говорится маркировать все пакеты из соединения как from-isp2
      • Система генерирует ответный пакет с Src. Address: 10.20.20.200
      • На этапе Routing Decision(2) пакет в соответствии с таблицей маршрутизации отправляется на шлюз 10.20.20.1 через интерфейс ether1. Можете убедиться в этом залогировав пакеты в [OUTPUT|Filter]
      • На этапе [OUTPUT|Mangle] происходит проверка на наличие метки соединения from-isp2 и пакет получает маршруткую метку over-isp2
      • На этапе Routing Adjusment(3) происходит проверка на наличие маршрутной метки и отправка в соответствующую таблицу маршрутизации
      • В соответствии с таблицей маршрутизации пакет должен быть отправлен на шлюз 10.20.20.1 через интерфейс ether2

      MultiWAN и ответный dst-nat трафик

      Пример посложнее, что делать если за роутером находится сервер (например web) в частной подсети и необходимо обеспечить доступ к нему по любому из провайдеров.

      Суть проблемы будет та же, решение похоже на вариант с Firewall Mangle, только будут использоваться другие цепочки:


      На схеме не отображен NAT, но думаю и так все понятно.

      MultiWAN и исходящие соединения

      Можно использовать возможности PBR для создания нескольких vpn (в примере SSTP) соединений с разных интерфейсов роутера.

      Дополнительные таблицы маршрутизации:

      Простые правила NAT, иначе пакет уйдет с интерфейса с неправильным Src. Address:

      • Роутер создает три процесса SSTP
      • На этапе Routing Decision (2) для данных процессов выбирается маршрут, исходя из таблицы маршрутизации main. От этого же маршрута пакет получает Src. Address привязанный к интерфейсу ether1
      • В [Output|Mangle] пакеты от разных соединений получают разные метки
      • Пакеты попадают в соответствующие меткам таблицы на этапе Routing Adjusment и получает новый маршрут для отправки пакетов
      • Но у пакетов все еще остается Src. Address от ether1, на этапе [Nat|Srcnat] адрес подменяется в соответствии с интерфейсом

      Интересно, что на роутере вы увидите следующую таблицу соединений:

      Connection Tracker отрабатывает раньше [Mangle] и [Srcnat] , поэтому все соединения идут от одного адреса, если посмотреть подробнее то в Replay Dst. Address будут адреса после NAT:

      На VPN сервере (на тестовом стенде он у меня один) можно увидеть что все соединения происходят с правильных адресов:

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

      Но такие маршруты будут влиять не только на исходящий но и на транзитный трафик. Плюс, если вам не нужно чтобы трафик на vpn сервера уходил через неподходящие каналы связи, то придется добавить еще 6 правил в [IP]->[Routes] с type=blackhole . В предыдущем варианте — 3 правила в [IP]->[Route]->[Rules] .

      Распределение соединений пользователей по каналам связи

      Простые, повседневные задачи. Опять же понадобятся дополнительные таблицы маршрутизации:

      Используя [IP]->[Route]->[Rules]

      Если использовать action=lookup , то при отключении одного из каналов трафик уйдет в таблицу main и пойдет по рабочему каналу. Нужно это или нет — зависит от задачи.

      Используя маркировки в [IP]->[Firewall]->[Mangle]
      Простой пример со списками ip адресов. В принципе можно использовать практически любые условия. Единственное предостережение layer7, даже в паре с метками соединений, может показаться что всё работает правильно, но часть трафика всеравно уйдет не туда.

      «Запереть» пользователей в одной таблице маршрутизации можно через [IP]->[Route]->[Rules] :

      Либо через [IP]->[Firewall]->[Filter] :

      Отступление про dst-address-type=!local
      Дополнительное условие dst-address-type=!local необходимо чтобы трафик от пользователей доходил до локальных процессов роутера (dns, winbox, ssh, . ). Если к роутеру подключено несколько локальных подсетей, необходимо предусмотреть чтобы трафик между ними не уходил в интернет, например используя dst-address-table .

      В примере с использованием [IP]->[Route]->[Rules] подобных исключений нет, но трафик до локальных процессов доходит. Дело в том, что попадая в FIB пакет промаркированный в [PREROUTING|Mangle] имеет маршрутную метку и уходит в таблицу маршрутизации отличную от main, где нет локального интерфейса. В случае с Routing Rules, сначала проверяется предназначен ли пакет локальному процессу и только на этапе User PBR он уходит в заданную таблицу маршрутизации.

      Используя [IP]->[Firewall]->[Mangle action=route]
      Данное действие работает только в [Prerouting|Mangle] и позволяет направлять трафик на указанный шлюз без использования дополнительных таблиц маршрутизации, указывая адрес шлюза напрямую:

      Действие route имеет более низкий приоритет чем правила маршрутизации ( [IP]->[Route]->[Rules] ). В случае с маршрутными метками все зависит от положения правил, если правило с action=route стоит выше чем action=mark-route , то будет использовано оно (вне зависимости от флага passtrough ), иначе маркировка маршрута.
      На wiki очень мало информации про данное действие и все выводы получены эксперементальным путем, в любом случае я не нашел варианты когда применение данного варианта дает приимущества перед другими.

      Динамическая балансировка на основе PPC

      Per Connection Classificator — является более гибким аналогом ECMP. В отличии от ECMP делит трафик по соединениям более строго (ECMP ничего про соединения не знает, но в паре с Routing Cache получается нечто похожее).

      PCC берет указанные поля из ip заголовка, преобразует их в 32-битное значение и делит на знаменатель. Остаток от деления сравнивается с указанным остатком и если они совпадают, то применяется указанное действие. Подробнее. Звучит дико, но работает.

      Пример с тремя адресами:

      Пример динамического распределения трафика по src.address между тремя каналами:

      При маркировке маршрутов есть дополнительное условие: in-interface=br-lan , без него под action=mark-routing попадет ответный трафик из интернета и в соответствии с таблицами маршрутизации уйдет обратно к провайдеру.

      Переключение каналов связи

      Check ping — хороший инструмент, но он проверяет связь только с ближайшим IP пиром, сети провайдеров обычно состоят из большого числа маршрутизаторов и обрыв связи может произойти за пределами ближайшего пира, а дальше идут магистральные операторы связи у которых тоже могут случаться проблемы, в общем check ping не всегда показывает актуальную информацию о доступе в глобальную сеть.
      Если у провайдеров и крупных корпораций есть протокол динамической маршрутизации BGP, то домашним и офисным пользователем приходится самостоятельно придумывать как проверять доступ в интернет через определенный канал связи.

      Обычно используются скрипты, которые через определенный канал связи проверяют доступность ip адреса в сети интернет, при этом выбирается что то надежное, например google dns: 8.8.8.8. 8.8.4.4. Но в сообществе Mikrotik для этого приспособили более интересный инструмент.

      Пара слов про рекурсивную маршрутизацию
      Рекурсивная маршрутизация необходима при построении Multihop BGP пиринга и в статью про основы статической маршрутизации попала только за счет ушлых пользователей MikroTik, которые придумали как использовать рекурсивный маршруты в паре с check gateway для переключение каналов связи без дополнительных скриптов.

      Пришло время в общих чертах разобраться с опциями scope/target scope и каким образом маршрут привязывается к интерфейсу:

      1. Маршрут ищет интерфейс для отправки пакета исходя из своего значения scope и всех записей в таблице main с меньшими или равными значениями target scope
      2. Из найденных интерфейсов выбирается тот, через который можно отправить пакет указанному шлюзу
      3. Интерфейс найденной connected записи выбирается для отправки пакета на шлюз

      При наличии рекурсивного маршрута происходит все тоже самое, но в два этапа:

      • 1-3 К connected маршрутам добавляется еще один, через который можно достичь указанного шлюза
      • 4-6 Поиск маршрута connected маршрута для «промежуточного» шлюза

      Все манипуляции с рекурсивным поиском происходят в RIB, а в FIB передается только итоговый результат: 0.0.0.0/0 via 10.10.10.1 on ether1 .

      Пример использования рекурсивной маршрутизации для переключения маршрутов

      Конфигурация:

      Можно проверить, что пакеты будут отправляться на 10.10.10.1:

      Check gateway ничего не знает про рекурсивную маршрутизацию и просто отправляет ping’и на адрес 8.8.8.8, который (исходя из таблицы main) доступен через шлюз 10.10.10.1.

      Если происходит потеря связи между 10.10.10.1 и 8.8.8.8, то происходит отключение маршрута, но пакеты (включая проверочные ping) до 8.8.8.8 продолжают идти через 10.10.10.1:

      Если происходит потеря линка на ether1, то получается неприятная ситуация, когда пакеты до 8.8.8.8 пойдут через второго провайдера:

      Это проблема, если вы используете NetWatch для запуска скриптов при недоступности 8.8.8.8. При обрыве линка NetWatch просто отработает по резервному каналу связи и будет считать что все нормально. Решается добавлением дополнительного фильтрующего маршрута:

      На хабре есть статья, где ситуация с NetWatch рассмотрена более детально.

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

      Пара слов про Virtual Routing and Forwarding (VRF)

      Технология VRF предназначена для создания нескольких виртуальных маршрутизаторов внутри одного физического, данная технология широко применяется у операторов связи (обычно в связке с MPLS) для предоставления услуги L3VPN клиентам с пересекающимися адресами подсетей:

      Но VRF в Mikrotik организован на базе таблиц маршрутизации и имеет ряд недостатков, например локальные ip адреса роутера доступны из всех VRF, подробнее можно почитать по ссылке.

      Пример конфигурации vrf:

      С устройства подключенного к ether2 видим, что проходит ping до адреса роутера из другого vrf (и это проблема), при этом ping в интернет не уходит:

      Для доступа в интернет необходимо прописать дополнительный маршрут обращающийся к таблице main (в терминологии vrf это называется route leaking):

      Тут показано два способа route leaking: используюя таблицу маршрутизации: 172.17.0.1@main и используя имя интерфейса: 172.17.0.1%wlan1 .

      И настроить маркировку для ответного трафика в [PREROUTING|Mangle] :

      Подсети с одинаковой адресацией
      Организация доступа до подсетей с одинаковой адресацией на одном роутере используя VRF и netmap:

      Правила маршрутизации для возвратного трафика:

      Добавление маршрутов полученных по dhcp в заданную таблицу маршрутизации
      VRF может быть интересен, если необходимо автоматически добавить динамический маршрут (например от dhcp client) в определенную таблицу маршрутизации.

      Добавление интерфейса в vrf:

      Правила для отправки трафика (исходящего и транзитного) через таблицу over-isp1:

      Дополнительный, фейковый маршрут для работы исходящей маршрутизции:

      Этот маршрут необходим только чтобы локальные исходящие пакеты могли пройти через Routing decision (2) до [OUTPUT|Mangle] и получить маршрутную метку, если на маршрутизаторе есть другие активные маршруты до 0.0.0.0/0 в таблице main оно не требуется.

      Цепочки connected-in и dynamic-in в [Routing] -> [Filters]

      Фильтрация маршрутов (входящий и исходящих) — это инструмент который обычно используется вместе с протоколами динамической маршрутизации (поэтому доступен только после установки пакета routing), но во входящих фильтрах есть две интересные цепочки:

      • connected-in — фильтрация connected маршрутов
      • dynamic-in — фильтрация динамических маршрутов полученных PPP и DCHP

      Фильтрация позволяет не только отбрасывать маршруты, но и изменять ряд опций: distance, routing-mark, comment, scope, target scope, .

      Это очень точечный инструмент и если можете сделать что-то без Routing Filters (но не скриптами), то не используйте Routing Filters, не путайте себя и тех кто будет конфигурировать роутер после вас. В контексте динамической маршрутизации Routing Filters будут использоваться значительно чаще и продуктивнее.

      Установка Routing Mark для динамических маршрутов
      Пример с домашнего маршрутизатора. У меня настроено два VPN соединения и трафик в них должен заворачиваться в соответствием с таблицами маршрутизации. При этом я хочу что-бы маршруты создавались автоматически при активации интерфейса:

      Не знаю почему, наверное баг, но если создать vrf для ppp интерфейса, то маршрут до 0.0.0.0/0 всеравно попадет в таблицу main. Иначе всё было бы еще проще.

      Отключение Connected маршрутов
      Иногда требуется и такое:

      Основы статической маршрутизации в Mikrotik RouterOS

      Маршрутизация — процесс поиска оптимального пути для передачи пакетов в сетях TCP/IP. Любой устройство подключенное к сети IPv4 содержит процесс и таблицы маршрутизации.

      Данная статья не является HOWTO, она описывает на примерах статическую маршрутизацию в RouterOS, я намеренно опускал остальные настройки (например srcnat для доступа в сеть интернет), поэтому для понимания материала требуется определенный уровень знания по сетям и RouterOS.

      Коммутация и маршрутизация

      Коммутация и маршрутизация

      Коммутация — процесс обмена пакетами в пределах одного Layer2 сегмента (Ethernet, ppp, …). Если устройство видит, что получатель пакета находится с ним в одной Ethernet подсети, оно узнает mac адрес по протоколу arp и передает пакет напрямую, минуя маршрутизатор. У ppp (point-to-point) соединения может быть только два участника и пакет всегда отправляется на один адрес 0xff.

      Маршрутизация — процесс передачи пакетов между Layer2 сегментами. Если устройство хочет отправить пакет, получатель которого находится за пределами Ethernet сегмента, оно смотрит в свою таблицу маршрутизации и передает пакет шлюзу, который знает куда отправить пакет дальше (а может и не знает, изначальный отправитель пакета про это не осведомлен).

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

      Если вам все понятно или вы и так это знали, то читайте дальше. Остальным настоятельно рекомендую ознакомиться с маленькой, но очень емкой статьей.

      Маршрутизация в RouterOS и PacketFlow

      Практически весь функционал относящийся к статической маршрутизации находится в пакете system. Пакет routing добавляет поддержку алгоритмов динамической маршрутизации (RIP, OSPF, BGP, MME), Routing Filters и BFD.

      Основное меню для настройки маршрутизации: [IP]->[Route] . Сложные схемы могут потребовать предварительную маркировку пакетов маршрутной меткой в: [IP]->[Firewall]->[Mangle] (цепочки PREROUTING и OUTPUT ).

      На PacketFlow можно выделить три места, где принимаются решения о маршрутизации IP пакетов:

      Маршрутизация в RouterOS и PacketFlow

      1. Маршрутизация пакетов поступивших на роутер. На данном этапе решается уйдет пакет локальному процессу или будет отправлен дальше в сеть. Транзитные пакеты получают Output Interface
      2. Маршрутизация локальных исходящих пакетов. Исходящие пакеты получают Output Interface
      3. Дополнительный этап маршрутизации для исходящих пакетов, позволяет изменить решение о маршрутизации в [Output|Mangle]
      • Путь пакета в блоках 1, 2 зависит от правил в [IP]->[Route]
      • Путь пакета в пунктах 1, 2 и 3 зависит от правил в [IP]->[Route]->[Rules]
      • На путь пакета в блоках 1, 3 можно повлиять используя [IP]->[Firewall]->[Mangle]

      RIB, FIB, Routing Cache

      Routing Information Base
      База в которой собираются маршруты от протоколов динамической маршрутизации, маршруты от ppp и dhcp, статические и подключенные (connected) маршруты. Данная база содержит все маршруты, за исключением отфильтрованных администратором.

      Условно, можно считать что [IP]->[Route] отображает RIB.

      Forwarding Information Base

      ktjnq1ebrd0

      База в которой собираются наилучшие маршруты из RIB. Все маршруты в FIB являются активными и используются для пересылки пакетов. Если маршрут становится неактивным (отключен администратором (системой), или интерфейс через который должен отправляться пакет не активен) маршрут удаляется из FIB.

      Для принятия решения о маршрутизации в таблице FIB используются следующие данные о IP пакете:

      • Source Address
      • Destination Address
      • Source Interface
      • Routing mark
      • ToS (DSCP)

      Попадая в FIB пакет проходит следующие стадии:

      • Пакет предназначен локальному процессу роутера?
      • Пакет попадает под системные или пользовательские правила PBR?
      • Если да, то пакет отправляется в указанную таблицу маршрутизации
      • Пакет отправляется в таблицу main

      Условно, можно считать что [IP]->[Route Active=yes] отображает FIB.

      Routing Cache
      Механизм кэширования маршрутов. Маршрутизатор запоминает куда были отправлены пакеты и если встречаются похожие (предположительно из одного соединения) пускает их по тому-же маршруту, без проверки в FIB. Кэш маршрутов периодически очищается.

      Для администраторов RouterOS не сделали средств просмотра и управления Routing Cache, но при его можно отключить в [IP]->[Settings] .

      Данный механизм был удален из ядра linux 3.6, но в RouterOS до сих пор используется kernel 3.3.5, возможно Routing cahce — одна из причин.

      Диалог добавления маршрута

      Диалог добавления маршрута

      1. Подсеть для которой необходимо создать маршрут (по умолчанию: 0.0.0.0/0)
      2. IP шлюза или интерфейс на который будет отправлен пакет (может быть несколько, см. ниже ECMP)
      3. Проверка доступности шлюза
      4. Тип записи
      5. Дистанция (метрика) для маршрута
      6. Таблица маршрутизации
      7. IP для локальных исходящих пакетов через данный маршрут
      8. Про назначение Scope и Target Scope написано в конце статьи

      Флаги маршрутов
      airoivo1bmk3lgbqj hivpbjdyc

      • X — Маршрут отключен администратором ( disabled=yes )
      • A — Маршрут используется для передачи пакетов
      • D — Маршрут добавлен динамически (BGP, OSPF, RIP, MME, PPP, DHCP, Connected)
      • C — Подсеть подключена непосредственно к маршрутизатору
      • S — Статический маршрут
      • r,b,o,m — Маршрут добавлен одним из протоколов динамической маршрутизации
      • B,U,P — Фильтрующий маршрут (отбрасывает пакеты вместо передачи)

      Что указывать в gateway: ip-адрес или интерфейс?

      Система позволяет указывать и то, и другое, при этом не ругается и не дает подсказок, если вы что-то сделали неправильно.

      IP адрес
      Адрес шлюза должен быть доступен по Layer2. Для Ethernet это означает, что роутер должен иметь на одном из активных интерфейсов ip адрес из той же подсети, для ppp — что адрес gateway указан на одном из активных интерфейсов в качестве адреса подсети.
      Если условие доступности по Layer2 не выполняется — маршрут считается неактивным и не попадает в FIB.

      Интерфейс
      Все сложнее и поведение маршрутизатора зависит от типа интерфейса:

        PPP (Async, PPTP, L2TP, SSTP, PPPoE, OpenVPN*) соединение предполагает наличие только двух участников и пакет всегда будет направлен шлюзу для передачи, если шлюз обнаружит, что получателем является он сам, то передаст пакет своему локальному процессу.

      90

      i6 nnbyrlylq0jk6pqwefb 2qz8

      Старайтесь указывать ip адрес в качестве gateway всегда когда это возможно. Исключение — connected маршруты (создаются автоматически) и PPP (Async, PPTP, L2TP, SSTP, PPPoE, OpenVPN*) интерфейсы.

      OpenVPN не содержит PPP заголовка, но можно использовать имя OpenVPN интерфейса для создания маршрута.

      More Specific Route

      Основное правило маршрутизации. Маршрут описывающий более маленькую подсеть (с наибольшей маской подсети) имеет больший приоритет при принятии решения о маршрутизации пакета. Положение записей в таблице маршрутизации не имеет отношения к выбору — основное правило More Specific.

      smcyi9gkebkm8iq yjcbev8 vs0

      Все маршруты из указанной схемы активны (находятся в FIB), т.к. указывают на различные подсети и не конфликтуют между собой.

      Если один из шлюзов станет недоступным, связанный маршрут будет считаться неактивным (удален из FIB) и для пакетов будет производиться поиск из оставшихся маршрутов.

      Маршруту с подсетью 0.0.0.0/0 иногда придают особое значение и называют «Маршрут по умолчанию» (Default Route) или «Шлюз последней надежды» (gateway of last resort). На самом деле в нем нет ничего магического и он просто включает все возможные адреса IPv4, но данные названия хорошо описывают его задачу — он указывает на шлюз, куда пересылать пакеты для которых нет других, более точных, маршрутов.

      Максимально возможная маска подсети для IPv4 — /32, такой маршрут указывает на конкретный хост и может использоваться в таблице маршрутизации.

      Понимание More Specific Route является фундаментальным для любых устройств работающих с TCP/IP.

      Distance

      Дистанции (или Метрики) необходимы для административной фильтрации маршрутов до одной подсети доступной через несколько шлюзов. Маршрут с меньшей метрикой считается приоритетным и попадет в FIB. Если маршрут с меньшей метрикой перестанет быть активным, то в FIB он будет заменен на маршрут с большей метрикой.

      Если присутствует несколько маршрутов до одной подсети с одинаковой метрикой, маршрутизатор добавить в таблицу FIB только один из них, руководствуясь своей внутренней логикой.

      Метрика может принимать значение от 0 до 255:

      rhfkj1shnnjhqmvwhcc7o0itq8i

      • 0 — Метрика для подключенных (connected) маршрутов. Дистанция 0 не может быть выставлена администратором
      • 1-254 — Метрики доступные администратору для установки маршрутам. Метрики с меньшим значением имеют больший приоритет
      • 255 — Метрика доступная администратору для установки маршрутам. В отличии от 1-254, маршрут с метрикой 255 всегда остается неактивным и не попадает в FIB
      • Особые метрики. У маршрутов полученных от протоколов динамической маршрутизации, есть стандартные значения метрик

      Check gateway

      Check gateway — расширение MikroTik RoutesOS для проверки доступности шлюза по icmp или arp. Раз в 10 секунд (изменить нельзя) на шлюз отправляется запрос, если дважды не приходит ответ маршрут считается недоступным и удаляется из FIB. Если check gateway отключил маршрут проверки продолжается и маршрут снова станет активным после одной успешной проверки.

      Check gateway отключает запись, в которой он настроен и все остальные записи (во всех таблицах маршрутизации и ecmp маршрутах) с указанным шлюзом.

      В целом check gateway работает нормально, если не возникает проблем с потерей пакетов до шлюза. Check gateway не знает, что происходит со связью за пределами проверяемого шлюза, для этого необходимы дополнительные инструменты: скрипты, рекурсивная маршрутизация, протоколы динамической маршрутизации.

      Большинство VPN и туннельных протоколов содержат встроенные средства для проверки активности соединения, включать для них check gateway — это дополнительная (но очень маленькая) нагрузка на сеть и производительность устройства.

      ECMP маршруты

      Equal-Cost Multi-Path — отправка пакетов до получателя используя одновременно несколько шлюзом с перебором по алгоритму Round Robin.

      ECMP маршрут создается администратором, путем указания нескольких gateway для одной подсети (либо автоматический, при наличии двух равноценных маршрутов OSPF).

      4vgzyh240kmasdj186yz2c3ovws

      ECMP используется для балансировки нагрузки между двумя каналами, в теории, если в ecmp маршруте два канала, то для каждого пакета исходящий канал должен отличаться. Но механизм Routing cache отправляет пакеты из соединения по маршруту, которым пошел первый пакет, в итоге получаем подобие балансировки на базе соединений (per-connection loading balancing).

      Если отключить Routing Cache, то пакеты в ECMP маршруте будут делиться правильно, но возникает проблема с NAT. Правило NAT обрабатывает только первый пакет из соединения (остальные обрабатываются автоматически) и получается ситуация, что с различных интерфейсов уходят пакеты с одним адресом источника.

      gjcwblj73dmsczyhyqyuchcpdw0

      В ECMP маршрутах не работает check gateway (баг RouterOS). Но можно обойти это ограничение, если создать дополнительные маршруты для проверки, которые будут отключать записи в ECMP.

      Фильтрация средствами Routing

      Опция Type определяет, что сделать с пакетом:

      • unicast — отправить на указанный шлюз (интерфейс)
      • blackhole — отбросить пакет
      • prohibit, unreachable — отбросить пакет и отправить icmp сообщение отправителю

      Фильтрацию обычно используют, когда нужно обезопасить отправку пакетов не по тому пути, конечно можно фильтровать подобное через firewall.

      Пара примеров

      Для закрепления базовых вещей о маршрутизации.

      Типичный домашний роутер

      1. Статический маршрут до 0.0.0.0/0 (default route)
      2. Connected маршрут на интерфейсе с провайдером
      3. Connected маршрут на интерфейсе с локальной сетью

      Типичный домашний роутер с PPPoE

      imwn8pafrqins6erowkhiek2dqa

      1. Статический маршрут до default route, добавлен автоматически т.к. это указано в свойствах подключения
      2. Connected маршрут для PPP соединения
      3. Connected маршрут на интерфейсе с локальной сетью

      Типичный домашний роутер с двумя провайдерами и резервированием

      wq2av0eskridghrj9yroknjz76o

      1. Статический маршрут до default route через первого провайдера с метрикой 1 и проверкой доступности шлюза
      2. Статический маршрут до default route через второго провайдера с метрикой 2
      3. Connected маршруты

      Трафик до 0.0.0.0/0 идет через 10.10.10.1, пока данный шлюз доступен, иначе переключается на 10.20.20.1

      Такую схему можно считать резервированием канала, но она не лишена недостатков. Если произойдет обрыв за пределами шлюза провайдера (например внутри операторской сети), ваш роутер об этом не узнает и продолжит считать маршрут активным.

      Типичный домашний роутер с двумя провайдерами, резервированием и ECMP

      unfjawyzmjdzo6 ekmmg93vlsk8

      1. Статические маршруты для проверки chack gateway
      2. Маршрут ECMP
      3. Connected маршруты

      Маршруты для проверки синего цвета (цвет неактивных маршрутов), но это не мешает работе check gateway. В текущей версии (6.44) RoS автоматический приоритет отдается ECMP маршруту, но лучше добавить проверочные маршруты в другие таблицы маршрутизации (опция routing-mark )

      На Speedtest и прочих подобных сайтах прироста скорости не будет (ECMP делит трафик по соединениям, а не по пакетам), но p2p приложения должны загружать быстрее.

      Фильтрация через Routing

      1. Статический маршрут до default route
      2. Статический маршрут до 192.168.200.0/24 через ipip туннель
      3. Запрещающий статический маршрут до 192.168.200.0/24 через маршрутизатор провайдера

      Вариант фильтрации при которой туннельный трафик не уйдет на маршрутизатор провайдера при отключении ipip интерфейса. Подобные схемы требуются редко, т.к. можно реализовать блокировку через firewall.

      Routing Loop
      Петля маршрутизации — ситуация когда пакет бегает между маршрутизаторами до истечения ttl. Обычно является следствием ошибки конфигурации, в больших сетях лечится внедрением протоколов динамической маршрутизации, в маленьких — внимательностью.

      Выглядит это примерно так:

      iih8 vpacnim4b6flslcvy v0eg

      Пример (наипростейший) как получить подобный результат:

      Пример с Routing loop не имеет практического применения, но он показывает что маршрутизаторы понятия не имеют о таблице маршрутизации своих соседей.

      Policy Base Routing и дополнительные таблицы маршрутизации

      При выборе маршрута, роутер использует только одно поле из заголовка пакета (Dst. Address) — это базовая маршрутизация. Маршрутизация на базе других условий, например адреса источника, типа трафика (ToS), балансировка без ECMP, относится к Policy Base Routing (PBR) и использует дополнительные таблицы маршрутизации.

      cf31fjsrsjd2aszbzkl hmg9wuw

      More Specific Route является основным правилом выбора маршрута, в пределах таблицы маршрутизации.

      По умолчанию все правила маршрутизации добавляются в таблицу main. Администратор может создать произвольное количество дополнительных таблиц маршрутизации и направлять пакеты в них. Правила в разных таблицах не конфликтуют между собой. Если пакет не нашел подходящего правила в указанной таблице, он уйдет в таблицу main.

      Пример с распределением через Firewall:

      uwndjzt8mtfett8l84vg n65p90

      • 192.168.100.10 -> 8.8.8.8
        1. Трафик от 192.168.100.10 получает метку via-isp1 в [Prerouting|Mangle]
        2. На этапе Routing в таблице via-isp1 производится поиск маршрута до 8.8.8.8
        3. Маршрут найден, трафик отправляется на шлюз 10.10.10.1
      • 192.168.200.20 -> 8.8.8.8
        1. Трафик от 192.168.200.20 получает метку via-isp2 в [Prerouting|Mangle]
        2. На этапе Routing в таблице via-isp2 производится поиск маршрута до 8.8.8.8
        3. Маршрут найден, трафик отправляется на шлюз 10.20.20.1
      • Если один из шлюзов (10.10.10.1 или 10.20.20.1) станет недоступным, то пакет уйдет в таблицу main и будет искать подходящий маршрут там

      Проблемы терминологии

      В RouterOS есть определенные проблемы с терминологией.
      При работе с правилами в [IP]->[Routes] указывается таблица маршрутизации, хотя и написано что метка:

      8ikhkhsxvmlwnh9hd9g

      В [IP]->[Routes]->[Rule] все правильно, в условии метки в действии таблицы:

      Как отправить пакет в определенную таблицу маршрутизации

      RouterOS дает несколько инструментов:

      • Правила в [IP]->[Routes]->[Rules]
      • Маршрутные метки ( action=mark-routing ) в [IP]->[Firewall]->[Mangle]
      • VRF

      Правила [IP]->[Route]->[Rules]
      Правила обрабатываются последовательно, если пакет совпал с условиями правила он не проходит дальше.

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

      hgippyt0pgilh0l9zouqqqpbsoe

      Правила состоят из условий и действия:

      • Условия. Практически повторяют список признаков по которым пакет проверяется в FIB, отсутствует только ToS.
      • Действия
        • lookup — отправить пакет в таблицу
        • lookup only in table — запереть пакет в таблице, если маршрут не будет найден пакет не уйдет в таблицу main
        • drop — отбросить пакет
        • unreacheable — отбросить пакет с уведомлением отправителя

        В FIB трафик до локальных процессов обрабатывается в обход правил [IP]->[Route]->[Rules] :

        ykf4gt4ywwzgbklpyzlyulije8k

        Маркировка [IP]->[Firewall]->[Mangle]
        Маршрутные метки позволяют устанавливать шлюз для пакета используя практически любые условия Firewall:

        ladhorisauzv81cnmffmkjo6 hi

        Практически, потому что не все из них имеет смысл, а некоторые могут работать нестабильно.

        6b mom f6nde0zyuy mr62asho4

        Маркировать пакет можно двумя способами:

        • Сразу ставить routing-mark
        • Сначала ставить connection-mark, потом на основе connection-mark ставить routing-mark

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

        Примеры использования

        Переходим к примерам использования Policy Base Routing, на них гораздо проще показать зачем все это нужно.

        MultiWAN и ответный исходящий (Output) трафик
        Распространенная проблема, при MultiWAN конфигурации: Mikrotik доступен из сети интернет только по «активному» провайдеру.

        ob1pph0eph9qvz9nqvt759mptiq

        Роутеру не важно на какой ip пришел запрос, при генерации ответа он будет искать маршрут в таблице маршрутизации, где активен маршрут через isp1. Дальше такой пакет скорее всего будет отфильтрован по пути до получателя.

        Еще один интересный момент. Если на интерфейсе ether1 настроен «простой» source nat: /ip fi nat add out-interface=ether1 action=masquerade пакет уйдет в сеть с src. address=10.10.10.100, что еще больше усугубит ситуацию.

        Исправить проблему можно нескольким способами, но для любого из них потребуются дополнительные таблицы маршрутизации:

        g965vychbnzbsksplywfc3npi90

        Использование [IP]->[Route]->[Rules]
        Указываем таблицу маршрутизации которая будет использована для пакетов с указанными Source IP.

        Можно использовать action=lookup , но для локального исходящего трафика указанный вариант полностью исключает соединения с неправильного интерфейса.

        • Система генерирует ответный пакет с Src. Address: 10.20.20.200
        • На этапе Routing Decision(2) происходит проверка [IP]->[Routes]->[Rules] и пакет отправляется в таблицу маршрутизации over-isp2
        • В соответствии с таблицей маршрутизации пакет должен быть отправлен на шлюз 10.20.20.1 через интерфейс ether2

        k

        Данный способ не требует рабочий Connection Tracker, в отличии от использования таблицы Mangle.

        Использование [IP]->[Firewall]->[Mangle]
        Соединение начинается со входящего пакета, поэтому маркируем его ( action=mark-connection ), для исходящих пакетов от маркированного соединения устанавливаем маршрутную метку ( action=mark-routing ).

        lg4vni1mt8eteade7mcitz 3s3g

        Если на одном интерфейсе настроено несколько ip, можно добавить в условие dst-address для уточнения.

        • На интерфейс ether2 поступает пакет открывающий соединение. Пакет попадает в [INPUT|Mangle] где говорится маркировать все пакеты из соединения как from-isp2
        • Система генерирует ответный пакет с Src. Address: 10.20.20.200
        • На этапе Routing Decision(2) пакет в соответствии с таблицей маршрутизации отправляется на шлюз 10.20.20.1 через интерфейс ether1. Можете убедиться в этом залогировав пакеты в [OUTPUT|Filter]
        • На этапе [OUTPUT|Mangle] происходит проверка на наличие метки соединения from-isp2 и пакет получает маршруткую метку over-isp2
        • На этапе Routing Adjusment(3) происходит проверка на наличие маршрутной метки и отправка в соответствующую таблицу маршрутизации
        • В соответствии с таблицей маршрутизации пакет должен быть отправлен на шлюз 10.20.20.1 через интерфейс ether2

        rdmrqst9dam9m7r9s4jsnudwdly

        MultiWAN и ответный dst-nat трафик

        Пример посложнее, что делать если за роутером находится сервер (например web) в частной подсети и необходимо обеспечить доступ к нему по любому из провайдеров.

        Суть проблемы будет та же, решение похоже на вариант с Firewall Mangle, только будут использоваться другие цепочки:

        На схеме не отображен NAT, но думаю и так все понятно.

        MultiWAN и исходящие соединения

        Можно использовать возможности PBR для создания нескольких vpn (в примере SSTP) соединений с разных интерфейсов роутера.

        ptjgm36vdijiuvygzwl8csvwg5q

        Дополнительные таблицы маршрутизации:

        Простые правила NAT, иначе пакет уйдет с интерфейса с неправильным Src. Address:

        • Роутер создает три процесса SSTP
        • На этапе Routing Decision (2) для данных процессов выбирается маршрут, исходя из таблицы маршрутизации main. От этого же маршрута пакет получает Src. Address привязанный к интерфейсу ether1
        • В [Output|Mangle] пакеты от разных соединений получают разные метки
        • Пакеты попадают в соответствующие меткам таблицы на этапе Routing Adjusment и получает новый маршрут для отправки пакетов
        • Но у пакетов все еще остается Src. Address от ether1, на этапе [Nat|Srcnat] адрес подменяется в соответствии с интерфейсом

        Интересно, что на роутере вы увидите следующую таблицу соединений:

        Connection Tracker отрабатывает раньше [Mangle] и [Srcnat] , поэтому все соединения идут от одного адреса, если посмотреть подробнее то в Replay Dst. Address будут адреса после NAT:

        На VPN сервере (на тестовом стенде он у меня один) можно увидеть что все соединения происходят с правильных адресов:

        s7ncjzninvkxn a6 p3wdd5ywnw

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

        Но такие маршруты будут влиять не только на исходящий но и на транзитный трафик. Плюс, если вам не нужно чтобы трафик на vpn сервера уходил через неподходящие каналы связи, то придется добавить еще 6 правил в [IP]->[Routes] с type=blackhole . В предыдущем варианте — 3 правила в [IP]->[Route]->[Rules] .

        Распределение соединений пользователей по каналам связи

        Простые, повседневные задачи. Опять же понадобятся дополнительные таблицы маршрутизации:

        Используя [IP]->[Route]->[Rules]

        m4ojve7wspajkjoc00afbpsbru

        Если использовать action=lookup , то при отключении одного из каналов трафик уйдет в таблицу main и пойдет по рабочему каналу. Нужно это или нет — зависит от задачи.

        Используя маркировки в [IP]->[Firewall]->[Mangle]

        Простой пример со списками ip адресов. В принципе можно использовать практически любые условия. Единственное предостережение layer7, даже в паре с метками соединений, может показаться что всё работает правильно, но часть трафика всеравно уйдет не туда.

        u8k5yito7 iuseo5cki nhkaz5o

        «Запереть» пользователей в одной таблице маршрутизации можно через [IP]->[Route]->[Rules] :

        Либо через [IP]->[Firewall]->[Filter] :

        Отступление про dst-address-type=!local
        Дополнительное условие dst-address-type=!local необходимо чтобы трафик от пользователей доходил до локальных процессов роутера (dns, winbox, ssh, …). Если к роутеру подключено несколько локальных подсетей, необходимо предусмотреть чтобы трафик между ними не уходил в интернет, например используя dst-address-table .

        В примере с использованием [IP]->[Route]->[Rules] подобных исключений нет, но трафик до локальных процессов доходит. Дело в том, что попадая в FIB пакет промаркированный в [PREROUTING|Mangle] имеет маршрутную метку и уходит в таблицу маршрутизации отличную от main, где нет локального интерфейса. В случае с Routing Rules, сначала проверяется предназначен ли пакет локальному процессу и только на этапе User PBR он уходит в заданную таблицу маршрутизации.

        Используя [IP]->[Firewall]->[Mangle action=route]
        Данное действие работает только в [Prerouting|Mangle] и позволяет направлять трафик на указанный шлюз без использования дополнительных таблиц маршрутизации, указывая адрес шлюза напрямую:

        Действие route имеет более низкий приоритет чем правила маршрутизации ( [IP]->[Route]->[Rules] ). В случае с маршрутными метками все зависит от положения правил, если правило с action=route стоит выше чем action=mark-route , то будет использовано оно (вне зависимости от флага passtrough ), иначе маркировка маршрута.
        На wiki очень мало информации про данное действие и все выводы получены эксперементальным путем, в любом случае я не нашел варианты когда применение данного варианта дает приимущества перед другими.

        Динамическая балансировка на основе PPC

        Per Connection Classificator — является более гибким аналогом ECMP. В отличии от ECMP делит трафик по соединениям более строго (ECMP ничего про соединения не знает, но в паре с Routing Cache получается нечто похожее).

        PCC берет указанные поля из ip заголовка, преобразует их в 32-битное значение и делит на знаменатель. Остаток от деления сравнивается с указанным остатком и если они совпадают, то применяется указанное действие. Подробнее. Звучит дико, но работает.

        Пример с тремя адресами:

        Пример динамического распределения трафика по src.address между тремя каналами:

        При маркировке маршрутов есть дополнительное условие: in-interface=br-lan , без него под action=mark-routing попадет ответный трафик из интернета и в соответствии с таблицами маршрутизации уйдет обратно к провайдеру.

        Переключение каналов связи

        Check ping — хороший инструмент, но он проверяет связь только с ближайшим IP пиром, сети провайдеров обычно состоят из большого числа маршрутизаторов и обрыв связи может произойти за пределами ближайшего пира, а дальше идут магистральные операторы связи у которых тоже могут случаться проблемы, в общем check ping не всегда показывает актуальную информацию о доступе в глобальную сеть.
        Если у провайдеров и крупных корпораций есть протокол динамической маршрутизации BGP, то домашним и офисным пользователем приходится самостоятельно придумывать как проверять доступ в интернет через определенный канал связи.

        Обычно используются скрипты, которые через определенный канал связи проверяют доступность ip адреса в сети интернет, при этом выбирается что то надежное, например google dns: 8.8.8.8. 8.8.4.4. Но в сообществе Mikrotik для этого приспособили более интересный инструмент.

        Пара слов про рекурсивную маршрутизацию
        Рекурсивная маршрутизация необходима при построении Multihop BGP пиринга и в статью про основы статической маршрутизации попала только за счет ушлых пользователей MikroTik, которые придумали как использовать рекурсивный маршруты в паре с check gateway для переключение каналов связи без дополнительных скриптов.

        Пришло время в общих чертах разобраться с опциями scope/target scope и каким образом маршрут привязывается к интерфейсу:

        mkzawioocf0friubndc9q2pofw

        1. Маршрут ищет интерфейс для отправки пакета исходя из своего значения scope и всех записей в таблице main с меньшими или равными значениями target scope
        2. Из найденных интерфейсов выбирается тот, через который можно отправить пакет указанному шлюзу
        3. Интерфейс найденной connected записи выбирается для отправки пакета на шлюз

        При наличии рекурсивного маршрута происходит все тоже самое, но в два этапа:

        • 1-3 К connected маршрутам добавляется еще один, через который можно достичь указанного шлюза
        • 4-6 Поиск маршрута connected маршрута для «промежуточного» шлюза

        Все манипуляции с рекурсивным поиском происходят в RIB, а в FIB передается только итоговый результат: 0.0.0.0/0 via 10.10.10.1 on ether1 .

        Пример использования рекурсивной маршрутизации для переключения маршрутов

        f1gdhjwli1fqi4yk7i cfdyf2l0

        d8bbaepprp0wswv54ly0ryzphhc

        Можно проверить, что пакеты будут отправляться на 10.10.10.1:

        Check gateway ничего не знает про рекурсивную маршрутизацию и просто отправляет ping’и на адрес 8.8.8.8, который (исходя из таблицы main) доступен через шлюз 10.10.10.1.

        Если происходит потеря связи между 10.10.10.1 и 8.8.8.8, то происходит отключение маршрута, но пакеты (включая проверочные ping) до 8.8.8.8 продолжают идти через 10.10.10.1:

        hjv2tg5bnkaae2gyr7iunr74kt4

        Если происходит потеря линка на ether1, то получается неприятная ситуация, когда пакеты до 8.8.8.8 пойдут через второго провайдера:

        rt dadf8 ghn5pmgyg7q1ya258

        Это проблема, если вы используете NetWatch для запуска скриптов при недоступности 8.8.8.8. При обрыве линка NetWatch просто отработает по резервному каналу связи и будет считать что все нормально. Решается добавлением дополнительного фильтрующего маршрута:

        ks6ek3swyj9uyiih0bkbef1i6eu

        На хабре есть статья, где ситуация с NetWatch рассмотрена более детально.

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

        Пара слов про Virtual Routing and Forwarding (VRF)

        Технология VRF предназначена для создания нескольких виртуальных маршрутизаторов внутри одного физического, данная технология широко применяется у операторов связи (обычно в связке с MPLS) для предоставления услуги L3VPN клиентам с пересекающимися адресами подсетей:

        Но VRF в Mikrotik организован на базе таблиц маршрутизации и имеет ряд недостатков, например локальные ip адреса роутера доступны из всех VRF, подробнее можно почитать по ссылке.

        Пример конфигурации vrf:

        glg8k8isgjjsgyjodp7 rnqq5fi

        С устройства подключенного к ether2 видим, что проходит ping до адреса роутера из другого vrf (и это проблема), при этом ping в интернет не уходит:

        Для доступа в интернет необходимо прописать дополнительный маршрут обращающийся к таблице main (в терминологии vrf это называется route leaking):

        onp 5z4cvah erroi flwnjn2ik

        Тут показано два способа route leaking: используюя таблицу маршрутизации: 172.17.0.1@main и используя имя интерфейса: 172.17.0.1%wlan1 .

        И настроить маркировку для ответного трафика в [PREROUTING|Mangle] :

        gew3paz7vdzqkzc0 pt0mz5b6yg

        i8ddkxzzdogtht7gvzyo rzcr g

        ylvxkbg

        Правила маршрутизации для возвратного трафика:

        Добавление маршрутов полученных по dhcp в заданную таблицу маршрутизации
        VRF может быть интересен, если необходимо автоматически добавить динамический маршрут (например от dhcp client) в определенную таблицу маршрутизации.

        Добавление интерфейса в vrf:

        Правила для отправки трафика (исходящего и транзитного) через таблицу over-isp1:

        Дополнительный, фейковый маршрут для работы исходящей маршрутизции:

        Этот маршрут необходим только чтобы локальные исходящие пакеты могли пройти через Routing decision (2) до [OUTPUT|Mangle] и получить маршрутную метку, если на маршрутизаторе есть другие активные маршруты до 0.0.0.0/0 в таблице main оно не требуется.

        ffp

        Цепочки connected-in и dynamic-in в [Routing] -> [Filters]

        Фильтрация маршрутов (входящий и исходящих) — это инструмент который обычно используется вместе с протоколами динамической маршрутизации (поэтому доступен только после установки пакета routing), но во входящих фильтрах есть две интересные цепочки:

        • connected-in — фильтрация connected маршрутов
        • dynamic-in — фильтрация динамических маршрутов полученных PPP и DCHP

        Фильтрация позволяет не только отбрасывать маршруты, но и изменять ряд опций: distance, routing-mark, comment, scope, target scope, …

        Это очень точечный инструмент и если можете сделать что-то без Routing Filters (но не скриптами), то не используйте Routing Filters, не путайте себя и тех кто будет конфигурировать роутер после вас. В контексте динамической маршрутизации Routing Filters будут использоваться значительно чаще и продуктивнее.

        Установка Routing Mark для динамических маршрутов
        Пример с домашнего маршрутизатора. У меня настроено два VPN соединения и трафик в них должен заворачиваться в соответствием с таблицами маршрутизации. При этом я хочу что-бы маршруты создавались автоматически при активации интерфейса:

        Не знаю почему, наверное баг, но если создать vrf для ppp интерфейса, то маршрут до 0.0.0.0/0 всеравно попадет в таблицу main. Иначе всё было бы еще проще.

        Отключение Connected маршрутов
        Иногда требуется и такое:

        Access Services on the Router from VRF on RouterOS 6

        It is always a misconception that you can’t access services (management services like HTTP, WinBox or SNMP, and end-user services like SMB or DNS) from a VRF on RouterOS 6.x. In fact, you can, and here’s how you can achieve it.

        The Theory

        No service (except ICMP echo, if you count it as a service) on RouterOS 6.x is VRF aware. That means, the service daemons do listen on all the IPs on all the VRFs, but when they send a reply packet, the packet is only routed using the main (global) routing table. Depending on your routing table setup, the reply packet may or may not be routed to the client.

        To solve this problem, we simply leverage the connection tracking capability of iptables: let it remember which VRF the packet is coming from, then identify the reply packets of the same session and route them back using the correct routing table. This creates a symmetric packet flow similar to the default reverse route mode on the Juniper SRX.

        The Configuration

        First of all, delete all FastTrack rules (rules with the “fasttrack connection” action) from your firewall. The VRF on the RouterOS 6.x depends on every packet going through all the firewall rules, so if you have fasttrack rules, VRF itself won’t work at all.

        Enable connection tracking:

        Disable RP filter (uRPF):

        For every VRF that you want devices to access ports on the router, create an interface list to match all the interfaces you assigned to that VRF:

        For every VRF that you want devices to access ports on the router, create a pair of mangle rules:

        (Put these rules on the top of the mangle table before your other rules. Don’t modify the connection mark and the routing mark of these connections further.)

        Now you should have no problem accessing the ports on the router from that VRF.

        Notes

        Using VRF on RouterOS 6.x require disabling FastTrack which comes with some performance penalty. Connection tracking (enabled on factory settings) affects device performance too. Depending on your device and your use case, you might not want to use VRF.

        You only need to do this for VRFs with connected routes (i.e. ones that you have interfaces assigned to it). If you have VRFs used for creating routing table views and all packets are steered to it with rules, and it doesn’t have interfaces directly assigned to it, then you don’t need to set the mangle rules for it. The reason for this is trivial and is left as an exercise to the readers.

        Every time when you change the VRF’s assigned interfaces, remember to update the interface list as well!

        One caveat: MAC Telnet and MAC WinBox protocol is not a layer 2 protocol, it runs on layer 3 (IP broadcast), so it will be affected by VRF. If you don’t apply the settings above and add a port into a VRF, MAC Telnet and MAC WinBox will be inaccessible from that port. On the contrary, RoMON is pure layer 2 so it is not affected by VRF. If you cannot connect to the router after setting up VRF, try use another MikroTik router (or the free RouterOS VM) and connect with RoMON (if you have set up RoMON on the victim beforehand).

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *