L3 Маршрутизация: статика и динамика

Коммутатор (L2) знает, как доставить кадр внутри одной сети. Но как пакет попадает из сети 10.0.1.0/24 в сеть 10.0.99.0/24 на другом конце страны? Это работа маршрутизатора. Маршрутизация — сердце L3 и навык, который отличает «настроил по инструкции» от «понимаю, что происходит». Это фундаментальный модуль: на нём стоят следующие два — OSPF и BGP.

Что узнаешь

1. Что такое маршрутизация и зачем

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

Ключевой принцип: каждый роутер принимает решение независимо, hop-by-hop. Никто не знает весь путь целиком. Каждый знает только «куда передать дальше» (next-hop). Это как спрашивать дорогу: на каждом перекрёстке тебе говорят следующий поворот, а не весь маршрут до цели.

Hop-by-hop: пакет идёт от роутера к роутеру
Хост A 10.0.1.5 R1 TTL 64→63 R2 TTL 63→62 Хост B 10.0.99.7 «для 10.0.99.0/24 next-hop = R2» «10.0.99.0/24 подключена прямо» Каждый L3-хоп уменьшает TTL на 1. TTL=0 → пакет умирает (защита от петель).
Каждый роутер знает лишь следующий шаг. Полного пути не знает никто — и в этом сила и устойчивость IP.
MAC меняется, IP — нет. На каждом хопе L2-заголовок (src/dst MAC) переписывается заново — адреса соседних устройств на линке. А L3-адреса источника и назначения остаются неизменными до самого конца. Это разница между L2 (локально) и L3 (из конца в конец).

2. Как принимается решение: longest prefix match

В таблице может быть несколько записей, подходящих под адрес назначения. Роутер всегда выбирает самую специфичную — с самой длинной маской (longest prefix match, LPM). Чем длиннее префикс, тем «точнее» он описывает цель.

Пример. Пакет идёт на 10.0.99.7. В таблице:

МаршрутМаска (бит)Подходит?Выбор
0.0.0.0/0 (default)0да (под всё)
10.0.0.0/88да
10.0.99.0/2424дапобедитель
10.0.99.0/2626нет (.7 вне .0–.63? да, входит)зависит — см. ниже
10.0.50.0/2424нет

Уточнение по строке /26: 10.0.99.0/26 покрывает .0–.63, значит .7 в него входит. Тогда победил бы /26 — он ещё длиннее /24. Правило железобетонное: чем длиннее маска среди подходящих, тем выше приоритет. Default /0 используется только когда ничего более специфичного не нашлось — «маршрут последней надежды».

типичный вопрос на собесе «Есть 0.0.0.0/0 → R_A и 10.0.99.0/24 → R_B. Куда пойдёт пакет на 10.0.99.7?» — к R_B, потому что /24 длиннее /0. LPM всегда побеждает, маски сравниваются до метрик и AD.

Полный порядок выбора маршрута

LPM — только первый шаг. Полный алгоритм роутера такой:

Алгоритм выбора маршрута — три сита
Пакет на 10.0.99.7 — какой маршрут? Сито 1: Longest Prefix Match самая длинная подходящая маска. Уникальна? → конец. Сито 2: Administrative Distance если та же маска из разных протоколов — меньший AD Сито 3: Metric внутри одного протокола — меньшая метрика (равные → ECMP)
Сначала маска, потом доверие к источнику (AD), потом метрика. Перепутать порядок = неверный ответ на собесе.

3. Анатомия таблицы маршрутизации

Посмотрим на реальный вывод Cisco show ip route и разберём по частям:

R1# show ip route Codes: C - connected, S - static, O - OSPF, B - BGP, D - EIGRP, R - RIP L - local, * - candidate default, ia - OSPF inter area C 10.0.1.0/24 is directly connected, GigabitEthernet0/0 L 10.0.1.1/32 is directly connected, GigabitEthernet0/0 S 10.0.99.0/24 [1/0] via 10.0.12.2 O 10.0.50.0/24 [110/20] via 10.0.12.2, 00:14:21, Gi0/1 B 192.0.2.0/24 [20/0] via 203.0.113.1, 02:11:09 S* 0.0.0.0/0 [1/0] via 203.0.113.1

Разберём строку O 10.0.50.0/24 [110/20] via 10.0.12.2, 00:14:21, Gi0/1:

ЧастьЧто значит
OИсточник маршрута — выучен по OSPF (C=connected, L=local /32, S=static, B=BGP, D=EIGRP)
10.0.50.0/24Префикс назначения и его маска
[110/...]Administrative Distance — доверие к источнику (см. §6)
[.../20]Metric — «стоимость» пути внутри этого протокола
via 10.0.12.2Next-hop — кому передать пакет дальше
00:14:21Сколько времени маршрут в таблице (uptime)
Gi0/1Через какой интерфейс уходить (exit interface)
🌉 Мост в Linux: та же таблица есть на любом сервере — ip route show. Запись 10.0.50.0/24 via 10.0.12.2 dev eth0 — это ровно тот же next-hop + интерфейс. Сервер в облаке маршрутизирует по точно таким же правилам, просто без красивых кодов C/S/O.

4. RIB и FIB — то, что путают даже мидлы

То, что показывает show ip route — это RIB (Routing Information Base), «база знаний» управляющей плоскости (control plane). Сюда стекаются все маршруты от всех протоколов, здесь идёт выбор лучшего. Но пересылать каждый пакет, перебирая RIB, было бы медленно.

Поэтому из RIB выжимается FIB (Forwarding Information Base) — оптимизированная таблица для «железной» пересылки на полной скорости. На Cisco механизм называется CEF. FIB уже содержит готовый ответ: «для такого префикса — такой выходной интерфейс и такой MAC next-hop», без рекурсии в момент пересылки.

Control plane (RIB) против Data plane (FIB)
Control plane «думает» — CPU, протоколы OSPF BGP Static Connected RIB (show ip route) Data plane «пересылает» — ASIC, на полной скорости FIB / CEFпрефикс → интерфейс + MAC лучший маршрут →
RIB решает «что лучшее», FIB исполняет это для каждого пакета. Команда show ip cef показывает FIB.
❓ На собесе: «Маршрут в show ip route есть, а трафик не идёт. Где смотреть?»
Проверь FIB (show ip cef 10.0.99.0) — иногда RIB и FIB рассинхронились, или next-hop в FIB не разрезолвился в MAC (нет ARP/смежности). RIB ≠ гарантия пересылки.

5. Рекурсивный lookup и «маршрут есть, а не пингуется»

Когда у маршрута указан только next-hop IP (а не выходной интерфейс), роутер должен сначала выяснить: «а как добраться до самого next-hop?». Это рекурсивный lookup — ещё один поиск по таблице. Если next-hop никуда не резолвится — маршрут не установится, хотя ты его и прописал.

# next-hop only — нужен рекурсивный lookup до 10.0.12.2 R1(config)# ip route 10.0.99.0 255.255.255.0 10.0.12.2 # exit-interface + next-hop — самый надёжный способ (нет рекурсии, есть ARP-цель) R1(config)# ip route 10.0.99.0 255.255.255.0 GigabitEthernet0/1 10.0.12.2
классическая ловушка Указал только exit-interface на multi-access сети (Ethernet): ip route 10.0.99.0 255.255.255.0 Gi0/1. Роутер думает, что вся сеть 10.0.99.0/24 «прямо за интерфейсом», и шлёт ARP на каждый адрес — это «proxy-ARP ад». На Ethernet всегда указывай next-hop IP (или связку interface+next-hop).

6. Статическая маршрутизация

Статический маршрут — ты руками прописываешь: «для такой-то сети next-hop вот этот». Просто, предсказуемо, не ест CPU и трафик на протокол. Минус — не адаптируется: если линк упал, статика всё равно указывает туда (если не настроен tracking).

# Cisco: маршрут до конкретной сети R1(config)# ip route 10.0.99.0 255.255.255.0 10.0.12.2 # Default route — «всё неизвестное отправляй провайдеру» R1(config)# ip route 0.0.0.0 0.0.0.0 203.0.113.1 # Host route /32 — один конкретный адрес (часто для управления/loopback) R1(config)# ip route 8.8.8.8 255.255.255.255 203.0.113.1 # Null route — «выбросить трафик» (защита, blackhole для DDoS/мусора) R1(config)# ip route 192.168.66.0 255.255.255.0 Null0

Где статика реально уместна

Floating static route — резерв

Статике можно вручную задать AD выше, чем у основного маршрута. Тогда она «спит» и появляется в таблице, только если основной (например, OSPF) пропал. Это дешёвый backup-путь.

# AD = 200 — выше, чем OSPF (110). Используется только если OSPF-маршрут исчез R1(config)# ip route 10.0.99.0 255.255.255.0 10.0.13.2 200

Статика + tracking — чтобы не было чёрных дыр

Проблема статики: интерфейс «up», но дальше по пути всё мертво — а статика всё равно шлёт туда. Решение — привязать маршрут к проверке доступности (IP SLA + object tracking): маршрут живёт, только пока пингуется цель.

R1(config)# ip sla 1 R1(config-ip-sla)# icmp-echo 203.0.113.1 R1(config)# ip sla schedule 1 start-time now life forever R1(config)# track 1 ip sla 1 reachability R1(config)# ip route 0.0.0.0 0.0.0.0 203.0.113.1 track 1

А что, если про одну и ту же сеть 10.0.99.0/24 роутер узнал двумя способами — например, и по OSPF, и по BGP? Метрики разных протоколов несравнимы (у OSPF — cost, у RIP — хопы). Поэтому роутер сначала сравнивает Administrative Distance — степень доверия к источнику. Меньше AD = больше доверия.

Иерархия доверия (Administrative Distance, Cisco)
меньше AD → выше доверие → ConnectedAD 0 StaticAD 1 eBGPAD 20 EIGRPAD 90 OSPFAD 110 IS-ISAD 115 RIPAD 120 iBGPAD 200 UnknownAD 255 = не использовать Сначала: longest prefix match (маска) Потом среди равных префиксов: меньший AD Потом внутри протокола: меньшая metric
Порядок выбора: префикс → AD → метрика. AD 255 означает «не верить, не ставить в таблицу».
не путай AD сравнивается только между разными протоколами одинакового префикса. LPM (длина маски) важнее AD: маршрут /24 по RIP (AD 120) победит /16 по OSPF (AD 110), потому что сначала сравнивается префикс.

AD можно менять — например, чтобы плавно мигрировать с одного протокола на другой:

# изменить AD всех маршрутов OSPF-процесса R1(config-router)# distance 95 # изменить AD конкретного статического (floating static) R1(config)# ip route 10.0.99.0 255.255.255.0 10.0.13.2 200

8. Динамическая маршрутизация — зачем

В сети из 3 роутеров статику ещё можно держать в голове. В сети из 300 — нет: при каждом изменении пришлось бы руками править десятки таблиц, а при падении линка сеть «легла» бы до прихода инженера. Протоколы динамической маршрутизации решают это: роутеры сами обмениваются информацией о сетях, считают лучшие пути и перестраиваются автоматически за секунды, когда топология меняется (это называется convergence — сходимость).

Статика

  • Полный контроль и предсказуемость
  • Ноль нагрузки на CPU/линк
  • Нет рисков протокольных атак
  • Не адаптируется к сбоям
  • Не масштабируется
  • Ошибки человека = чёрные дыры

Динамика

  • Авто-перестройка при сбоях
  • Масштабируется на тысячи сетей
  • Балансировка по путям (ECMP)
  • Сложнее, ест ресурсы
  • Нужно понимать и дебажить
  • Требует защиты (auth, фильтры)

IGP против EGP — главное деление

Все протоколы делятся на две категории по зоне ответственности:

IGP внутри AS · BGP между AS
AS 65001 — твоя сеть (IGP: OSPF) R1 R2 R3 AS 65002 — провайдер (IGP: IS-IS) R4 R5 eBGP Внутри облака AS — IGP. На стыке двух AS — BGP с политиками.
IGP оптимизирует путь внутри организации. BGP связывает организации и рулит политикой в масштабе интернета.

9. RIP / EIGRP / OSPF / IS-IS / BGP — когда что

ПротоколТипКак считаетГде сегодня
RIPIGP, distance-vectorХопы (макс 15)Legacy. Учить для общего понимания, в проде почти нет.
EIGRPIGP, advanced DVComposite (BW+delay)Только Cisco. Жив в чисто-Cisco-сетях. Быстрая сходимость.
OSPFIGP, link-stateCost (по полосе)Стандарт де-факто для enterprise. Открытый. Учи глубоко.
IS-ISIGP, link-stateCost (metric)Операторы и крупные ДЦ. Похож на OSPF, лучше масштабируется.
BGPEGP, path-vectorПолитики (атрибуты)Клей интернета. И всё чаще — внутри ДЦ (EVPN). Учи глубоко.

Distance-vector против link-state

Distance-vector (RIP, EIGRP) — «слухи от соседей»: роутер верит тому, что рассказали соседи, и не видит топологию целиком. Отсюда медленная сходимость и риск петель (борются split-horizon, poison reverse). Link-state (OSPF, IS-IS) — каждый роутер строит у себя полную карту сети и сам считает кратчайшие пути (алгоритм Дейкстры). Поэтому link-state сходится быстрее и устойчивее к петлям.

Две философии: «слухи» против «полной карты»
Distance-vector A B «до сети X — 3 хопа» A верит B на слово. Карты нет, медленно, риск петель. Link-state У каждого — полная карта. Сам считает Дейкстру.
Link-state дороже по ресурсам, но быстрее сходится и предсказуемее — поэтому OSPF/IS-IS правят в enterprise.
Что учить на практике: 🟢 OSPF и 🟢 BGP — это 90% реальных сетей и собеседований, им посвящены отдельные модули 6 и 7. RIP — понять идею distance-vector. EIGRP — знать, что есть (если попадёшь в Cisco-only сеть). IS-IS — «знаю, чем похож на OSPF».

10. ECMP — несколько путей одновременно

Если до одной сети есть два равноценных пути (одинаковый AD и одинаковая метрика), роутер может использовать оба сразу — это Equal-Cost Multi-Path. Пропускная способность складывается, а при падении одного линка трафик мгновенно идёт по второму.

R1# show ip route 10.0.99.0 O 10.0.99.0/24 [110/20] via 10.0.12.2, Gi0/1 # путь 1 via 10.0.13.2, Gi0/2 # путь 2 — ECMP, оба активны

Как именно балансируется — per-flow, не per-packet

Важная деталь: трафик раскидывается по потокам (flow), а не по пакетам. Роутер берёт хеш от набора полей (src/dst IP, часто + src/dst port) и по нему выбирает путь. Все пакеты одного TCP-соединения идут одним путём — иначе они бы переставлялись (reordering), и TCP решил бы, что это потери.

ECMP: хеш потока выбирает путь (пакеты потока не переставляются)
R1 hash(src,dst,ports) путь A путь B flow #1 → путь A (всегда) flow #2 → путь B (всегда) Один TCP-поток = один путь. Балансировка между потоками, не внутри.
Поэтому при двух линках 10G «одно тяжёлое соединение» не разгонится до 20G — оно живёт в одном потоке.

ECMP — фундамент дизайна современных дата-центров (Spine-Leaf): десятки равноценных путей между уровнями, трафик «размазан» по всем. Это та же идея, что и multipath в Linux (ip route ... nexthop ... nexthop ...).

11. Сценарий целиком: три роутера, статика + default

Соберём всё вместе. Топология: офис (R1) — ядро (R2) — выход в интернет (R3 → провайдер).

Топология сценария
LAN офиса10.0.1.0/24 R1офис R2ядро R3edge провайдер 10.0.12.0/30 10.0.23.0/30 203.0.113.0/30
Три роутера, P2P-линки /30, LAN офиса за R1. Цель: офис должен ходить в интернет.
# === R1 (офис) === R1(config)# interface gi0/0 R1(config-if)# ip address 10.0.1.1 255.255.255.0 # шлюз LAN R1(config)# interface gi0/1 R1(config-if)# ip address 10.0.12.1 255.255.255.252 # линк к R2 R1(config)# ip route 0.0.0.0 0.0.0.0 10.0.12.2 # всё наружу → R2 # === R2 (ядро) === R2(config)# ip route 10.0.1.0 255.255.255.0 10.0.12.1 # обратно в LAN офиса R2(config)# ip route 0.0.0.0 0.0.0.0 10.0.23.2 # наружу → R3 # === R3 (edge) === R3(config)# ip route 10.0.0.0 255.255.0.0 10.0.23.1 # вся внутренняя сеть ← R2 (суммарный) R3(config)# ip route 0.0.0.0 0.0.0.0 203.0.113.2 # default → провайдер
главный нюанс сценария Обрати внимание: на R3 есть обратный маршрут 10.0.0.0/16 ← R2. Без него пакет ИЗ офиса дошёл бы до провайдера, но ответ не нашёл бы дорогу назад к 10.0.1.5 — и «интернет не работает», хотя наружу пакеты уходят. Маршрутизация всегда двусторонняя.

12. Packet walk: что происходит с пакетом по пути

Хост 10.0.1.5 открывает 1.1.1.1. Пошагово:

  1. Хост видит: 1.1.1.1 не в моей /24 → шлю на default gateway 10.0.1.1 (R1). ARP узнаёт MAC R1.
  2. R1: LPM → подходит только 0.0.0.0/0 via 10.0.12.2. Переписывает dst MAC на R2, src MAC на свой, TTL 64→63, шлёт.
  3. R2: то же, 0.0.0.0/0 via 10.0.23.2 → R3. TTL 63→62.
  4. R3: 0.0.0.0/0 via 203.0.113.2 → провайдер. Тут же срабатывает NAT (см. модуль 10): src 10.0.1.5 → публичный IP.
  5. Ответ идёт обратно: провайдер → R3 → (по маршруту 10.0.0.0/16) R2 → (10.0.1.0/24) R1 → хост.
На каждом L3-хопе IP-адреса не меняются (кроме NAT на границе), а MAC и TTL меняются всегда. Если в traceroute видишь, на каком хопе пропал ответ — это и есть точка, где «follow the path» приводит к проблеме.

13. Мост в DevOps: маршрутизация, которую ты увидишь каждый день

Когда ты перейдёшь в DevOps, протоколы вроде OSPF трогать будешь редко, но сама модель маршрутизации останется ровно той же — и понимание из этого модуля станет твоим преимуществом:

# Linux: policy routing — два провайдера, разные таблицы $ ip route add default via 203.0.113.1 dev eth0 table 100 $ ip route add default via 198.51.100.1 dev eth1 table 200 $ ip rule add from 10.0.1.0/24 table 100 # эта подсеть — через провайдера 1 $ ip rule add from 10.0.2.0/24 table 200 # эта — через провайдера 2
🌉 Вот почему сеть — твой фундамент

DevOps-инженер без сетей видит «route table» в AWS как магию. Ты будешь видеть знакомую таблицу маршрутизации с longest prefix match и default route. Это и есть разница в зарплате.

14. Команды для практики

Cisco

R1# show ip route # вся RIB R1# show ip route 10.0.99.7 # какой маршрут выберется для этого IP R1# show ip cef 10.0.99.7 # FIB — как реально пересылается R1# show ip route static # только статические R1# show ip route summary # сколько маршрутов от каждого источника R1(config)# ip route 10.0.99.0 255.255.255.0 10.0.12.2 R1(config)# ip route 0.0.0.0 0.0.0.0 203.0.113.1 # default

Linux (то же самое на сервере)

$ ip route show # таблица маршрутизации $ ip route get 10.0.99.7 # какой путь выберет ядро для этого IP $ ip route add 10.0.99.0/24 via 10.0.12.2 # статический маршрут $ ip route add default via 203.0.113.1 # default gateway $ ip route add blackhole 192.168.66.0/24 # null-route в Linux $ ip route add 10.0.99.0/24 nexthop via 10.0.12.2 nexthop via 10.0.13.2 # ECMP

15. Вопросы с собеседования

❓ В чём разница между AD и метрикой?
AD выбирает между разными протоколами для одного префикса (степень доверия к источнику). Метрикавнутри одного протокола. Сравниваются только после longest prefix match.
❓ Что такое default route и когда «маршрут последней надежды» не сработает?
0.0.0.0/0 — куда слать всё, что не подошло под более специфичные маршруты. Не сработает, если стоит флаг ip routing отключён, или у самого default next-hop недостижим (рекурсия не разрешилась).
❓ Зачем floating static при наличии OSPF?
Как резерв на случай отказа динамики. Ставим AD выше, чем у OSPF (например 200); пока OSPF-маршрут жив, статика «спит» и не попадает в таблицу. Падает OSPF — поднимается статика.
❓ Пакет до 10.0.99.7. В таблице есть /16 по OSPF (AD 110) и /24 по RIP (AD 120). Что выберется?
/24 по RIP. LPM важнее AD: сначала самая длинная маска. AD сравнивают только при равной длине.

16. Частые ошибки джунов

ошибка 1 Забыл обратный маршрут. Прописал путь «туда», а ответный пакет некуда вернуться. Маршрутизация должна работать в обе стороны — проверяй маршрут до источника на дальнем роутере.
ошибка 2 Путает AD и метрику. AD выбирает между протоколами, метрика — внутри одного. И то, и другое — только после longest prefix match.
ошибка 3 Статика на нестабильный линк без tracking. Линк «мигает», но статика всё равно шлёт туда — получается чёрная дыра. На критичных статиках настраивай IP SLA / object tracking или бери floating static.
ошибка 4 Думает, что роутер знает весь путь. Нет: каждый роутер знает только next-hop. «Не доходит до цели» — значит, где-то дальше по пути у кого-то нет маршрута (часто — обратного). Иди по пути (follow-the-path).
ошибка 5 Только exit-interface на Ethernet. ip route X Y Gi0/1 на multi-access заставляет роутер ARP-ить каждый адрес сети. На Ethernet указывай next-hop IP.
Ключевое за этот урок