Не секрет, что OSPF – протокол маршрутизации типа link-state: он собирает информацию о топологии, строит соответствующий граф и вычисляет кратчайший путь с помощью алгоритма Дийкстры. Информация о топологии включает в себя то, что и так понадобилось бы даже для вычисления маршрута ручкой на бумаге: узлы, их интерфейсы и подсети, а также набор дополнительных технических примочек (например, флагов). Для организации этих данных OSPF использует структуру под названием LSA – link-state advertisement. Алгоритм SPF так же широко известен, задание по его реализации можно найти в программе любого современного технического вуза.
Роли LSA довольно подробно разобраны в разных источниках: router LSA описывает узлы графа, network LSA предназначен для широковещательных сегментов сети, summary LSA обеспечивает взаимодействие разных зон между собой… Однако собрать эти структуры данных воедино в целостный граф кажется мне достаточно нетривиальной задачей. Безусловно, RFC является источником абсолютного знания в такого рода вопросах, но лично мне сравнительно долго не удавалось его полноценно осознать. В этой статье я хотел бы поделиться своим представлением о назначении типов LSA, а также процессом построения графа на основе LSDB.
Тестовая топология представлена ниже:
В этот раз я бы хотел последовательно настраивать OSPF с нуля, чтобы отслеживать влияние каждого изменения на LSDB и граф сети. Предварительный конфиг включает в себя только адресацию (R5 приведён в качестве примера):
R5(config)#interface Loopback0
R5(config-if)# ip address 5.5.5.5 255.255.255.255
R5(config)#interface FastEthernet0/1
R5(config-if)# ip address 192.168.45.5 255.255.255.0
R5(config-if)# no shutdown
LSA1: router LSA
Чтобы построить граф, нужно определиться, с чём мы всё-таки имеем дело. Согласно RFC 2328 секции 2.1, OSPF оперирует направленным графом: узлы отражают подсети и маршрутизаторы, а ребра – соединения между ними. OSPF использует вес (cost) исходящего интерфейса в качестве веса ребра (секция 2.1.2), так что граф – направленный взвешенный.
Создадим первый узел, соответствующий R1:
R1(config)#router ospf 1
R1#show ip ospf database
OSPF Router with ID (1.1.1.1) (Process ID 1)
В LSDB пока пусто, поскольку IOS требует хотя бы один активный с точки зрения OSPF интерфейс для инициализации процесса. Звучит разумно, однако такой подход не приближает нас к графу, который мог бы выглядеть так:
Порадуем IOS, добавив 1.1.1.1/32 в топологию:
R1(config)#router ospf 1
R1(config-router)#router-id 1.1.1.1
R1(config-router)#network 1.1.1.1 0.0.0.0 area 0
R1#
R1#show ip ospf database
OSPF Router with ID (1.1.1.1) (Process ID 1)
Router Link States (Area 0)
Link ID ADV Router Age Seq# Checksum Link count
1.1.1.1 1.1.1.1 21 0x80000001 0x00D055 1
Мы получили свой первый LSA1. Перед тем, как разбираться непосредственно с его содержанием, обратимся к формату:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| LS age | Options | 1 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Link State ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Advertising Router |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| LS sequence number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| LS checksum | length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0 |V|E|B| 0 | # links |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Link ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Link Data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | # TOS | metric |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| TOS | 0 | TOS metric |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Link ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Link Data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ... |
Заголовок LSA1 позволяет построить узел графа, соответствующий маршрутизатору, на основании поля Link State ID или же Advertising Router. Остальная часть LSA1 посвящена описанию подсетей (узлы графа) и соединений (ребра графа). OSPF различает 4 типа соединений:
точка-точка (point-to-point);
промежуточные (transit);
конечные (stub);
виртуальные (virtual).
Посмотрим, к какому типу относится 1.1.1.1/32:
R1#show ip ospf database router 1.1.1.1
OSPF Router with ID (1.1.1.1) (Process ID 1)
Router Link States (Area 0)
LS age: 55
Options: (No TOS-capability, DC)
LS Type: Router Links
Link State ID: 1.1.1.1
Advertising Router: 1.1.1.1
LS Seq Number: 80000001
Checksum: 0xD055
Length: 36
Number of Links: 1
Link connected to: a Stub Network
(Link ID) Network/subnet number: 1.1.1.1
(Link Data) Network Mask: 255.255.255.255
Number of MTID metrics: 0
TOS 0 Metrics: 1
1.1.1.1/32 – это конечное соединение, которое обычно соответствует префиксам конечных устройств. На уровне графа такая подсеть представляет собой лист, т.к. в ней подразумевается отсутствие OSPF-соседей. Вершина графа соединена с одним узлом маршрутизатора двумя ребрами, соответствующими каждому направлению.
Конечное соединение содержит в себе всю необходимую информацию для построения соответствующей части графа: подсеть, маску и исходящий вес (входящий вес ребра всегда равен нулю). Узел-маршрутизатор описан в заголовке LSA1 (LSID); однако соединение одной подсети с разными маршрутизаторами также допустимо, что позволяет реализовать ECMP.
Следующий тип соединения – точка-точка: он описывает подключение к другому маршрутизатору OSPF. Включим OSPF на R2, чтобы установить соседство на соединении R1-R2, используя вышеупомянутый тип:
R1(config)#interface f0/1
R1(config-if)#ip ospf network point-to-point
R1(config-if)#ip ospf 1 area 0
R2(config)#router ospf 1
R2(config-router)#router-id 2.2.2.2
R2(config)#interface f0/1
R2(config-if)#ip ospf network point-to-point
R2(config-if)#ip ospf 1 area 0
R1#show ip ospf database
OSPF Router with ID (1.1.1.1) (Process ID 1)
Router Link States (Area 0)
Link ID ADV Router Age Seq# Checksum Link count
1.1.1.1 1.1.1.1 41 0x8000001D 0x00B441 3
2.2.2.2 2.2.2.2 42 0x80000001 0x0055CC 2
Как и можно было ожидать, появился новый LSA1, описывающий R2. Обратите внимание на «странный» шаг изменения числа соединений: OSPF заработал на одном физическом интерфейсе, а число соединений увеличилось на 2 для каждого LSA1.
R1#show ip ospf database router 1.1.1.1
OSPF Router with ID (1.1.1.1) (Process ID 1)
Router Link States (Area 0)
LS age: 283
Options: (No TOS-capability, DC)
LS Type: Router Links
Link State ID: 1.1.1.1
Advertising Router: 1.1.1.1
LS Seq Number: 8000001D
Checksum: 0xB441
Length: 60
Number of Links: 3
Link connected to: a Stub Network
(Link ID) Network/subnet number: 1.1.1.1
(Link Data) Network Mask: 255.255.255.255
Number of MTID metrics: 0
TOS 0 Metrics: 1
Link connected to: another Router (point-to-point)
(Link ID) Neighboring Router ID: 2.2.2.2
(Link Data) Router Interface address: 192.168.12.1
Number of MTID metrics: 0
TOS 0 Metrics: 1
Link connected to: a Stub Network
(Link ID) Network/subnet number: 192.168.12.0
(Link Data) Network Mask: 255.255.255.0
Number of MTID metrics: 0
TOS 0 Metrics: 1
Один интерфейс с назначенным IP-адресом порождает 2 сущности: конечное соединение (в конце концов там тоже могут находиться адресуемые извне устройства) и соединение типа точка-точка, которая соответствует ребру графа между вершинами-маршрутизаторами. Узел-сосед обозначен с помощью ссылки на его LSID, чтобы с помощью пары LSA1 корректно описать двустороннюю связность между вершинами. Такая связность критична для ребра между узлами, хотя вес каждого из направлений может быть разным. Адрес маршрутизатора-соседа так же включен в описание соединения, чтобы впоследствии его использовать для построения локальной таблицы маршрутизации.
Веса соединений оставлены по умолчанию, так что граф теперь выглядит следующим образом:
Виртуальное соединение выходит за рамки этой статьи, поскольку оно относится к ad-hoc инструментам для тушения пожаров, а не к проверенным решениям в рамках продуманного дизайна. Впрочем, эта любопытная сущность может представлять интерес и сама по себе, так что если вы хотите копнуть поглубже, обратите внимание на эту статью Петра Лапухова.
Остался последний тип соединений – промежуточный (не путать с transit capability!).
LSA2: network LSA
Соединения точка-точка описывают непосредственную связь между маршрутизаторами, без промежуточных устройств. Однако в общем виде это не обязательно верно: посередине может оказаться широковещательный (например, Ethernet) или NBMA (например, DMVPN) сегмент. Впрочем, последний случай обычно можно свести к набору соединений точка-точка, что соответствует логической топологии hub-and-spoke.
Широковещательная среда, напротив, требует другого подхода, т.к. использование соединений точка-точка было бы неэффективно. Возьмём в качестве примера L2-сегмент между R2, R3 и R4. Очевидно, что не существует ребра, которое соединяло бы больше двух вершин. Количество соединений точка-точка в такой среде растёт как O(n2), что выражается в низкой масштабируемости решения за счёт увеличения нагрузки на CPU и RAM.
Впрочем, оптимизация довольно проста: нужно всего лишь… (это не то, о чём вы подумали) использовать псевдоузел вместо L2-сегмента, который соединён с каждым маршрутизатором этого сегмента. Такой подход позволяет уменьшить число сессий OSPF с O(n2) до O(n), что в итоге повышает масштабируемость решения. Маршрутизатор, отвечающий за псевдоузел, называется designated router (DR); вершина графа, соответствующая псевдоузлу, описана с помощью LSA2; ребро графа между вершинами и псевдоузлом определено промежуточным соединением из LSA1 и содержанием LSA2.
Настроим OSPF на R2, R3 и R4, оставив настройки типа соединения без изменений (по умолчанию – промежуточное).
R2(config)#interface f0/0
R2(config-if)#ip ospf 1 area 0
R3(config)#router ospf 1
R3(config-router)#router-id 3.3.3.3
R3(config)#interface f0/0
R3(config-if)#ip ospf 1 area 0
R4(config)#router ospf 1
R4(config-router)#router-id 4.4.4.4
R4(config)#interface f0/0
R4(config-if)#ip ospf 1 area 0
R2#show ip ospf neighbor
Neighbor ID Pri State Dead Time Address Interface
3.3.3.3 1 FULL/BDR 00:00:38 192.168.234.3 FastEthernet0/0
4.4.4.4 1 FULL/DR 00:00:35 192.168.234.4 FastEthernet0/0
1.1.1.1 0 FULL/ - 00:00:35 192.168.12.1 FastEthernet0/1
R2#
R2#show ip ospf database
OSPF Router with ID (2.2.2.2) (Process ID 1)
Router Link States (Area 0)
Link ID ADV Router Age Seq# Checksum Link count
1.1.1.1 1.1.1.1 538 0x80000022 0x00AA46 3
2.2.2.2 2.2.2.2 116 0x80000008 0x005804 3
3.3.3.3 3.3.3.3 118 0x80000002 0x004228 1
4.4.4.4 4.4.4.4 117 0x80000002 0x00045D 1
Net Link States (Area 0)
Link ID ADV Router Age Seq# Checksum
192.168.234.4 4.4.4.4 117 0x80000001 0x00F0B8
Как мы видим, LSA2 действительно создан R4 (4.4.4.4), кто является DR на данный момент. Упрощённо процесс выбора DR можно описать так:
составить список маршрутизаторов, участвующих в выборах (ненулевой приоритет);
выбрать наибольший приоритет;
выбрать наибольший RID.
Запасной DR (backup DR, BDR) проходит через тот же процесс согласования, что и DR, за одним важным исключением: избранный DR нельзя сместить до тех пор, пока не произойдёт отказ, тогда как роль BDR может переходить динамически к маршрутизатору с более приоритетными параметрами. DR отвечает за псевдоузел в графе, поэтому остальные участники сегмента синхронизуют с ним свои LSDB, что отражено в состоянии FULL между такими соседями. BDR ведёт себя точно так же, как и DR, кроме генерации LSA2, что позволяет снизить перебои маршрутизации при отказе DR.
Посмотрим вначале на LSA1:
R2#show ip ospf database router 2.2.2.2
OSPF Router with ID (2.2.2.2) (Process ID 1)
Router Link States (Area 0)
LS age: 425
Options: (No TOS-capability, DC)
LS Type: Router Links
Link State ID: 2.2.2.2
Advertising Router: 2.2.2.2
LS Seq Number: 8000000F
Checksum: 0x4A0B
Length: 60
Number of Links: 3
Link connected to: a Transit Network
(Link ID) Designated Router address: 192.168.234.4
(Link Data) Router Interface address: 192.168.234.2
Number of MTID metrics: 0
TOS 0 Metrics: 1
Link connected to: another Router (point-to-point)
(Link ID) Neighboring Router ID: 1.1.1.1
(Link Data) Router Interface address: 192.168.12.2
Number of MTID metrics: 0
TOS 0 Metrics: 1
Link connected to: a Stub Network
(Link ID) Network/subnet number: 192.168.12.0
(Link Data) Network Mask: 255.255.255.0
Number of MTID metrics: 0
TOS 0 Metrics: 1
Наконец, мы получили промежуточное соединение. Как вы могли уже догадаться, DR ID равен LSID соответствующего LSA2, т.е. IP-адресу DR. Так же, как и соединения точка-точка, промежуточное соединение описывает IP-адрес и вес интерфейса. Однако этих данных из LSA1 недостаточно для полноценного построения графа, т.к. они описывают только одно ребро из двух. Кроме того, информация о подсети самого L2-сегмента тоже недоступна. Обратимся к формату LSA2:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| LS age | Options | 2 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Link State ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Advertising Router |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| LS sequence number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| LS checksum | length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Network Mask |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Attached Router |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ... |
LSA2 содержит недостающие части картины: список соседних RID и маска подсети.
R2#show ip ospf database network
OSPF Router with ID (2.2.2.2) (Process ID 1)
Net Link States (Area 0)
Routing Bit Set on this LSA in topology Base with MTID 0
LS age: 459
Options: (No TOS-capability, DC)
LS Type: Network Links
Link State ID: 192.168.234.4 (address of Designated Router)
Advertising Router: 4.4.4.4
LS Seq Number: 80000002
Checksum: 0xEEB9
Length: 36
Network Mask: /24
Attached Router: 4.4.4.4
Attached Router: 2.2.2.2
Attached Router: 3.3.3.3
Теперь у нас есть вся необходимая информация, чтобы расширить граф промежуточным сегментом:
Тут стоит отметить ещё пару моментов. Во-первых, вес ребра, исходящего из псевдоузла, всегда равен нулю и не вносит изменений в стоимость маршрута. Во-вторых, информация о подсети вшита в LSA2: маска указана в явном виде, а адрес подсети можно получить из LSID и длины самого префикса.
В качестве короткого отступления от основной темы хочу заметить, что принцип работы OSPF prefix suppression должен стать теперь очевидным:
отсутствуют конечные соединения, создаваемые одновременно с соединениями точка-точка;
промежуточные соединения включают маску /32 в LSA2 в качестве специального признака, по которому следует игнорировать такой маршрут; в худшем случае будет доступен только адрес DR, но не остальная подсеть.
LSA1 и LSA2 позволяют целиком построить граф для одной зоны. Однако в OSPF существуют такие понятия, как внешние и межзональные маршруты – ими мы и займёмся.
LSA5: AS-external LSA
Этот LSA относительно однозначен: он анонсирует внешнюю подсеть, маску и дополнительную информацию, которая может облегчить жизнь (а может и существенно её усложнить). Формат этой структуры следующий:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| LS age | Options | 5 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Link State ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Advertising Router |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| LS sequence number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| LS checksum | length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Network Mask |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|E| 0 | metric |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Forwarding address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| External Route Tag |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|E| TOS | TOS metric |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Forwarding address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| External Route Tag |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ... |
LSID равен подсети, маска и метрика явно указаны… Информации достаточно, чтобы построить вершину и соответствующие ребра, в целом ситуация похожа на конечные соединения из LSA1. Если есть желание узнать побольше о нюансах Forwarding address (FA), я бы посоветовал этот блог и ссылки в начале на другие статьи. Они посвящены LSA5 FA и соответствующим спецэффектам, которые в определённый момент могут оказаться полезными. Для остальных полей LSA5 описания из RFC 2338 секция A.4.5 более чем достаточно.
В нашей схеме R3 генерирует LSA5, добавляя адреса подключенных сетей (в нашем случае – это loopback 0) в OSPF:
R3(config)#router ospf 1
R3(config-router)#redistribute connected subnets
R3#
R3#show ip ospf database
OSPF Router with ID (3.3.3.3) (Process ID 1)
Router Link States (Area 0)
Link ID ADV Router Age Seq# Checksum Link count
1.1.1.1 1.1.1.1 441 0x80000025 0x00A449 3
2.2.2.2 2.2.2.2 962 0x80000011 0x00460D 3
3.3.3.3 3.3.3.3 23 0x80000009 0x003A27 1
4.4.4.4 4.4.4.4 1085 0x8000000A 0x00F365 1
Net Link States (Area 0)
Link ID ADV Router Age Seq# Checksum
192.168.234.4 4.4.4.4 835 0x80000004 0x00EABB
Type-5 AS External Link States
Link ID ADV Router Age Seq# Checksum Tag
3.3.3.3 3.3.3.3 2 0x80000001 0x000385 0
R3#
R3#show ip ospf database external
OSPF Router with ID (3.3.3.3) (Process ID 1)
Type-5 AS External Link States
LS age: 38
Options: (No TOS-capability, DC, Upward)
LS Type: AS External Link
Link State ID: 3.3.3.3 (External Network Number )
Advertising Router: 3.3.3.3
LS Seq Number: 80000001
Checksum: 0x385
Length: 36
Network Mask: /32
Metric Type: 2 (Larger than any link state path)
MTID: 0
Metric: 20
Forward Address: 0.0.0.0
External Route Tag: 0
Стоит помнить, что LSA5 распространяется по всей автономной системе OSPF, а не только в одной зоне. Чтобы продолжить граф, нужна информация о вершине (LSA5 LSID), ребре (Advertising Router) и весе ребра:
Это всё про роль LSA5 в построении графа. Почти всё.
LSA3: summary LSA
Переключимся пока на межзональную связность. Первое впечатление обманчиво: этот LSA не имеет никакого отношения к суммаризации префиксов в обычном смысле. Он предназначен для суммаризации информации о топологии при передаче из одной зоны в другую: LSA1 и LSA2, используемые для построения графа, не переходят между зонами, а превращаются в LSA3 на основе LSDB или RIB (об этом чуть позже). Формат LSA3 выглядит так:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| LS age | Options | 3 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Link State ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Advertising Router |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| LS sequence number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| LS checksum | length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Network Mask |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0 | metric |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| TOS | TOS metric |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ... |
Идея похожа на задумку с LSA5: передать подсеть (LSA3 LSID), маску и метрику в другую зону. Передача информации о топологии между зонами не происходит, чтобы сэкономить вычислительные ресурсы маршрутизаторов и сделать сеть более масштабируемой. Таким образом, OSPF с использованием нескольких зон ведёт себя, как distance-vector (DV) протокол маршрутизации. Такое поведение является причиной, по которой некоторые авторы относят OSPF к гибридным протоколам маршрутизации (EIGRP же является DV-протоколом в чистом виде, хотя и весьма технологичным). Логика DV обычно включает в себя какой-нибудь механизм защиты от петель маршрутизации, например, расщепление горизонта (split horizon), DUAL и так далее. OSPF же использует совершенно иной подход: LSA3 может пересечь границу зоны только в том случае, если одна из зон является зоной 0 (она же – опорная, backbone). Это позволяет построить дерево высотой, равной 2: зона 0 является корнем, тогда как остальные зоны находятся на следующем уровне после зоны 0. Очевидно, что в такой схеме петли маршрутизации невозможны, поскольку существует только один путь – через опорную зону.
Настроим зону 1 на R4 и R5:
R4(config)#interface f0/1
R4(config-if)#ip ospf 1 area 1
R4(config-if)#ip ospf network point-to-point
R5(config)#router ospf 1
R5(config-router)#router-id 5.5.5.5
R5(config)#intreface f0/1
R5(config-if)#ip ospf 1 area 1
R5(config-if)#ip ospf network point-to-point
R5(config)#interface lo 1
R5(config-if)#ip address 5.5.5.5 255.255.255.255
R5(config-if)#ip ospf 1 area 1
R5(config)#interface lo 2
R5(config-if)#ip address 5.5.5.55 255.255.255.255
R5(config-if)#ip ospf 1 area 1
R2#show ip ospf database
OSPF Router with ID (2.2.2.2) (Process ID 1)
Router Link States (Area 0)
Link ID ADV Router Age Seq# Checksum Link count
1.1.1.1 1.1.1.1 782 0x80000027 0x00A04B 3
2.2.2.2 2.2.2.2 1339 0x80000013 0x00420F 3
3.3.3.3 3.3.3.3 422 0x8000000B 0x003629 1
4.4.4.4 4.4.4.4 252 0x8000000D 0x00F064 1
Net Link States (Area 0)
Link ID ADV Router Age Seq# Checksum
192.168.234.4 4.4.4.4 1235 0x80000006 0x00E6BD
Summary Net Link States (Area 0)
Link ID ADV Router Age Seq# Checksum
5.5.5.5 4.4.4.4 170 0x80000001 0x003ED8
5.5.5.55 4.4.4.4 156 0x80000001 0x00489C
192.168.45.0 4.4.4.4 242 0x80000001 0x00781D
Type-5 AS External Link States
Link ID ADV Router Age Seq# Checksum Tag
3.3.3.3 3.3.3.3 422 0x80000003 0x00FE87 0
Как и следовало ожидать, префиксы из зоны 1 видны в виде LSA3. R4, будучи ABR, является advertising router. С точки зрения зоны 0 все такие префиксы подключены напрямую к R4, что позволяет скрыть детали топологии зоны 1.
R2#show ip ospf database summary adv-router 4.4.4.4
OSPF Router with ID (2.2.2.2) (Process ID 1)
Summary Net Link States (Area 0)
Routing Bit Set on this LSA in topology Base with MTID 0
LS age: 823
Options: (No TOS-capability, DC, Upward)
LS Type: Summary Links(Network)
Link State ID: 5.5.5.5 (summary Network Number)
Advertising Router: 4.4.4.4
LS Seq Number: 80000001
Checksum: 0x3ED8
Length: 28
Network Mask: /32
MTID: 0 Metric: 2
Routing Bit Set on this LSA in topology Base with MTID 0
LS age: 809
Options: (No TOS-capability, DC, Upward)
LS Type: Summary Links(Network)
Link State ID: 5.5.5.55 (summary Network Number)
Advertising Router: 4.4.4.4
LS Seq Number: 80000001
Checksum: 0x489C
Length: 28
Network Mask: /32
MTID: 0 Metric: 2
Routing Bit Set on this LSA in topology Base with MTID 0
LS age: 895
Options: (No TOS-capability, DC, Upward)
LS Type: Summary Links(Network)
Link State ID: 192.168.45.0 (summary Network Number)
Advertising Router: 4.4.4.4
LS Seq Number: 80000001
Checksum: 0x781D
Length: 28
Network Mask: /24
MTID: 0 Metric: 1
Теперь у нас достаточно опыта, чтобы построить граф зоны 1 на основе LSDB, поэтому далее мы сконцентрируемся только на мнении зоны 0 о том, как выглядит OSPF AS.
Осталось только проверить, что именно является причиной создания LSA3. Удалим 5.5.5.55/32 из таблицы маршрутизации R4 и пронаблюдаем, останется ли этот маршрут в зоне 0, отсутствуя при этом в RIB на ABR.
R4(config)#ip prefix-list FILTER deny 5.5.5.55/32
R4(config)#ip prefix-list FILTER permit 0.0.0.0/0 le 32
R4(config)#router ospf 1
R4(config-router)#distribute-list prefix FILTER in
R4#
R4# show ip route ospf
<output omitted>
1.0.0.0/32 is subnetted, 1 subnets
O 1.1.1.1 [110/3] via 192.168.234.2, 00:00:05, FastEthernet0/0
3.0.0.0/32 is subnetted, 1 subnets
O E2 3.3.3.3 [110/20] via 192.168.234.3, 00:00:05, FastEthernet0/0
5.0.0.0/32 is subnetted, 1 subnets
O 5.5.5.5 [110/2] via 192.168.45.5, 00:00:05, FastEthernet0/1
O 192.168.12.0/24 [110/2] via 192.168.234.2, 00:00:05, FastEthernet0/0
R2#show ip ospf database
OSPF Router with ID (2.2.2.2) (Process ID 1)
Router Link States (Area 0)
Link ID ADV Router Age Seq# Checksum Link count
1.1.1.1 1.1.1.1 228 0x80000028 0x009E4C 3
2.2.2.2 2.2.2.2 804 0x80000014 0x004010 3
3.3.3.3 3.3.3.3 1868 0x8000000B 0x003629 1
4.4.4.4 4.4.4.4 1697 0x8000000D 0x00F064 1
Net Link States (Area 0)
Link ID ADV Router Age Seq# Checksum
192.168.234.4 4.4.4.4 653 0x80000007 0x00E4BE
Summary Net Link States (Area 0)
Link ID ADV Router Age Seq# Checksum
5.5.5.5 4.4.4.4 1615 0x80000001 0x003ED8
5.5.5.55 4.4.4.4 1602 0x80000001 0x00489C
192.168.45.0 4.4.4.4 1688 0x80000001 0x00781D
Type-5 AS External Link States
Link ID ADV Router Age Seq# Checksum Tag
3.3.3.3 3.3.3.3 1868 0x80000003 0x00FE87 0
R2#
R2#show ip route ospf
<output omitted>
1.0.0.0/32 is subnetted, 1 subnets
O 1.1.1.1 [110/2] via 192.168.12.1, 06:10:34, FastEthernet0/1
3.0.0.0/32 is subnetted, 1 subnets
O E2 3.3.3.3 [110/20] via 192.168.234.3, 01:37:25, FastEthernet0/0
5.0.0.0/32 is subnetted, 2 subnets
O IA 5.5.5.5 [110/3] via 192.168.234.4, 00:26:58, FastEthernet0/0
O IA 5.5.5.55 [110/3] via 192.168.234.4, 00:26:44, FastEthernet0/0
O IA 192.168.45.0/24 [110/2] via 192.168.234.4, 00:28:10, FastEthernet0/0
Согласно RFC 2328 части 12.4.3, LSA3 маршруты нужно создавать на основе таблицы маршрутизации (“determined by examining the routing table structure”). Очевидно, что отсутствие 5.5.5.55/32 в RIB R4 не помешало IOS создать соответствующий LSA3 и отправить его в зону 0. В отличие от DV-протоколов, OSPF не предусматривает механизмов фильтрации маршрутов в произвольной точке сети, поэтому использование такой функции, как distribute-list in, не является в общем случае хорошей затеей.
LSA4: ASBR-summary LSA
Как вы уже могли догадаться, LSA4 суммаризует информацию об ASBR. Не забыли, что LSA5 расходится по всей AS? LSA могут быть изменены только их создателем, это сделано для того, чтобы обеспечить целостность LSDB внутри зоны. Если ASBR расположен в другой зоне, информации для создания вершины, соответствующей LSA5, недостаточно, так как LSID маршрутизатора-создателя в текущей зоне неизвестен. Задача LSA4 – исправить это недоразумение. У него такой же формат, как и у LSA3:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| LS age | Options | 4 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Link State ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Advertising Router |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| LS sequence number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| LS checksum | length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Network Mask |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0 | metric |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| TOS | TOS metric |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ... |
Разница заключается в значении, придаваемом полю LSID: LSA3 в этом поле несёт номер подсети, тогда как LSA4 помещает туда RID ASBR’а. Создадим LSA5 в зоне 1 и проверим, как это отразится на опорной зоне.
R5(config)#router ospf 1
R5(config-router)#redistribute connected subnets
R2#show ip ospf database
OSPF Router with ID (2.2.2.2) (Process ID 1)
Router Link States (Area 0)
Link ID ADV Router Age Seq# Checksum Link count
1.1.1.1 1.1.1.1 1561 0x80000028 0x009E4C 3
2.2.2.2 2.2.2.2 112 0x80000015 0x003E11 3
3.3.3.3 3.3.3.3 1180 0x8000000C 0x00342A 1
4.4.4.4 4.4.4.4 1221 0x8000000E 0x00EE65 1
Net Link States (Area 0)
Link ID ADV Router Age Seq# Checksum
192.168.234.4 4.4.4.4 1986 0x80000007 0x00E4BE
Summary Net Link States (Area 0)
Link ID ADV Router Age Seq# Checksum
5.5.5.5 4.4.4.4 960 0x80000002 0x003CD9
5.5.5.55 4.4.4.4 960 0x80000002 0x00469D
192.168.45.0 4.4.4.4 960 0x80000002 0x00761E
Summary ASB Link States (Area 0)
Link ID ADV Router Age Seq# Checksum
5.5.5.5 4.4.4.4 10 0x80000001 0x0026F0
Type-5 AS External Link States
Link ID ADV Router Age Seq# Checksum Tag
3.3.3.3 3.3.3.3 1180 0x80000004 0x00FC88 0
6.6.6.6 5.5.5.5 16 0x80000001 0x00E997 0
LSA4 могут быть созданы только ABR’ами, когда они передают LSA5 из одной зоны в другую. В нашем случае передача 6.6.6.6/32 из зоны 1 в опорную зону заставляет R4 сгенерировать LSA4, соответствующий R5.
R2#show ip ospf database asbr-summary
OSPF Router with ID (2.2.2.2) (Process ID 1)
Summary ASB Link States (Area 0)
Routing Bit Set on this LSA in topology Base with MTID 0
LS age: 144
Options: (No TOS-capability, DC, Upward)
LS Type: Summary Links(AS Boundary Router)
Link State ID: 5.5.5.5 (AS Boundary Router address)
Advertising Router: 4.4.4.4
LS Seq Number: 80000001
Checksum: 0x26F0
Length: 28
Network Mask: /0
MTID: 0 Metric: 1
Помимо ASBR ID, LSA4 также несёт в себе метрику до ASBR с точки зрения ABR. Теперь не составляет труда смоделировать узел из другой зоны, создавший LSA5, что позволяет достроить граф, описывающий AS целиком.
LSA 6, 7 и ко
За рамками основной статьи остались несколько LSA, которые я бы хотел кратко описать в этом разделе. Некоторые из них в определённой степени модифицируют алгоритм OSPF; однако эти метаморфозы, подчас существенные, не меняют кардинальным образом основных принципов построения графа, поэтому детальное обсуждение этих LSA – тема отдельных статей.
LSA6 выделен для multicast OSPF, который устарел чуть больше, чем полностью.
LSA7 – это костыль, позволяющий создавать внешние префиксы в тупиковых (stub) зонах, превращая их в NSSA (no-so-stubby – не-такая-уж-тупиковая, звучит!). Если от FA в LSA5 у вас мурашки по коже, то LSA7 заставляет встать дыбом волосы в самых неожиданных местах.
LSA8 был предназначен для расширения функциональности LSA5 за счёт дополнительных атрибутов, однако так и не выбрался из состояния черновика.
LSA9 (link-local), 10 (area-local) and 11 (AS-local) являются opaque LSAs. Они несут дополнительную информацию, которую активно использует SPF с условиями (constrained SPF) для расчётов туннелей MPLS TE.
Спасибо за рецензию: Анастасии Куралёвой
Комментарии (5)
kterik
02.04.2022 21:07Хочу задать вопрос про построение «опорной» маршрутизации между большим количеством узлов (более ста), если связи между этими узлами никак не укладываются в схему «звезда». Особенно если в центре сети стоит не один маршрутизатор, а два (с целью резервирования). Особенно если в перспективе может появиться ещё пара десятков узлов с разнообразными связями между ними.
Цель этой «опорной» маршрутизации — послужить основой для построения MPLS сети, с L3VPN и прочими радостями. В сеть анонсируются только loopback интерфейсы маршрутизаторов, применяются только point-to-point линки.
При простом растягивании одной зоны OSPF на все узлы разбухает база LSDB, возникает перегрузка на некоторых (слабых) узлах при частом перестроении этой базы из-за флапающего в глубинке линка.
При попытке поделить сеть на несколько зон получается странное поведение трафика, который начинает ходить по плохо предсказуемым путям (наблюдалось на устройствах Mikrotik). Возможно, из-за тонких нюансов протокола OSPF.
Каким путём можно идти, желая сделать более надёжной и масштабируемой такую «опорную» маршрутизацию?
braonle Автор
02.04.2022 21:40Мне кажется, самое правильное решение - разобраться с multiarea, всё-таки это механизм, который предусмотрен именно для масштабирования.
Если нужен более простой вариант в рамках одной зоны, то можно использовать incremental SPF, prefix-suppression, LSA throttling, SPF throttling в зависимости от того, что умеет коробка. Ну и замена слабых устройств - тоже рабочий вариант.
Если хочется красивого и сложного решения, посмотрите на EPN 4.0, когда сайт закончит формирование. Технология называется Unified MPLS, более-менее описана в гайде для 5.0, если исключить часть про контроллеры. Можно собрать лабу, также есть гайд. Вкратце - нужно использовать BGP labeled unicast.
ZiggiPop
Про КДПВ. Тот случай, когда пытаешься поехать «на Берлин», а попадаешь в «город Ч».
Ну серьезно, эти «шутки» до сих пор актуальны?