Часть 3. Underlay. ISIS
Цель
Настроить IS-IS для Underlay сети
В сетях, где данные струятся,
IS-IS проводит путь незримый.
Пакеты быстро мчатся, чтобы сняться
С узлов на узел нитью неделимой.
А. С. ChatGPT (c.)
Ожидаемый результат
Настроен IS-IS в Underlay сети для IP-связанности между всеми сетевыми устройствами.
В документации зафиксирован план работ, адресное пространство, схема сети, конфигурация устройств.
IP-связанность между устройствами проверена и подтверждена:
Со всех устройств должны быть доступны Loopback интерфейсы всех устройств
Leaf коммутаторы должны иметь 2 (два) маршрута до других Leaf'ов
Схема сети
Продолжаем работать со схемой из прошлого задания: 2 спайна, 3 лифа в Норвегии, Осло, DC1 "Мидгард" ヅ
Из настроек заботливо удалено всякое напоминание про OSPF.
Соединение
Подсеть
Устройство A
Интерфейс
IP A
Устройство B
Интерфейс
IP B
no-osl-dc1-f1-r01k01-spn01 <-> no-osl-dc1-f1-r03k01-lf01
10.16.2.0/31
no-osl-dc1-f1-r01k01-spn01
Ethernet 1
10.16.2.0
no-osl-dc1-f1-r03k01-lf01
Ethernet 1
10.16.2.1
no-osl-dc1-f1-r01k01-spn01 <-> no-osl-dc1-f1-r03k02-lf01
10.16.2.2/31
no-osl-dc1-f1-r01k01-spn01
Ethernet 2
10.16.2.2
no-osl-dc1-f1-r03k02-lf01
Ethernet 1
10.16.2.3
no-osl-dc1-f1-r01k01-spn01 <-> no-osl-dc1-f1-r03k03-lf01
10.16.2.4/31
no-osl-dc1-f1-r01k01-spn01
Ethernet 3
10.16.2.4
no-osl-dc1-f1-r03k03-lf01
Ethernet 1
10.16.2.5
no-osl-dc1-f1-r02k01-spn01 <-> no-osl-dc1-f1-r03k01-lf01
10.16.2.6/31
no-osl-dc1-f1-r02k01-spn01
Ethernet 1
10.16.2.6
no-osl-dc1-f1-r03k01-lf01
Ethernet 2
10.16.2.7
no-osl-dc1-f1-r02k01-spn01 <-> no-osl-dc1-f1-r03k02-lf01
10.16.2.8/31
no-osl-dc1-f1-r02k01-spn01
Ethernet 2
10.16.2.8
no-osl-dc1-f1-r03k02-lf01
Ethernet 2
10.16.2.9
no-osl-dc1-f1-r02k01-spn01 <-> no-osl-dc1-f1-r03k03-lf01
10.16.2.10/31
no-osl-dc1-f1-r02k01-spn01
Ethernet 3
10.16.2.10
no-osl-dc1-f1-r03k03-lf01
Ethernet 2
10.16.2.11
Loopback интерфейсы для нужд IS-IS и VTEP
no-osl-dc1-f1-r01k01-spn01
10.16.0.1/32
-
no-osl-dc1-f1-r02k01-spn01
10.16.0.2/32
-
no-osl-dc1-f1-r03k01-lf01
10.16.1.1/32
10.16.4.1/32
no-osl-dc1-f1-r03k02-lf01
10.16.1.2/32
10.16.4.2/32
no-osl-dc1-f1-r03k03-lf01
10.16.1.3/32
10.16.4.3/32
Немного теории про IS-IS.
Взято из Википедии: https://ru.wikipedia.org/wiki/IS-IS
Протокол маршрутизации промежуточных систем (англ. IS-IS) — протокол внутренних шлюзов (IGP), стандартизированный ISO и использующийся в основном в крупных сетях провайдеров услуг. IS-IS может также использоваться в корпоративных сетях особо крупного масштаба. IS-IS — это протокол маршрутизации на основе состояния каналов. Он обеспечивает быструю сходимость и отличную масштабируемость. Как и все протоколы на основе состояния каналов, IS-IS очень экономно использует пропускную способность сетей.
Далее, нас интересует понятие Net в IS-IS:
Адрес ISIS NET — это то, что нам нужно настроить, когда мы используем протокол маршрутизации ISIS в сети. Это связано с тем, что протокол ISIS изначально был разработан для сетей CLNS. Хотя мы используем IP-адрес для маршрутизации IP-трафика, пакеты управления ISIS по-прежнему используют адрес CLNS для связи друг с другом.
Машинный перевод части статьи https://rayka-co.com/lesson/isis-net-address-format/#google_vignette
Формат CLNS адреса для наглядности. Пригодится позже.

Вводные для IS-IS:
Для упрощения и совместимости принимаем, что все устройства работают с IS-IS Level 2.
В качестве System ID используем видоизмененный адрес Loopback
10.16.0.1 представляем видом 100.160.000.001 - добавляем лидирующих или конечных нулей
Переписываем значение в вид 100.160.000.001, двигаем точки и получаем: 1001.6000.0001

Достижение результата
Тут мы эволюционируем и меняем парадигму xD. Принимаем за основу состояние сети из Netbox.
После установки и конфигурирования считаем, что у нас в Netbox 5 устройств: 2 Spine-коммутатора, 3 - Leaf-коммутатора. Описываем их состояние внутри Netbox:

Для каждого устройства указаны соответствующие настройки интерфейсов средствами Netbox - адреса, кабели, состояние физического интерфейса - включен/выключен, description.
Пример состояния интерфейсов для no-osl-dc1-f1-r01k01-spn01

Для устройств создан Config Template со следующим содержимым:
hostname {{ device.name }}
!
{%- block content %}
management api http-commands
no shutdown
!
vrf default
no shutdown
!
vrf {{ vrfs.mgmt }}
no shutdown
{%- endblock %}
!
ip routing
no ip routing vrf {{ vrfs.mgmt }}
!
ip route vrf {{ vrfs.mgmt }} 0.0.0.0/0 {{ mgmt_default_gw }}
!
{%- for key, value in stp_mode.items() %}
spanning-tree mode {{ value }}
!
{%- endfor %}
{%- for key, value in vrfs.items() %}
vrf instance {{ value }}
!
{%- endfor %}
{%- for interface in device.interfaces.all() %}
{%- if interface.name.startswith('Ethernet') %}
interface {{ interface.name }}
{%- for ip in interface.ip_addresses.all() %}
no switchport
isis enable {{ isis_instances.hw2_instance }}
ip address {{ ip.address }}
{%- endfor %}
{%- if not interface.enabled %}
shutdown
{%- else %}
no shutdown
{%- endif %}
{%- if interface.description %}
description {{ interface.description }}
{%- endif %}
!
{%- elif interface.name.startswith('Loopback') %}
interface {{ interface.name }}
{%- for ip in interface.ip_addresses.all() %}
ip address {{ ip.address }}
isis enable {{ isis_instances.hw2_instance }}
{%- endfor %}
{%- if interface.description %}
description {{ interface.description }}
{%- endif %}
!
{%- elif interface.name.startswith('Management') %}
interface {{ interface.name }}
{%- for ip in interface.ip_addresses.all() %}
ip address {{ ip.address }}
vrf {{ vrfs.mgmt }}
{%- endfor %}
{%- if interface.description %}
description {{ interface.description }}
{%- endif %}
!
{%- endif %}
{%- endfor %}
router isis {{ isis_instances.hw2_instance }}
net {{ isis_net_prefix }}{{ isis_id }}{{ isis_net_suffix }}
is-type {{ isis_type.type_2 }}
!
address-family ipv4 unicast
!
end
Этот темплейт делает следующие замечательные вещи:
Генерирует конфигурацию для интерфейсов с именем, которое начинается на "^Ethernet", а именно:
Вытягивает и устанавливает IP-адрес для интерфейса из Netbox
Если на интерфейсе назначен IP-адрес переводит его в режим no switchport
Назначает ему имя процесса IS-IS
В случае, если интерфейс помечен, как активный в Netbox, переводит его в no shutdown
Генерирует конфигурацию интерфейсов Loopback и Management
Генерирует прочую общую информацию в виде
vrf
default gw для mgmt трафика
stp режим
настройки ISIS, общие для устройств
Остальная магия с настройками и шаблоном Jinja2 связана с понятием Config Context из Netbox

Для каждого устройства, участвующего в построении IS-IS, указан локальный контекст с именем "isis_id":
{
"isis_id": "0101.6000.0001"
}
С помощью шаблона он генериуется в NET адрес в конструкции:
router isis {{ isis_instances.hw2_instance }}
net {{ isis_net_prefix }}{{ isis_id }}{{ isis_net_suffix }}
is-type {{ isis_type.type_2 }}
!
address-family ipv4 unicast
Весь контекст суммируется на вкладке Rendered Context и представляет собой вот это:
{
"isis_id": "0101.6000.0001",
"isis_instances": {
"hw2_instance": "hw2"
},
"isis_net_prefix": "49.0001.",
"isis_net_suffix": ".00",
"isis_type": {
"type_1": "level-1",
"type_2": "level-2"
},
"mgmt_default_gw": "172.16.108.1",
"stp_mode": {
"mstp": "mstp"
},
"vrfs": {
"mgmt": "mgmt"
}
}
PoC. Импорт конфигурационного файла, созданного в Netbox в устройства (ручной режим)
На момент написания статьи не удалось реализовать импорт конфигурации в автоматическом режиме, поэтому автор копирует конфигурацию в каждое устройство как есть. При этом предполагается, что для устройств настроен только mgmt интерфейс, привилегированный пользователь. Остальные настройки соответствуют умолчаниям.
Результат настройки IS-IS
Маршруты на spine-коммутаторах:

Маршруты на leaf-коммутаторах:

Необходимо доделать
добавить в шаблон генерацию секции IS-IS для Loopback интерфейсов VTEPДобавлено путем добавления интерфейсов в Netboxдобавить в шаблон генерацию секции BFDДобавлено в новой версии шаблонапроверить и в случае необходимости добавить настройки ECMP
Last updated