По мере того как я погружаюсь в мир VXLAN , мне понадобится лабораторная среда, так как это лучший способ углубить процесс обучения и получить практический опыт работы с протоколом. Я собираюсь создать лабораторию на базе Cisco Nexus9000v в EveNG, но те же образы можно использовать и другие среды.
Лабораторная среда будет иметь следующие характеристики:
- Все связи используют ненумерованные интерфейсы с Loopback.
- Выделенный Loopback используется для VXLAN.
- Используется Flood and Learn с PIM ASM и Anycast RP (без EVPN).
- OSPF в качестве IGP в андерлее.
Интерфейсы подключены в соответствии с нашей физической топологией.
Далее мы преобразуем порты в маршрутизируемые (routed ports) и включим поддержку jumbo-фреймов:
Spine1(config)# int eth1/1-4
Spine1(config-if-range)# mtu 9216
Spine1(config-if-range)# no switchport
Leaf1(config)# int eth1/1-2
Leaf1(config-if-range)# mtu 9216
Leaf1(config-if-range)# no switchport
Аналогично сделать остальные spine и leaf
Далее андерлей будет настроен с использованием OSPF на ненумерованных связях в соответствии с этой топологией:
Для этого необходимо выполнить следующие шаги:
- Включить функцию OSPF.
- Добавить loopback-интерфейсы на все устройства.
- Настроить Ethernet-интерфейсы как point-to-point (точка-точка).
- Настроить Ethernet-интерфейсы как ненумерованные (unnumbered) относительно loopback0.
- Включить OSPF на Ethernet-интерфейсах и loopback-интерфейсах.
Кроме того, мы также настроим разрешение имен (name lookup) в OSPF, чтобы при проверке смежностей (adjacencies) отображались имена наших OSPF-соседей.
Spine1(config)# feature ospf
Spine1(config)# ip host Leaf1 192.0.2.3
Spine1(config)# ip host Leaf2 192.0.2.4
Spine1(config)# ip host Leaf3 192.0.2.5
Spine1(config)# ip host Leaf4 192.0.2.6
Spine1(config)# int lo0
Spine1(config-if)# ip add 192.0.2.1/32
Spine1(config-if)# ip router ospf UNDERLAY area 0.0.0.0
Spine1(config-if)# int eth1/1-4
Spine1(config-if-range)# medium p2p
Spine1(config-if-range)# ip unnumbered lo0
Spine1(config-if-range)# ip ospf network point-to-point
Spine1(config-if-range)# ip router ospf UNDERLAY area 0.0.0.0
Spine1(config-if-range)# router ospf UNDERLAY
Spine1(config-router)# log-adjacency-changes detail
Spine1(config-router)# name-lookup
Spine2(config)# feature ospf
Spine2(config)# ip host Leaf1 192.0.2.3
Spine2(config)# ip host Leaf2 192.0.2.4
Spine2(config)# ip host Leaf3 192.0.2.5
Spine2(config)# ip host Leaf4 192.0.2.6
Spine2(config)# int lo0
Spine2(config-if)# ip add 192.0.2.2/32
Spine2(config-if)# ip router ospf UNDERLAY area 0.0.0.0
Spine2(config-if)# int eth1/1-4
Spine2(config-if-range)# medium p2p
Spine2(config-if-range)# ip unnumbered lo0
Spine2(config-if-range)# ip ospf network point-to-point
Spine2(config-if-range)# ip router ospf UNDERLAY area 0.0.0.0
Spine2(config-if-range)# router ospf UNDERLAY
Spine2(config-router)# log-adjacency-changes detail
Spine2(config-router)# name-lookup
Leaf1(config)# feature ospf
Leaf1(config)# ip host Spine1 192.0.2.1
Leaf1(config)# ip host Spine2 192.0.2.2
Leaf1(config)# int lo0
Leaf1(config-if)# ip add 192.0.2.3/32
Leaf1(config-if)# ip router ospf UNDERLAY area 0.0.0.0
Leaf1(config-if)# int eth1/1-2
Leaf1(config-if-range)# medium p2p
Leaf1(config-if-range)# ip unnumbered lo0
Leaf1(config-if-range)# ip ospf network point-to-point
Leaf1(config-if-range)# ip router ospf UNDERLAY area 0.0.0.0
Leaf1(config-if-range)# router ospf UNDERLAY
Leaf1(config-router)# log-adjacency-changes detail
Leaf1(config-router)# name-lookup
Leaf2(config)# feature ospf
Leaf2(config)# ip host Spine1 192.0.2.1
Leaf2(config)# ip host Spine2 192.0.2.2
Leaf2(config)# int lo0
Leaf2(config-if)# ip add 192.0.2.4/32
Leaf2(config-if)# ip router ospf UNDERLAY area 0.0.0.0
Leaf2(config-if)# int eth1/1-2
Leaf2(config-if-range)# medium p2p
Leaf2(config-if-range)# ip unnumbered lo0
Leaf2(config-if-range)# ip ospf network point-to-point
Leaf2(config-if-range)# ip router ospf UNDERLAY area 0.0.0.0
Leaf2(config-if-range)# router ospf UNDERLAY
Leaf2(config-router)# log-adjacency-changes detail
Leaf2(config-router)# name-lookup
Leaf3(config)# feature ospf
Leaf3(config)# ip host Spine1 192.0.2.1
Leaf3(config)# ip host Spine2 192.0.2.2
Leaf3(config)# int lo0
Leaf3(config-if)# ip add 192.0.2.5/32
Leaf3(config-if)# ip router ospf UNDERLAY area 0.0.0.0
Leaf3(config-if)# int eth1/1-2
Leaf3(config-if-range)# medium p2p
Leaf3(config-if-range)# ip unnumbered lo0
Leaf3(config-if-range)# ip ospf network point-to-point
Leaf3(config-if-range)# ip router ospf UNDERLAY area 0.0.0.0
Leaf3(config-if-range)# router ospf UNDERLAY
Leaf3(config-router)# log-adjacency-changes detail
Leaf3(config-router)# name-lookup
Leaf4(config)# feature ospf
Leaf4(config)# ip host Spine1 192.0.2.1
Leaf4(config)# ip host Spine2 192.0.2.2
Leaf4(config)# int lo0
Leaf4(config-if)# ip add 192.0.2.6/32
Leaf4(config-if)# ip router ospf UNDERLAY area 0.0.0.0
Leaf4(config-if)# int eth1/1-2
Leaf4(config-if-range)# medium p2p
Leaf4(config-if-range)# ip unnumbered lo0
Leaf4(config-if-range)# ip ospf network point-to-point
Leaf4(config-if-range)# ip router ospf UNDERLAY area 0.0.0.0
Leaf4(config-if-range)# router ospf UNDERLAY
Leaf4(config-router)# log-adjacency-changes detail
Leaf4(config-router)# name-lookup
На этом этапе я собирался начать проверку OSPF, но заметил, что интерфейсы были отключены после того, как их преобразовали в маршрутизируемые порты (routed ports). Давайте снова активируем их:
Spine1(config)# int eth1/1-4
Spine1(config-if-range)# no shut
Spine2(config)# int eth1/1-4
Spine2(config-if-range)# no shut
Leaf1(config)# int eth1/1-2
Leaf1(config-if-range)# no shut
Leaf2(config)# int eth1/1-2
Leaf2(config-if-range)# no shut
Leaf3(config)# int eth1/1-2
Leaf3(config-if-range)# no shut
Leaf4(config)# int eth1/1-2
Leaf4(config-if-range)# no shut
Давайте проверим смежности OSPF на спайнах:
Благодаря разрешению имен (name lookup) мы теперь получаем удобное представление смежностей OSPF, включая имена устройств. Давайте проверим, как выглядит LSA типа 1 (Type 1 LSA), учитывая, что мы используем ненумерованные связи (unnumbered links):
Из-за использования ненумерованных связей (unnumbered links), адрес интерфейса маршрутизатора выглядит немного странно в LSA типа 1. Что такое 0.0.0.2 и 0.0.0.3 ? Если возникают сомнения, обратимся к тому, что говорится в RFC для OSPF (RFC 2328):
Кроме того, для каждой связи указывается поле Link Data . Это поле предоставляет 32 дополнительных бита информации о связи. Для связей с транзитными сетями, нумерованными point-to-point связями и виртуальными связями это поле определяет IP-адрес интерфейса связанного маршрутизатора (это необходимо для расчета таблицы маршрутизации, см. Раздел 16.1.1). Для связей со stub-сетями это поле определяет маску IP-адреса stub-сети. Для ненумерованных point-to-point связей поле Link Data должно быть установлено в значение ifIndexненумерованного интерфейса из MIB-II [Ref8].
Странный IP-адрес, который мы видим, — это просто индекс интерфейса. Это можно подтвердить на Leaf1:
Давайте проверим, есть ли у нас какие-либо маршруты в OSPF:
Обратите внимание на ECMP-пути (равноценные многопутевые маршруты) к другим leafs. Давайте проверим, можем ли мы выполнить ping:
Андерлей теперь работает. Давайте добавим дополнительный loopback-интерфейс, который будет использоваться для VXLAN
Leaf1(config)# int lo1
Leaf1(config-if)# ip add 203.0.113.1/32
Leaf1(config-if)# ip router ospf UNDERLAY area 0.0.0.0
Leaf2(config)# int lo1
Leaf2(config-if)# ip add 203.0.113.2/32
Leaf2(config-if)# ip router ospf UNDERLAY area 0.0.0.0
Leaf3(config)# int lo1
Leaf3(config-if)# ip add 203.0.113.3/32
Leaf3(config-if)# ip router ospf UNDERLAY area 0.0.0.0
Leaf4(config)# int lo1
Leaf4(config-if)# ip add 203.0.113.4/32
Leaf4(config-if)# ip router ospf UNDERLAY area 0.0.0.0
Теперь давайте проверим, доступны ли loopback-интерфейсы:
Давайте разберем настройку PIM (Protocol Independent Multicast) и Anycast RP, чтобы вы могли понять, как это работает и зачем нужно далее будет больше теории.
Что такое PIM?
PIM (Protocol Independent Multicast) — это протокол маршрутизации, который используется для передачи многоадресного трафика (multicast). Он не зависит от конкретного протокола одноадресной маршрутизации (например, OSPF или BGP), но использует таблицу маршрутизации, созданную этими протоколами.
В данном случае мы настраиваем PIM Sparse Mode (PIM-SM) , который является одним из режимов работы PIM. Этот режим используется для эффективной передачи многоадресного трафика в больших сетях. Он предполагает использование RP (Rendezvous Point) — центральной точки, через которую проходит весь многоадресный трафик.
Что такое Anycast RP?
Anycast RP — это механизм, при котором несколько маршрутизаторов (в данном случае Spine1 и Spine2) используют одинаковый IP-адрес для роли RP. Это обеспечивает:
- Высокую доступность : Если один из маршрутизаторов выходит из строя, другой продолжает работать.
- Оптимизацию трафика : Трафик направляется к ближайшему RP (по метрике IGP).
Цель настройки
Мы хотим:
- Включить PIM на всех устройствах (Spine и Leaf).
- Настроить Anycast RP на Spine-маршрутизаторах.
- Обеспечить возможность передачи многоадресного трафика через андерлей (underlay).
Шаг 1: Включение PIM
Первым делом нужно включить функцию PIM на всех устройствах:
Spine1(config)# feature pim
Spine2(config)# feature pim
Leaf1(config)# feature pim
Leaf2(config)# feature pim
Leaf3(config)# feature pim
Leaf4(config)# feature pim
Команда feature pim активирует поддержку PIM на устройстве.
Шаг 2: Создание Loopback для Anycast RP
На Spine-маршрутизаторах создается новый интерфейс Loopback, который будет использоваться для Anycast RP. Например:
Spine1(config)# interface loopback1
Spine1(config-if)# ip add 192.0.2.255/32
Spine1(config-if)# ip pim sparse-mode
Spine1(config-if)# ip router ospf UNDERLAY area 0.0.0.0
- ip add 192.0.2.255/32: Назначаем IP-адрес для Anycast RP.
- ip pim sparse-mode: Включаем PIM Sparse Mode на этом интерфейсе.
- ip router ospf UNDERLAY area 0.0.0.0: Адvertise этот интерфейс в OSPF, чтобы он был доступен для других устройств.
Аналогично настраиваем Spine2:
Spine2(config)# interface loopback1
Spine2(config-if)# ip add 192.0.2.255/32
Spine2(config-if)# ip pim sparse-mode
Spine2(config-if)# ip router ospf UNDERLAY area 0.0.0.0
Заметьте, что оба Spine имеют одинаковый IP-адрес (192.0.2.255) для Anycast RP.
Шаг 3: Включение PIM на интерфейсах
PIM должен быть включен на всех интерфейсах, которые участвуют в передаче многоадресного трафика. Это включает:
- Интерфейсы, соединяющие Spine и Leaf.
- Loopback-интерфейсы.
Пример для Spine1:
Spine1(config)# int lo0
Spine1(config-if)# ip pim sparse-mode
Spine1(config-if)# int ethernet1/1-4
Spine1(config-if-range)# ip pim sparse-mode
Аналогично для Spine2:
Spine2(config)# int lo0
Spine2(config-if)# ip pim sparse-mode
Spine2(config-if)# int ethernet1/1-4
Spine2(config-if-range)# ip pim sparse-mode
Для Leaf-устройств:
Leaf1(config)# int ethernet1/1-2
Leaf1(config-if-range)# ip pim sparse-mode
Повторите это для всех Leaf-устройств.
Шаг 4: Настройка RP
Теперь нужно указать, какой RP использовать для многоадресных групп. Мы используем адрес Anycast RP (192.0.2.255):
Spine1(config)# ip pim rp-address 192.0.2.255 group-list 224.0.0.0/4
Spine2(config)# ip pim rp-address 192.0.2.255 group-list 224.0.0.0/4
Здесь:
- 192.0.2.255 — это адрес RP.
- group-list 224.0.0.0/4 — диапазон многоадресных групп, для которых применяется этот RP.
Аналогично настраиваем все Leaf-устройства:
Leaf1(config)# ip pim rp-address 192.0.2.255 group-list 224.0.0.0/4
Шаг 5: Настройка Anycast RP
На Spine-маршрутизаторах нужно явно указать, что они являются участниками Anycast RP:
Spine1(config)# ip pim anycast-rp 192.0.2.255 192.0.2.1
Spine1(config)# ip pim anycast-rp 192.0.2.255 192.0.2.2
Spine2(config)# ip pim anycast-rp 192.0.2.255 192.0.2.1
Spine2(config)# ip pim anycast-rp 192.0.2.255 192.0.2.2
Здесь:
- 192.0.2.255 — адрес Anycast RP.
- 192.0.2.1 и 192.0.2.2 — адреса Loopback-интерфейсов Spine1 и Spine2 соответственно.
Шаг 6: Проверка
После завершения настройки выполните проверку:
- Просмотр соседей PIM :
Spine1# show ip pim nei
- Убедитесь, что RP настроен правильно, и список участников Anycast RP включает все Spine-устройства.
Шаг 7: Включение PIM на Loopback для VXLAN
Если вы планируете использовать VXLAN, включите PIM на Loopback-интерфейсах для VXLAN:
Leaf1(config)# int lo1
Leaf1(config-if)# ip pim sparse-mode
Повторите это для всех Leaf-устройств.
Итог
Теперь наша сеть готова к передаче многоадресного трафика через андерлей с использованием PIM и Anycast RP. Это обеспечит:
- Высокую доступность RP.
- Эффективную маршрутизацию многоадресного трафика.
- Подготовку сети для работы с VXLAN.
Повторим что такое VXLAN?
VXLAN (Virtual Extensible LAN) — это технология, которая позволяет создавать оверлейные сети поверх существующей физической сети (андерлея ). Она использует инкапсуляцию трафика в UDP-пакеты для передачи данных между устройствами. VXLAN расширяет возможности традиционных VLAN, увеличивая количество доступных сетевых доменов с 4096 (в VLAN) до 16 миллионов (в VXLAN).
Мы хотим:
- Включить поддержку VXLAN на устройствах Leaf.
- Настроить отображение VLAN на VNI (VXLAN Network Identifier) .
- Создать NVE (Network Virtual Endpoint) для работы с VXLAN.
- Настроить порты для подключения серверов.
- Убедиться, что устройства Leaf могут обмениваться данными через VXLAN.
Шаг 1: Включение функций VXLAN
Первым делом нужно включить поддержку VXLAN на всех устройствах Leaf:
Leaf1(config)# feature vn-segment-vlan-based
Leaf1(config)# feature nv overlay
- vn-segment-vlan-based: Позволяет связывать VLAN с VNIs.
- nv overlay: Включает поддержку VXLAN.
Аналогично настраиваем все остальные Leaf-устройства.
Шаг 2: Настройка NVE (Network Virtual Endpoint)
Теперь создаем интерфейс NVE , который будет использоваться для работы с VXLAN. Этот интерфейс отвечает за инкапсуляцию и декапсуляцию трафика.
Пример для Leaf1:
Leaf1(config)# interface nve1
Leaf1(config-if-nve)# no shutdown
Leaf1(config-if-nve)# source-interface loopback1
Leaf1(config-if-nve)# member vni 1000
Leaf1(config-if-nve-vni)# mcast-group 239.0.0.1
Здесь:
- interface nve1: Создаем интерфейс NVE.
- source-interface loopback1: Указываем, что Loopback1 будет использоваться как источник для VXLAN-трафика.
- member vni 1000: Привязываем VNI 1000 к этому интерфейсу.
- mcast-group 239.0.0.1: Назначаем мультикаст-группу для передачи многоадресного трафика.
Повторяем это для всех Leaf-устройств.
Шаг 3: Проверка NVE
После настройки можно проверить статус интерфейса NVE:
Leaf1# show int nve1
Если все настроено правильно, вы увидите, что интерфейс активен (nve1 is up), и сможете увидеть статистику по входящему и исходящему трафику.
Шаг 4: Настройка VLAN и портов
Теперь нужно настроить VLAN и привязать его к VNI. Также настраиваем порты для подключения серверов.
Пример для Leaf1:
Leaf1(config)# vlan 100
Leaf1(config-vlan)# vn-segment 1000
Leaf1(config-vlan)# interface ethernet1/3
Leaf1(config-if)# switchport mode access
Leaf1(config-if)# switchport access vlan 100
Leaf1(config-if)# no shutdown
Здесь:
- vlan 100: Создаем VLAN 100.
- vn-segment 1000: Привязываем VLAN 100 к VNI 1000.
- interface ethernet1/3: Настраиваем порт для подключения сервера.
- switchport mode access: Порт работает в режиме доступа.
- switchport access vlan 100: Привязываем порт к VLAN 100.
Повторяем это для всех Leaf-устройств.
Шаг 5: Подключение к мультикаст-группе
После настройки VXLAN устройства Leaf будут автоматически подключаться к мультикаст-группе (например, 239.0.0.1). Это можно проверить на Spine-маршрутизаторах:
Spine1# show ip mroute
Вы увидите записи для мультикаст-группы, например:
Это означает, что устройства успешно обмениваются многоадресным трафиком через VXLAN.
Шаг 6: Проверка работы VXLAN
SW1
interface Ethernet0/0
switchport access vlan 100
switchport mode access
interface Vlan100
ip address 172.16.0.2 255.255.0.0
SW2
interface Ethernet0/0
switchport access vlan 100
switchport mode access
interface Vlan100
ip address 172.16.0.3 255.255.0.0