Теоретические основы и архитектура
Архитектура ядра оператора связи требует строгой и продуманной схемы адресации. Маршрутизаторы PE и P должны иметь стабильные виртуальные интерфейсы Loopback0 с маской /32. Адрес Loopback выполняет три критические роли: он служит уникальным Router-ID для IGP (OSPF/IS-IS), идентификатором LSR-ID для LDP/SR и адресом Next-Hop для сессий MP-BGP (VPNv4/VPNv6). Физические линки между маршрутизаторами ядра адресуются из отдельных приватных или публичных блоков с маской /30 или /31 (RFC 3021) для экономии адресов. Главное правило архитектуры SP: клиентские сети (LAN клиентов, префиксы VRF) НИКОГДА не должны попадать в IGP ядра! В IGP ядра должны находиться исключительно Loopback-адреса узлов и транзитные /30-линки ядра. Если физический линк между PE1 и P1 падает, IGP переключает трафик на резервный линк PE1-P2, а адрес Loopback0 остаётся доступным через альтернативный путь. Поэтому сессии iBGP/MP-BGP, привязанные к Loopback, переживают отказ линка (меняется только путь); LDP-сессия с соседом по упавшему линку закрывается вместе с его adjacency, а LSP перестраиваются через оставшиеся сессии.
Три роли одного /32
Loopback0 в SP-ядре - это не "ещё один интерфейс", а идентичность узла. Один и тот же адрес 10.255.0.1/32 одновременно служит: (1) router-id IGP (OSPF router-id, основа System-ID в IS-IS); (2) LSR-ID и transport address для LDP (сессия LDP поднимается по TCP/646 между transport-адресами, а Hello уходят на 224.0.0.2 по UDP/646); (3) источником и целью сессий iBGP/MP-BGP (update-source Loopback0) и next-hop для VPN-маршрутов. Пока в сети есть хоть один живой путь до /32, сессии и LSP не рвутся, даже если упал конкретный физический линк. Если же сессию привязать к адресу линка, падение этого линка гасит BGP и VPN, хотя резервный путь существует.
Маска /32 обязательна по двум причинам. Во-первых, LDP по умолчанию строит FEC по префиксам из RIB и ожидает точного совпадения: LSP до PE2 существует, только если в таблице есть именно 10.255.0.2/32. Во-вторых, суммаризация loopback-ов на границе зон (ABR, L1/L2) ломает точное совпадение, и LSP превращается в Untagged/No Label. Если ядро нужно делить на домены, для этого используют Seamless MPLS (BGP-LU, RFC 8277) или явные фильтры меток, а не суммаризацию IGP.
Что именно анонсирует IGP
OSPF анонсирует loopback как stub-линк в Router-LSA (Type 1). На Cisco loopback всегда объявляется как хост-маршрут /32 независимо от настроенной маски; на других платформах и в IS-IS (TLV 135 Extended IP Reachability) префикс уходит с той маской, что задана на интерфейсе, поэтому на Huawei и Junos ставьте /32 явно. Метрика loopback-а в Router-LSA: на Cisco 1, на Huawei 0, на Junos 0 для passive-интерфейса lo0. Отсюда разные метрики "до того же узла" на разных платформах - это нормально, пока сравниваются пути внутри одного вендора. В IS-IS loopback получает метрику интерфейса в TLV 135.
В IGP живут только две категории префиксов: loopback-и узлов и транзитные линки ядра. Клиентские сети, VRF-префиксы, адреса стыков PE-CE туда попадать не должны: они едут в MP-BGP. Нарушение этого правила раздувает LSDB, увеличивает время SPF и (на Cisco) приводит к выделению LDP-меток под каждый префикс IGP, потому что метки по умолчанию создаются для всех маршрутов в RIB. Junos по умолчанию анонсирует метки только для /32 loopback-ов (egress-policy), Huawei - только для хост-маршрутов (lsp-trigger host по умолчанию). На Cisco ограничение делается через mpls ldp label allocate global prefix-list или mpls ldp advertise-labels for.
Адресный план
Рабочая схема, масштабируемая до сотен узлов:
| Блок | Назначение | Примечание |
|---|---|---|
| 10.255.0.0/24 | Loopback0 узлов | .1-.10 PE, .11-.20 P, .100-.109 RR; один /32 на узел |
| 10.0.0.0/16 | P2P-линки ядра | по /31 на линк (RFC 3021) |
| 172.16.0.0/16 | стыки PE-CE (в VRF) | не анонсируются в IGP ядра |
| 2001:db8:ffff::/64 | IPv6 loopback-и | /128 на узел (пример из документационного блока) |
Для IPv6-линков используют /127 (RFC 6164): /64 на двухточечном линке оставляет окно для атак на кэш соседей (ND exhaustion). /31 экономит по два адреса на линк и исключает Network/Broadcast; Ethernet-линк с /31 всё равно надо переводить в point-to-point, иначе OSPF устроит выбор DR/BDR на двух узлах.
Router-ID и NET из loopback-а
Router-ID в OSPF - 32-битное число в форме IPv4, и оно должно быть уникальным в домене; дубликат router-id приводит к постоянному перевыпуску LSA двумя узлами и штормам SPF (на Cisco в лог попадает %OSPF-4-DUP_RTRID_NBR). Если router-id явно не задан, Cisco выбирает наибольший IP среди loopback-ов, иначе наибольший среди активных интерфейсов, и смена этого адреса молча меняет идентичность узла - поэтому router-id всегда задают руками. System-ID IS-IS - 6 байт; общепринято переписывать каждый октет loopback-а в три десятичные цифры и разбивать по 4 цифры: 10.255.0.1 -> 010.255.000.001 -> 0102.5500.0001, NET = 49.0001.0102.5500.0001.00 (AFI 49 - частное адресное пространство, 0001 - area, 00 - NSEL). Тогда по System-ID в show isis hostname и логах сразу видно, какой узел имеется в виду.