Один из моих читателей прислал мне любопытный вопрос об NSSA (подробнее в будущей статье), который побудил меня копнуть глубже, зачем понадобилось поле OSPF Forwarding Address (FA) в Type-5 и Type-7 LSA.
Типовой сценарий для объяснения OSPF FA, который можно найти в интернете, выглядит так:
Два OSPF ASBR подключены к одному и тому же внешнему сегменту сети, однако только на одном из ASBR запущен протокол маршрутизации с этим сегментом (на схеме это BGP); этот же ASBR выполняет redistrubute внешних маршрутов в OSPF. Хотелось бы уметь отправлять трафик в сторону внешних префиксов через оба ASBR, но это невозможно, так как только один из ASBR объявляет внешние маршруты в сегмент OSPF.
Основные моменты по настройке E1 и E2:
hostname E1
!
interface Loopback0
description Loopback
ip address 192.168.0.1 255.255.255.255
ip ospf 1 area 1
!
interface GigabitEthernet0/1
description to C1
ip address 10.0.128.1 255.255.255.252
ip ospf 1 area 1
ip ospf cost 1
!
interface GigabitEthernet0/2
description to External_LAN
ip address 10.0.0.1 255.255.128.0
!
router ospf 1
redistribute bgp 65000 subnets
passive-interface Loopback0
!
router bgp 65000
bgp log-neighbor-changes
redistribute ospf 1
neighbor 10.0.0.2 remote-as 65001
hostname E2
!
interface Loopback0
description Loopback
ip address 192.168.0.4 255.255.255.255
ip ospf 1 area 1
!
interface GigabitEthernet0/1
description to C1
ip address 10.0.128.6 255.255.255.252
ip ospf 1 area 1
ip ospf cost 1
!
router ospf 1
BGP (соответственно, и redistribution) настроены на E1, но не на Е2.
А теперь к интересующей нас части базы данных OSPF. Маршрут 192.168.0.2/32, который объявлен X1 по eBGP, попадает в OSPF как Type-5 LSA на E1 (192.168.0.1).
Type-5 LSA в БД OSPF:
C1#show ip ospf database external
OSPF Router with ID (192.168.0.3) (Process ID 1)
Type-5 AS External Link States
LS age: 301
Options: (No TOS-capability, DC, Upward)
LS Type: AS External Link
Link State ID: 192.168.0.2 (External Network Number )
Advertising Router: 192.168.0.1
LS Seq Number: 80000001
Checksum: 0xA154
Length: 36
Network Mask: /32
Metric Type: 2 (Larger than any link state path)
MTID: 0
Metric: 1
Forward Address: 0.0.0.0
External Route Tag: 65001
Если есть желание воспроизвести полученные результаты самостоятельно, можете скачать файлы для VIRL из репозитория на Github.
Познакомьтесь с Его Величеством Костылём: что если один ASBR анонсирует внешний next-hop (Forwarding Address) в Type-5 LSA, и при этом оба пограничных маршрутизатора анонсируют внешний префикс (надеюсь, как stub network)? Рекурсивный поиск next-hop должен справиться с задачей, так что C1 получит два равноценных маршрута к внешнему префиксу в таблицу маршрутизации.
Чтобы такая конструкция заработала, E1 и E2 должны анонсировать внешнюю подсеть как внутренний префикс в OSPF, поэтому нужно включить OSPF на внешних интерфейсах E1 и E2:
interface GigabitEthernet0/2
description to External_LAN
ip ospf cost 1
Внешний интерфейс нельзя сделать пассивным (= stub network). Как минимум, последние версии Cisco IOS не выставляют FA, если next-hop известен через passive interface; внешняя сеть должна быть доступна через полноценный интерфейс с OSPF. Мне не удалось найти соответствующих требований в RFC2328 – если я что-то упустил, пожалуйста, дайте знать в комментариях.
После этой настройки, Type-5 LSA получают ненулевое значение Forwarding Address, и C1 устанавливает два равноценных пути до внешнего маршрута в таблицу маршрутизации.
C1>show ip ospf database external
OSPF Router with ID (192.168.0.3) (Process ID 1)
Type-5 AS External Link States
LS age: 907
Options: (No TOS-capability, DC, Upward)
LS Type: AS External Link
Link State ID: 192.168.0.2 (External Network Number )
Advertising Router: 192.168.0.1
LS Seq Number: 80000001
Checksum: 0x2CBD
Length: 36
Network Mask: /32
Metric Type: 2 (Larger than any link state path)
MTID: 0
Metric: 1
Forward Address: 10.0.0.2
External Route Tag: 65001
C1>show ip route 192.168.0.2
Routing entry for 192.168.0.2/32
Known via "ospf 1", distance 110, metric 1
Tag 65001, type extern 2, forward metric 2
Last update from 10.0.128.6 on GigabitEthernet0/2, 00:15:21 ago
Routing Descriptor Blocks:
10.0.128.6, from 192.168.0.1, 00:15:21 ago, via GigabitEthernet0/2
Route metric is 1, traffic share count is 1
Route tag 65001
* 10.0.128.1, from 192.168.0.1, 00:15:21 ago, via GigabitEthernet0/1
Route metric is 1, traffic share count is 1
Проблема решена? НЕТ, КОНЕЧНО ЖЕ НЕТ. Мы сделали только хуже:
Даже если на первый взгляд всё работает, как надо, E1 – всё ещё единая точка отказа: если он упадёт, конец redistribution маршрута, и, как следствие, связности до внешних префиксов.
И так сложный link-state протокол маршрутизации получил ещё один неочевидный костыль. Вспомните про нюанс с passive interface, а ещё посмотрите на дополнительные детали при выборе лучшего маршрута в OSPF (RFC 2328).
Чтобы костыль работал, OSPF должен быть активен на внешних интерфейсах (по крайней мере в последних версиях Cisco IOS). Не самый лучший вариант с точки зрения безопасности (пожалуйста, даже не упоминайте, что можно было бы использовать ACL для фильтрации пакетов OSPF, пока не прочтёте эту заметку).
Правильным решением было бы запустить BGP и redistribution на обоих ASBR (да, есть сюрпризы с two-way redistribution). Если кто-то стал бы возмущаться подобным недосмотром в OSPF, то лучше нанести ему добро и исправить кривой дизайн.
К сожалению, стандарты рождаются иначе. Неудивительно, что научная среда посмеивается над громоздкостью распределённых протоколов маршрутизации (параллельно нахваливая своё болото), а мы последовательно упражняемся в YAK shaving.
Ах да, поскольку мы получили такую замечательную функцию в OSPF, отладка стала ещё более увлекательной. Ура!