Маршрутизация - процесс выбора путей через сети для передачи пакетов от одного хоста к другому.
Как работает маршрутизация
Рассмотрим простой пример конфигурации, чтобы проиллюстрировать, как маршрутизация используется для передачи пакетов между двумя локальными сетями и в Интернет.
В этой конфигурации у нас есть несколько сетей:
- Две клиентские сети (192.168.2.0/24 и 192.168.1.0/24)
- Одна сеть для подключения маршрутизаторов (172.16.1.0/30), обычно называемая магистральной; последняя сеть (10.1.1.0/24) подключает наш маршрутизатор-шлюз (Router1) к интернету
/ip address add address=172.16.1.2/30 interface=ether1 add address=192.168.2.1/24 interface=bridge2
Маршрутизатор1 (шлюз), через который ether1 подключается к Интернету:
/ip address add address=10.1.1.2/24 interface=ether1 add address=172.16.1.1/30 interface=ether2 add address=192.168.1.1/24 interface=bridge1
Если мы, например, посмотрим на таблицу маршрутизации Router1, то увидим, что маршрутизатор знает только о напрямую подключенных сетях. На этом этапе, когда клиент из LAN1 пытается достичь клиента из LAN2 (192.168.2.0/24), пакет будет отброшен на маршрутизаторе, потому что пункт назначения неизвестен для этого маршрутизатора:
[admin@MikroTik] > /ip/route> print Flags: D - dynamic; X - disabled, I - inactive, A - active; C - connect, S - static, r - ri p, b - bgp, o - ospf, d - dhcp, v - vpn Columns: DST-ADDRESS, GATEWAY, Distance DST-ADDRESS GATEWAY D DAC 10.1.1.0/24 ether1 0 DAC 172.16.1.0/30 ether2 0 DAC 192.168.1.0/24 bridge1 0
Чтобы исправить это, нам нужно добавить маршрут, который говорит маршрутизатору, что такое следующее устройство в сети, чтобы достичь пункта назначения. В нашем примере следующим прыжком является Router2, поэтому нам нужно добавить маршрут с шлюзом, который указывает на подключенный адрес маршрутизатора 2:
[admin@MikroTik] > /ip route add dst-address=192.168.2.0/24 gateway=172.16.1.2 [admin@MikroTik] > /ip/route> print Flags: D - dynamic; X - disabled, I - inactive, A - active; C - connect, S - static, r - ri p, b - bgp, o - ospf, d - dhcp, v - vpn Columns: DST-ADDRESS, GATEWAY, Distance DST-ADDRESS GATEWAY D DAC 10.1.1.0/24 ether1 0 DAC 172.16.1.0/30 ether2 0 DAC 192.168.1.0/24 bridge1 0 0 AS 192.168.2.0/24 172.16.1.2
На этом этапе пакет из LAN1 будет успешно перенаправлен в LAN2, но мы еще не закончили. Маршрутизатор 2 не знает, как связаться с LAN1, поэтому любой пакет из LAN 2 будет отброшен на маршрутизатор 2.
Если мы снова посмотрим на схему сети, то ясно видно, что у Router2 есть только одна точка выхода. Можно с уверенностью предположить, что все другие неизвестные сети должны быть доступны через связь с Router1. Самый простой способ сделать это - добавить маршрут по умолчанию. Чтобы добавить маршрут по умолчанию, установите пункт назначения 0.0.0.0/0 или оставьте его пустым
/ip route add gateway=172.16.1.1
Как мы видели в примере конфигурации, существуют разные группы маршрутов в зависимости от их происхождения и свойств.
Информация о маршрутизации
RouterOS состоит из двух основных частей:
- FIB (Forwarding Information Base, База информации о пересылке), используется для принятия решений о пересылке пакетов. Он содержит копию необходимой информации о маршрутизации
- RIB (Routing Information Base, база данных маршрутизации) содержит все изученные префиксы от протоколов маршрутизации (подключенные, статические, BGP, RIP, OSPF)
Информационная база маршрутизации
Информационная база маршрутизации - это база данных, которая перечисляет записи для конкретных сетевых пунктов назначения и их шлюзов (адрес следующего устройства в пути или просто следующий прыжок). Такая запись в таблице маршрутизации называется маршрутом.
Прыжок происходит, когда пакет передается из одного сегмента сети в другой. По умолчанию все маршруты организованы в одной "основной" таблице маршрутизации. Возможно создание более одной таблицы маршрутизации, что мы обсудим далее в этой статье, но пока, ради простоты, предположим, что существует только одна "основная" таблица маршрутизации.
Таблица RIB содержит полную информацию о маршрутизации, включая статические маршруты и правила маршрутизации по политике, настроенные пользователем, информацию о маршрутизации, полученную от динамических протоколов маршрутизации (RIP, OSPF, BGP) и информацию о подключенных сетях. Ее цель - не просто хранить маршруты, но и фильтровать информацию о маршрутизации, чтобы рассчитать лучший маршрут для каждого префикса назначения, создавать и обновлять базу информации о пересылке и распространять маршруты между различными протоколами маршрутизации.
Подключенные маршруты
Подключенные маршруты представляют сеть, в которой хосты могут быть непосредственно достигнуты (прямое подключение к домену широковещательной передачи уровня 2). Эти маршруты создаются автоматически для каждой IP-сети, у которой есть хотя бы один включенный интерфейс, подключенный к ней (как указано в конфигурации /ip address или /ipv6 address). RIB отслеживает состояние подключенных маршрутов, но не изменяет их. Для каждого подключенного маршрута существует один элемент IP-адреса таким образом, что:
- Часть адреса dst-address подключенного маршрута равна сети элемента IP-адреса
- Часть сетевой маски dst-address подключенного маршрута равна части сетевой маски адреса элемента IP-адреса
- Шлюз подключенного маршрута равен фактическому интерфейсу элемента IP-адреса (тот же, что и интерфейс, за исключением портов моста) и представляет интерфейс, где можно достичь напрямую подключенных хостов из особого сети уровня 3
Предпочтительный источник больше не используется для подключенных маршрутов. FIB выбирает адрес источника на основе выходного интерфейса. Это позволяет создавать конфигурации, которые в ROS v6 и более ранних версиях считались недопустимыми. Смотрите примеры для получения дополнительной информации.
Маршрут по умолчанию
Маршрут по умолчанию используется, когда невозможно разрешить пункт назначения ни одним другим маршрутом в таблице маршрутизации. В RouterOS dst-address маршрута по умолчанию - это .0.0.0.0/0 (для IPv4) и ::/0 (для IPv6). Если таблица маршрутизации содержит активный маршрут по умолчанию, поиск в этой таблице никогда не завершится неудачей.
Обычно таблица маршрутизации домашнего роутера содержит только подключенные сети и один маршрут по умолчанию для пересылки всего исходящего трафика на шлюз Интернет-провайдера.
[admin@TempTest] /ip/route> print Flags: D - dynamic; X - disabled, I - inactive, A - active; C - connect, S - static, r - ri p, b - bgp, o - ospf, d - dhcp, v - vpn Columns: DST-ADDRESS, GATEWAY, Distance # DST-ADDRESS GATEWAY D DAd 0.0.0.0/0 10.155.125.1 1 DAC 10.155.125.0/24 ether12 0 DAC 192.168.1.0/24 vlan2 0
Multipath (ECMP) маршруты
Для реализации некоторых настроек, таких как балансировка нагрузки, может потребоваться использовать более одного пути к заданному пункту назначения.
Маршруты ECMP (Equal cost multi-path) имеют несколько значений шлюза (next-hop). Все достижимые следующие переходы копируются в FIB и используются для пересылки пакетов.
Эти маршруты можно создавать вручную, а также динамически с помощью любого из протоколов динамической маршрутизации (OSPF, BGP, RIP). Несколько одинаково предпочтительных маршрутов к одному и тому же пункту назначения будут иметь присвоенный флаг + и автоматически группироваться в RouterOS (см. пример ниже).
[admin@TempTest] /ip/route> print Flags: D - DYNAMIC; I - INACTIVE, A - ACTIVE; C - CONNECT, S - STATIC, m - MODEM; + - ECMP Columns: DST-ADDRESS, GATEWAY, DISTANCE # DST-ADDRESS GATEWAY D 0 AS+ 192.168.2.0/24 10.155.125.1 1 1 AS+ 192.168.2.0/24 172.16.1.2 1
Выбор маршрута
Может быть несколько маршрутов с одним и тем же пунктом назначения, полученных из различных протоколов маршрутизации и из статических конфигураций, но только один (лучший) пункт назначения может использоваться для пересылки пакетов. Чтобы определить лучший путь, RIB запускает алгоритм выбора маршрута, который выбирает лучший маршрут из всех кандидатов по пункту назначения.
Только маршруты, соответствующие следующим критериям, могут участвовать в процессе выбора маршрута:
- Маршрут не отключен
- Если тип маршрута однонаправленный, у него должен быть хотя бы один достижимый следующий переход (если шлюз из подключенной сети, и активный подключенный маршрут, шлюз считается достижимым)
- Маршрут не должен быть синтетическим
Маршрут-кандидат с наименьшим расстоянием становится активным маршрутом. Если есть более одного кандидатского маршрута с одинаковым расстоянием, выбор активного маршрута произволен.
Поиск следующего перехода
Поиск следующего перехода является частью процесса выбора маршрута. Его основная цель - найти непосредственно достижимый адрес шлюза (next-hop). Только после выбора действительного следующего перехода маршрутизатор знает, какой интерфейс использовать для пересылки пакетов.
Поиск следующего перехода становится сложнее, если маршруты имеют адрес шлюза, который находится на нескольких переходах от этого маршрутизатора (например, iBGP, multihop eBGP). Такие маршруты устанавливаются в FIB после того, как алгоритм выбора следующего перехода определяет адрес непосредственно достижимого шлюза (непосредственный следующий переход).
Необходимо ограничить набор маршрутов, которые могут использоваться для поиска непосредственных следующих переходов. Значения следующего перехода маршрутов RIP или OSPF, например, предполагается, что они непосредственно достижимы и должны искаться только с использованием подключенных маршрутов. Это достигается с помощью свойств scope и target-scope.
Маршруты с большим масштабом, чем максимально допустимое значение, не используются для поиска следующего перехода. Каждый маршрут указывает максимальное допустимое значение масштаба для его следующего перехода в свойстве target-scope. Значение по умолчанию этого свойства позволяет искать следующий переход только через подключенные маршруты, за исключением маршрутов iBGP, которые имеют большее значение по умолчанию и могут искать следующий переход также через IGP и статические маршруты.
Изменения в поиске следующего перехода в RouterOS v7.
Маршруты обрабатываются в порядке scope, и обновления маршрутов с большим масштабом не могут повлиять на состояние поиска следующего перехода для маршрутов с меньшим масштабом.
Рассмотрим пример из v6:
/ip route add dst-address=10.0.1.0/24 gateway=10.0.0.1 scope=50 target-scope=30 comment=A /ip route add dst-address=10.0.2.0/24 gateway=10.0.0.1 scope=30 target-scope=20 comment=B /ip route add dst-address=10.0.0.0/24 scope=20 gateway=WHATEVER comment=C
Шлюз 10.0.0.1 рекурсивно разрешается через C с использованием наименьшего ссылочного scope (scope 20 от маршрута B), оба маршрута активны. Теперь мы одновременно изменяем A и B:
/ip route set A target-scope=10
Внезапно, применяя обновление к маршруту A, шлюз маршрута B становится неактивным. Это потому, что в v6 есть только один объект шлюза на адрес. v7 хранит несколько объектов шлюза для каждого адреса, один для каждой комбинации области и проверки шлюза. Изменение target-scope или gateway-check маршрута в v7 не повлияет на другие маршруты, как в v6. В v7 target-scope и gateway-check являются свойствами, которые внутренне привязаны к шлюзу, а не к маршруту.
Хранение маршрутов
Информация о маршрутизации хранится так, чтобы занимать как можно меньше памяти в обычных случаях. Эти оптимизации имеют неочевидные худшие случаи и влияние на производительность.
Все маршруты и шлюзы хранятся в единой иерархии по префиксу/адресу.
Dst [4]/0 1/0+4 18 <-- number of prefixes ^ ^ ^ ^ ^ | | | | | | | | | \- bytes taken by Route distinguisher or Interface Id | | | \--- vrf/routing table | | \----- AFI | \------- netmask length of prefix \---------- bytes taken by prefix value [stuff subject to change without notice]
Каждый из этих 'Dst' соответствует уникальному 'dst-address' маршрута или адресу шлюза. Каждый 'Dst' также требует один или несколько объектов 'T2Node'. Все маршруты с одним и тем же 'dst-address' хранятся в Dst в списке, отсортированном по предпочтению маршрута.
Примечание: НАИХУДШИЙ ВАРИАНТ: наличие большого количества маршрутов с одним и тем же "dst-адресом" - это действительно медленно! даже если они неактивны! потому что обновление отсортированного списка с десятками тысяч элементов происходит медленно! Порядок маршрутов меняется только при изменении атрибутов маршрута. Если маршрут становится активным/неактивным, порядок не меняется.
У каждого маршрута есть три копии атрибутов маршрута:
- частные - что получено от пира, перед прохождением входных фильтров
- обновленные - что является результатом применения входных фильтров
- текущие - какие атрибуты в настоящее время используются маршрутом
Периодически (по мере необходимости) обновленные атрибуты рассчитываются из частных атрибутов. Это происходит при получении обновления маршрута или при обновлении входного фильтра.
Когда таблица маршрутизации пересчитывается, текущие атрибуты устанавливаются в значение из обновленных атрибутов.Это означает, что обычно, если нет входного фильтра, который изменяет атрибуты маршрута, частные, обновленные и текущие атрибуты имеют одно и то же значение.
Атрибуты маршрута хранятся в нескольких группах:
- Данные L1 - все флаги, список дополнительных свойств, as-path;
- Данные L2 - nexthops, RIP, OSPF, BGP метрики, теги маршрута, инициаторы и т. д.
- Данные L3 - расстояние, область, тип ядра, вещи MPLS
- Дополнительные свойства - сообщества, инициатор, идентификатор агрегатора, список кластеров, неизвестные
Наличие, например, многих различных комбинаций расстояния и области атрибутов маршрута будет использовать больше памяти!Сопоставление сообществ или as-path с использованием regexp будет кэшировать результат, чтобы ускорить фильтрацию. Каждое значение as-path или community имеет кэш для всех regexp, который заполняется по запросу результатами совпадения.
Примечание: НАИХУДШИЙ ВАРИАНТ: изменение атрибутов в "in-filter" заставит программу маршрутизации использовать больше памяти! Потому что "частные" и "обновленные" атрибуты будут разными! Наличие множества различных regexps сделает сопоставление медленным и будет использовать много памяти! Потому что каждое значение будет иметь кэш с тысячами записей!
Подробная информация об используемой памяти маршрутизационными протоколами может быть просмотрена в меню /routing stats memory
База данных пересылки информации
FIB (Forwarding Information Base) содержит копию информации, необходимой для пересылки пакетов:
- все активные маршруты
- правила политики маршрутизации
Каждый маршрут имеет свойство dst-address, которое указывает все адреса назначения, для которых этот маршрут может быть использован. Если есть несколько маршрутов, которые применяются к определенному IP-адресу, используется наиболее конкретный (с наибольшей маской подсети). Эта операция (поиск наиболее конкретного маршрута, который соответствует данному адресу) называется "поиск в таблице маршрутизации".
Только один лучший маршрут может быть использован для пересылки пакетов. В случаях, когда таблица маршрутизации содержит несколько маршрутов с одним и тем же dst-address, все одинаково лучшие маршруты объединяются в один ECMP маршрут. Лучший маршрут устанавливается в FIB и помечается как "активный".
Когда принимается решение о пересылке, используется дополнительная информация, такая как адрес источника пакета, это называется политикой маршрутизации. Политика маршрутизации реализована как список правил политики маршрутизации, которые выбирают разные таблицы маршрутизации на основе адреса назначения, адреса источника, исходного интерфейса и маркировки маршрутизации (может быть изменена правилами мангала брандмауэра) пакета.
Поиск в таблице маршрутизации
FIB использует следующую информацию из пакета для определения его места назначения:
- адрес источника
- адрес назначения
- исходный интерфейс
- марка маршрутизации
Возможные решения по маршрутизации:
- принять пакет локально
- отклонить пакет (либо молча, либо отправив ICMP-сообщение отправителю пакета)
- отправить пакет на конкретный IP-адрес на конкретном интерфейсе
Выполнить решение по маршрутизации:
- проверить, что пакет должен быть доставлен локально (адрес назначения - это адрес маршрутизатора)
- обработать неявные правила политики маршрутизации
- обработать правила политики маршрутизации, добавленные пользователем
- обработать неявное универсальное правило, которое ищет адрес назначения в "основной" таблице маршрутизации
- возвращенный результат - "сеть недоступна"
Результат решения по маршрутизации может быть:
- IP-адрес следующего узла + интерфейс
- точка к точке интерфейс
- местная доставка
- отклонить
- ICMP запрещено
- ICMP хост недоступен
- ICMP сеть недоступна
Правила, которые не соответствуют текущему пакету, игнорируются. Если у правила есть действие:
- удален или недоступен, то это возвращается в качестве результата процесса принятия решения по маршрутизации.
- поиск, то адрес назначения пакета ищется в таблице маршрутизации, указанной в правиле. Если поиск не удается (нет маршрута, соответствующего адресу назначения пакета), то FIB переходит к следующему правилу.
- только поиск, аналогично поиску, за исключением того, что поиск не удается, если ни один из маршрутов в таблице не соответствует пакету.
В противном случае:
- если тип маршрута - чёрная дыра, запретить или недоступно, то вернуть это действие в качестве результата решения по маршрутизации;
- если это подключенный маршрут или маршрут с интерфейсом в качестве значения шлюза, то вернуть этот интерфейс и адрес назначения пакета в качестве результата решения по маршрутизации;
- если у этого маршрута есть IP-адрес в качестве значения шлюза, то вернуть этот адрес и связанный интерфейс в качестве результата решения по маршрутизации;
- если у этого маршрута есть несколько значений следующего узла, то выберите одно из них по круговому методу.
Показ маршрута
В RouterOS у вас есть три меню для просмотра текущего состояния маршрутов в таблице маршрутизации:
- /ip route - список маршрутов IPv4 и основных свойств
- /ipv6 route - список маршрутов IPv6 и основных свойств
- /routing route - список всех маршрутов с расширенными свойствами
/routing route меню в настоящее время доступно только для чтения. Для добавления или удаления маршрутов следует использовать меню/ip(ipv6) route.
Пример вывода
[admin@MikroTik] /ip/route> print Flags: D - dynamic; X - disabled, I - inactive, A - active; C - connect, S - stati c, r - rip, b - bgp, o - ospf, d - dhcp, v - vpn Columns: DST-ADDRESS, GATEWAY, DIstance # DST-ADDRESS GATEWAY DI 0 XS 10.155.101.0/24 1.1.1.10 1 XS 11.11.11.10 D d 0.0.0.0/0 10.155.101.1 10 2 AS 0.0.0.0/0 10.155.101.1 1 3 AS + 1.1.1.0/24 10.155.101.1 10 4 AS + 1.1.1.0/24 10.155.101.2 10 5 AS 8.8.8.8 2.2.2.2 1 DAC 10.155.101.0/24 ether12 0 | ||| | | | | | ||| | | | \----Distance | ||| | | \--Configured gateway | ||| | \-- dst prefix | ||| \----- ECMP flag | ||\------- protocol flag (bgp, osf,static,connected etc.) | |\-------- route status flag (active, inactive, disabled) | \--------- shows if route is dynamic \----------- console order number (shown onli for static editable routes)
Вывод routing route очень похож на ip route, за исключением того, что он показывает маршруты из всех семейств адресов в одном меню и также перечисляет отфильтрованные маршруты.
[admin@MikroTik] /routing/route> print Flags: X - disabled, I - inactive, F - filtered, U - unreachable, A - active; c - connect, s - static, r - rip, b - bgp, o - ospf, d - dhcp, v - vpn, a - ldp-address, l - ldp-mapping Columns: DST-ADDRESS, GATEWAY, DIStance, SCOpe, TARget-scope, IMMEDIATE-GW DST-ADDRESS GATEWAY DIS SCO TAR IMMEDIATE-GW Xs 10.155.101.0/24 Xs d 0.0.0.0/0 10.155.101.1 10 30 10 10.155.101.1%ether12 As 0.0.0.0/0 10.155.101.1 1 30 10 10.155.101.1%ether12 As 1.1.1.0/24 10.155.101.1 10 30 10 10.155.101.1%ether12 As 8.8.8.8 2.2.2.2 1 254 254 10.155.101.1%ether12 Ac 10.155.101.0/24 ether12 0 10 ether12 Ic 2001:db8:2::/64 ether2 0 10 Io 2001:db8:3::/64 ether12 110 20 10 Ic fe80::%ether2/64 ether2 0 10 Ac fe80::%ether12/64 ether12 0 10 ether12 Ac fe80::%bridge-main/64 bridge-main 0 10 bridge-main A ether12 0 250 A bridge-main 0 250
routing route print detail показывает более продвинутую информацию, полезную для отладки.
[admin@MikroTik] /routing route> print detail Flags: X - disabled, I - inactive, F - filtered, U - unreachable, A - active; c - connect, s - static, r - rip, b - bgp, o - ospf, d - dhcp, v - vpn, a - ldp-address, l - ldp-ma> + - ecmp Xs dst-address=10.155.101.0/24 Xs d afi=ip4 contribution=best-candidate dst-address=0.0.0.0/0 gateway=10.155.101.1 immediate-gw=10.155.101.1%ether12 distance=10 scope=30 target-scope=10 belongs-to="DHCP route" mpls.in-label=0 .out-label=0 debug.fwp-ptr=0x201C2000 As afi=ip4 contribution=active dst-address=0.0.0.0/0 gateway=10.155.101.1 immediate-gw=10.155.101.1%ether12 distance=1 scope=30 target-scope=10 belongs-to="Static route" mpls.in-label=0 .out-label=0 debug.fwp-ptr=0x201C2000