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

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

Заявка из очереди

«Заявка #43890. Филиал „Восток“ не видит новый сервер 10.42.1.170 в головном офисе: ping из филиала молчит. При этом старые серверы из той же стойки (10.42.1.10, 10.42.1.20) пингуются отлично. Сервер жив: айтишники филиала уже трижды его перезагрузили». Чувствуешь абсурд? Соседние адреса из одной стойки — одни ходят, один нет. Перезагрузка сервера тут не поможет: где-то на пути один из роутеров принимает другое решение для 10.42.1.170, чем для 10.42.1.10. Почему так бывает (спойлер: longest prefix match и забытая суммаризация), как найти виновный хоп за 5 минут — узнаешь в этом уроке и закроешь заявку в плейбуке.

Что узнаешь — после урока ты сможешь
Вспомни из прошлых модулей

Модуль 2: внутри сегмента кадр доставляет коммутатор по MAC, а IP→MAC решает ARP — маршрутизатору это понадобится на последнем шаге, чтобы вручить пакет получателю. Модуль 3: между VLAN трафик ходит только через L3 — вот этот L3 мы сегодня и разбираем. Модуль 4: подсети и маски — язык таблицы маршрутизации; если /26 и «магическое число» ещё не в подкорке, вернись, без них longest prefix match не почувствовать.

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.

17. Плейбук: «соседние адреса ходят по-разному» — закрываем заявку #43890

Возвращаемся к загадке: 10.42.1.10 и .20 из филиала пингуются, 10.42.1.170 — нет. Сервер жив. Ходим по пути, как учит follow-the-path:

Сформулируй, что именно различается
Не «сервер недоступен», а «пакеты до .170 умирают там, где пакеты до .10 проходят». Раз адреса соседние, а судьба разная — где-то на пути для них выбираются разные маршруты. Значит, в чьей-то таблице есть запись, «отрезающая» часть подсети. Это сразу отметает сервер, кабели и перезагрузки.
traceroute на оба адреса — сравни пути
traceroute 10.42.1.10 и traceroute 10.42.1.170 из филиала. До .10: филиал → WAN-роутер ГО → core → сервер. До .170: путь обрывается на core (или уходит в неожиданный хоп — например, на старый роутер тестовой зоны). Виновник — последний отвечающий хоп: у него для .170 другое решение.
Смотри таблицу виновника для ОБОИХ адресов
show ip route 10.42.1.10 → отвечает «10.42.1.0/24 via core». show ip route 10.42.1.170 → отвечает «10.42.1.160/27 via 10.99.0.2» — вот он, longest prefix match в действии: для .170 нашёлся более специфичный /27, указывающий на старый роутер лаборатории. Год назад блок .160–.191 отдавали под стенд, статику забыли убрать. LPM всегда выигрывает — /27 бьёт /24 независимо от AD и метрик.
Проверь обратный путь тоже
Прежде чем чинить, глянь с сервера: tracert до филиала. Помни главное правило: маршрутизация двусторонняя. Даже починив путь «туда», можно остаться без пути «обратно» (и симптом будет тот же). В нашем случае обратный путь в порядке — пакеты филиала просто не доезжали.
Убери причину, а не симптом
no ip route 10.42.1.160 255.255.255.224 10.99.0.2 на core — и .170 мгновенно доступен. Но не останавливайся: поищи ещё артефакты стенда (show run | include ip route), задокументируй в IPAM, что блок .160/27 вернулся в прод. Финальная запись в заявке: «Причина — устаревший статический маршрут /27 на core, перекрывавший часть серверной подсети по правилу LPM. Маршрут удалён, конфигурация проаудирована».

18. Мини-лаба: маршрутизация у тебя под рукой

Прочитай таблицу маршрутизации своего ПК
Windows: route print -4, Linux: ip route. Найди: default (0.0.0.0/0 через роутер), connected-сеть (твоя подсеть, без next-hop), loopback 127.0.0.0/8. У ПК с Wi-Fi и проводом одновременно увидишь метрики: Windows предпочтёт интерфейс с меньшей — вот и «AD и метрика» в миниатюре.
Устрой себе longest prefix match
Добавь host-маршрут для одного адреса: Windows (администратором): route add 1.1.1.1 mask 255.255.255.255 192.168.1.1 — теперь до 1.1.1.1 у тебя два маршрута: /32 и default /0. Пинг идёт? Смотри route print — выиграл /32 (LPM!). Теперь укажи заведомо мёртвый next-hop: route change 1.1.1.1 mask 255.255.255.255 192.168.1.253 — пинг умер, хотя default жив. Ты только что воспроизвёл заявку #43890 на своём столе. Уборка: route delete 1.1.1.1.
Пройди путь до любого сайта
tracert 8.8.8.8 / traceroute 8.8.8.8: первый хоп — твой роутер, дальше — сеть провайдера (возможно, 100.64.x.x — CGNAT из прошлого урока), потом магистраль. Каждый из этих хопов знает только «кому дальше» — никто не знает пути целиком. Звёздочки в середине при живом конце — не обрыв, а хоп, которому запретили отвечать на TTL-expired.
Посмотри на рекурсивный lookup в Linux
В WSL/Linux: ip route get 8.8.8.8 — ядро покажет готовое решение: «8.8.8.8 via 192.168.1.1 dev eth0 src 192.168.1.42». Это FIB-ответ: маршрут уже разрешён рекурсивно до интерфейса и src-адреса. Сравни с ip route (RIB-вид) — и разница RIB/FIB из раздела 4 станет осязаемой.

19. Словарик урока

ТерминПо-английскиСмысл в одну строку
Таблица маршрутизацииrouting table, RIBсписок «префикс → куда дальше»; роутер выбирает лучшее из известного
Правило длиннейшего префиксаlongest prefix match, LPMиз подходящих маршрутов побеждает самый специфичный; /27 бьёт /24 всегда
Следующий хопnext-hopадрес соседнего роутера, которому вручается пакет; полного пути не знает никто
RIB / FIBrouting / forwarding information baseRIB — «что лучшее» (control plane), FIB — «как пересылать» (data plane, CEF)
Маршрут по умолчаниюdefault route, 0.0.0.0/0куда слать всё, что не подошло точнее; обычно — к провайдеру
Статический маршрутstatic routeпрописан руками; надёжен, но не реагирует на аварии без tracking
Плавающая статикаfloating staticстатика с завышенной AD — резерв, просыпающийся при смерти динамики
Административная дистанцияadministrative distance, ADдоверие к источнику маршрута: connected 0, static 1, eBGP 20, OSPF 110…
Метрикаmetricсравнение путей внутри одного протокола (после LPM и AD)
IGP / EGPinterior/exterior gateway protocolвнутри автономной системы (OSPF, IS-IS) / между ними (BGP)
Вектор расстояния / состояние каналовdistance-vector / link-stateверю соседям на слово / строю полную карту и считаю Дейкстрой
Равноценные путиECMPнесколько маршрутов с равной ценой; поток «прибит» к пути хешем
Рекурсивный поискrecursive lookupnext-hop сам ищется по таблице, пока не найдётся интерфейс
Нулевой маршрутnull route / blackholeтрафик в никуда — защита от петель суммаризации и мусора
Иди по путиfollow the pathметод диагностики: traceroute → таблица каждого хопа → в обе стороны

20. Задачи на понимание

Задача 1. В таблице: 10.0.0.0/8 via A (OSPF, AD 110), 10.1.0.0/16 via B (RIP, AD 120), 10.1.2.0/24 via C (static, AD 1). Куда уйдёт пакет на 10.1.2.55? А на 10.1.9.9? А на 10.9.9.9?

10.1.2.55 → C (самый длинный /24; AD даже не смотрим). 10.1.9.9 → B (лучшее совпадение — /16; то, что у OSPF AD ниже, неважно — его префикс короче). 10.9.9.9 → A (только /8 подходит). Порядок всегда: LPM → AD → метрика.

Задача 2. Прописал ip route 0.0.0.0 0.0.0.0 203.0.113.1, но default в таблице не появился. Линк к провайдеру физически выключен. Почему маршрута нет и как сделать резервный default через LTE-модем (192.168.8.1), который включится сам?

Статика попадает в таблицу, только если next-hop разрешим: интерфейс к 203.0.113.1 лежит → рекурсивный lookup не удался → маршрут снят. Резерв: ip route 0.0.0.0 0.0.0.0 192.168.8.1 250 — floating static с AD 250. Пока основной default жив, резерв спит; умер линк — LTE-маршрут всплывает автоматически. (Для отказа, при котором линк «горит», а провайдер мёртв, — добавь IP SLA tracking.)

Задача 3. «Пингую сервер за три хопа — тишина. Traceroute доходит до последнего роутера, дальше звёздочки. На последнем роутере show ip route — маршрут до сервера есть, интерфейс up». Что проверишь следующим и почему именно это?

Обратный маршрут: на сервере (или его шлюзе) — есть ли путь к источнику пинга? Прямой путь доказан (traceroute доехал), значит, умирает ответ. Классика: серверу забыли прописать default gateway или на его шлюзе нет маршрута в сеть филиала. Правило: «не пингуется» = проверь ОБА направления; половина «загадок» — забытый обратный маршрут.

Задача 4. Между двумя ДЦ четыре равноценных линка (ECMP). Один толстый бэкап-поток занимает 9 Гбит/с и забил один линк, остальные три пустые. Почему балансировка «не работает» и что с этим делать?

ECMP балансирует per-flow: хеш от (src, dst, порты) прибивает поток к одному пути — иначе пакеты одного TCP-потока приходили бы вразнобой. Один слоновий поток = один линк, хоть их четыре. Решения: параллелить сам перенос (несколько TCP-сессий — например, многопоточный rsync/BBCP), или менять хеш-политику (L4-порты уже учитываются?), или таскать бэкапы в окно незагрузки. Это же явление увидишь в LAG из модуля 3.

Задача 5. Зачем на роутере-агрегаторе, суммаризирующем 10.20.0.0/16 наружу, держат маршрут 10.20.0.0/16 → Null0? Что случится без него, если внутренняя подсеть 10.20.55.0/24 упадёт?

Без null-route: пакет на мёртвую 10.20.55.9 приходит агрегатору, специфичного маршрута нет, но есть default наружу → пакет уходит обратно в сторону интернета → а там маршрут на 10.20/16 снова указывает на агрегатора → петля до истечения TTL, умноженная на весь мусорный трафик. Null0 — «дно»: всё, что попало в суммарный префикс, но не нашло живой специфики, тихо умирает на месте. Стандарт при любой суммаризации.

Задача 6. В Linux-контейнере ip route показывает only default via 169.254.1.1 dev eth0, и всё работает. Но 169.254.x.x — link-local, «немаршрутизируемый». Как это возможно?

Next-hop не обязан быть «маршрутизируемым» — он должен быть достижим на L2 через указанный интерфейс (ARP-резолвится). CNI-плагины (Calico и др.) вешают 169.254.1.1 на хостовую сторону veth и отвечают на ARP — контейнеру этого достаточно: пакет вручается хосту, дальше рулит таблица хоста. Отличная иллюстрация «маршрут — это указание НА соседа, а не описание пути».

Мост к следующему модулю

Статика хороша, пока роутеров три и линков пять. На двадцати роутерах каждая новая подсеть — это двадцать раз «зайди и пропиши», а каждая авария — ручная работа в три часа ночи. Пора отдать это машине: OSPF сам найдёт соседей, сам построит полную карту сети, сам посчитает кратчайшие пути алгоритмом Дейкстры и сам перестроится при обрыве — за секунды. Следующий модуль — как это работает под капотом: Hello-пакеты, LSA, области и цена интерфейса.