BGP EVPN FRR simple
Минимальная конфигурация EVPN по шагам
Это документ о настройке абсолютно минимальной конфигурации EVPN
Схема сети
Оригинал: Файл:FRR BGP EVPN 1.drawio
Тестовый стенд полностью виртуализирован.
На этой схеме:
- 2 маршрутизатора FRR выполняют роли PE (Provider Edge, маршрутизатор куда подключены клиентские устройства)
- Сеть tenant используется как транспортная сеть между маршрутизаторами (l2 сегмент)
- Каждый из PE имеет по 1 подключеному CE (Client Edge, маршрутизатор клиента подключенный к оборудованию провайдера)
- CE максимально упрощены - это просто IP адрес поднятый на бридже (но конечно ничто не мешает использовать отдельную виртуальную машину, разницы нет)
- Используется 1 интерфейс для поддключения CE
- Номер VNI (VxLAN Network Identifier) выбран абсолютно произвольно, такое значение взято что бы оно случайно не совпало ни с каким другим и было заведомо больше максимального номера влана
- Management сеть используется только для управлени маршрутизаторами (без нее можно обойтись) Интерфейсы в этой сети названы external по историческим причинам.
- Интерфейсы loopback изспользуются для построения сессий BGP
Настройка сети на маршрутизаторах
- Настройки на обоих маршрутизаторах идентичны (с точностью до адресов)
dummyподдерживается в относительно новых версияхnetplan(Убунту 24.04 поддерживает)
FRR1
network:
version: 2
dummy-devices:
loopback0:
addresses:
- 192.168.32.101/32
ethernets:
ens3:
dhcp4: false
dhcp6: false
addresses: ["10.80.6.253/24"]
set-name: "tenant"
match:
macaddress: "00:99:00:00:00:01"
ens5:
dhcp4: true
dhcp6: false
match:
macaddress: "00:99:00:00:00:03"
set-name: "external"
FRR2
network:
version: 2
dummy-devices:
loopback0:
addresses:
- 192.168.32.102/32
ethernets:
ens3:
dhcp4: false
dhcp6: false
addresses: ["10.80.6.252/24"]
set-name: "tenant"
match:
macaddress: "00:99:00:00:22:01"
ens5:
dhcp4: true
dhcp6: false
match:
macaddress: "00:99:00:00:22:03"
set-name: "external"
Настройка демона FRR
Эта часть разделена на 2 части - не относящееся к EVPN выжелено в отдельную часть
Подготовительная настройка
- Запустить OSPF в сети tenant для того что бы получить доступность интерфейсов loopback
- сделать редистрибьюцию маршрутов в OSPF (не уверене что нужно делать все три - static connected и kernel даже скорее всего нет)
- тут можно вполне обойтись статикой без OSPF но так сделано для большей "достоверности"
Немного заметок про настройку OSPF:
prefix-list REDISTRIBUTE- ...- префикс-листы что бы ограничить редистрибьюцию в OSPF только /32 (ge) сетями из диапазона192.168.32.0/24- В работе OSPF учавствует только интерфейс
tenant(no ip ospf passive,passive-interface defaul)
FRR1 OSPF
frr version 10.2.1 frr defaults traditional hostname frr1 log file /var/log/frr.log log syslog informational no ip forwarding no ipv6 forwarding service integrated-vtysh-config ! ip prefix-list REDISTRIBUTE-KERNEL-TO-OSPF-LOOPBACK-BLOCK seq 10 permit 192.168.32.0/24 ge 32 ip prefix-list REDISTRIBUTE-STATIC-TO-OSPF-LOOPBACK-BLOCK seq 10 permit 192.168.32.0/24 ge 32 ip prefix-list REDISTRIBUTE-CONNECTED-TO-OSPF-LOOPBACK-BLOCK seq 10 permit 192.168.32.0/24 ge 32 ! interface tenant no ip ospf passive exit ! router ospf ospf router-id 192.168.32.101 redistribute kernel route-map REDISTRIBUTE-KERNEL-TO-OSPF redistribute connected route-map REDISTRIBUTE-CONNECTED-TO-OSPF redistribute static route-map REDISTRIBUTE-STATIC-TO-OSPF passive-interface default network 10.80.6.0/24 area 0 exit ! route-map REDISTRIBUTE-KERNEL-TO-OSPF permit 10 match ip address prefix-list REDISTRIBUTE-KERNEL-TO-OSPF-LOOPBACK-BLOCK exit ! route-map REDISTRIBUTE-STATIC-TO-OSPF permit 10 match ip address prefix-list REDISTRIBUTE-STATIC-TO-OSPF-LOOPBACK-BLOCK exit ! route-map REDISTRIBUTE-CONNECTED-TO-OSPF permit 10 match ip address prefix-list REDISTRIBUTE-CONNECTED-TO-OSPF-LOOPBACK-BLOCK exit ! end
FRR2 OSPF
frr version 10.2.1 frr defaults traditional hostname frr2 log file /var/log/frr.log log syslog informational no ip forwarding no ipv6 forwarding service integrated-vtysh-config ! ip prefix-list REDISTRIBUTE-KERNEL-TO-OSPF-LOOPBACK-BLOCK seq 10 permit 192.168.32.0/24 ge 32 ip prefix-list REDISTRIBUTE-STATIC-TO-OSPF-LOOPBACK-BLOCK seq 10 permit 192.168.32.0/24 ge 32 ip prefix-list REDISTRIBUTE-CONNECTED-TO-OSPF-LOOPBACK-BLOCK seq 10 permit 192.168.32.0/24 ge 32 ! ! interface tenant no ip ospf passive exit ! router ospf ospf router-id 192.168.32.102 redistribute kernel route-map REDISTRIBUTE-KERNEL-TO-OSPF redistribute connected route-map REDISTRIBUTE-CONNECTED-TO-OSPF redistribute static route-map REDISTRIBUTE-STATIC-TO-OSPF passive-interface default network 10.80.6.0/24 area 0 exit ! route-map REDISTRIBUTE-KERNEL-TO-OSPF permit 10 match ip address prefix-list REDISTRIBUTE-KERNEL-TO-OSPF-LOOPBACK-BLOCK exit ! route-map REDISTRIBUTE-STATIC-TO-OSPF permit 10 match ip address prefix-list REDISTRIBUTE-STATIC-TO-OSPF-LOOPBACK-BLOCK exit ! route-map REDISTRIBUTE-CONNECTED-TO-OSPF permit 10 match ip address prefix-list REDISTRIBUTE-CONNECTED-TO-OSPF-LOOPBACK-BLOCK exit ! end
Проверка работы OSPF
Соседи видят друг-друга
frr1# show ip ospf neighbor
Neighbor ID Pri State Up Time Dead Time Address Interface RXmtL RqstL DBsmL 192.168.32.102 1 Full/DR 22h48m06s 30.094s 10.80.6.252 tenant:10.80.6.253 0 0 0
frr2# show ip ospf neighbor
Neighbor ID Pri State Up Time Dead Time Address Interface RXmtL RqstL DBsmL 192.168.32.101 1 Full/Backup 22h48m23s 33.773s 10.80.6.253 tenant:10.80.6.252 0 0 0
Просмотр базы данных OSPF (на примере frr2):
show ip ospf database
OSPF Router with ID (192.168.32.102)
Router Link States (Area 0.0.0.0)
Link ID ADV Router Age Seq# CkSum Link count
192.168.32.101 192.168.32.101 1533 0x80000032 0x037a 1
192.168.32.102 192.168.32.102 1542 0x80000032 0xe497 1
Net Link States (Area 0.0.0.0)
Link ID ADV Router Age Seq# CkSum
10.80.6.252 192.168.32.102 1692 0x80000030 0x6e90
AS External Link States
Link ID ADV Router Age Seq# CkSum Route
192.168.32.1 192.168.32.101 1683 0x80000030 0xe233 E2 192.168.32.1/32 [0x0]
192.168.32.1 192.168.32.102 1552 0x80000030 0xdc38 E2 192.168.32.1/32 [0x0]
192.168.32.2 192.168.32.101 1563 0x80000030 0xd83c E2 192.168.32.2/32 [0x0]
192.168.32.2 192.168.32.102 1612 0x80000030 0xd241 E2 192.168.32.2/32 [0x0]
192.168.32.101 192.168.32.101 1483 0x80000030 0xf6ba E2 192.168.32.101/32 [0x0]
192.168.32.102 192.168.32.102 12 0x80000031 0xe4c9 E2 192.168.32.102/32 [0x0]
|
Уточнение: |
EVPN
Cхема работы (приблизительная
<TODO>
Существует два типа информации о доступности сети, которую VTEP передает через BGP EVPN:
- VNI, в которых они заинтересованы (маршруты L3)
- локальный MAC-адрес для каждого VNI (маршруты L2)
Начальная настройка BGP
На начальном этапе в конфигурации отсутствуют VxLAN интерфейсы, пока просто проверка что BGP-сессия поднимаются нормально.
- В качестве адреса используется интерфейс loopback - так как он всегда поднят, не зависит от физического состояния линка (адрес на нем может быть доступен через несколько линков в общем случае, при наличии динамической маршрутизации, это общаяя практика)
- Номер AS - 65000 из частного диапазона, одинаковый на обоих маршрутизаторах
neighbor fabric peer-group- не смотря на то что у нас всего один neighbor описываем группу - так проще будет расширять- bgp router-id 192.168.32.101 - задать идентификатор роутера (что бы он был однозначен а не выбран автоматически)
- neighbor fabric update-source 192.168.32.101 - указать с какого адреса отправлять обновления. Если этого не сделать то будет выбран адрес интерфейса, в результате пакеты будут уходить не с тем адресом который ожидает сосед, и сессия не поднимется. ("костыль" тут это использовать адреса интерфейсов)
FRR1
router bgp 65000 bgp router-id 192.168.32.101 no bgp default ipv4-unicast neighbor fabric peer-group neighbor fabric remote-as 65000 neighbor fabric update-source 192.168.32.101 neighbor fabric capability extended-nexthop neighbor 192.168.32.102 peer-group fabric ! address-family l2vpn evpn neighbor fabric activate exit-address-family exit
FRR1
router bgp 65000 bgp router-id 192.168.32.102 no bgp default ipv4-unicast neighbor fabric peer-group neighbor fabric remote-as 65000 neighbor fabric update-source 192.168.32.102 neighbor fabric capability extended-nexthop neighbor 192.168.32.101 peer-group fabric ! address-family l2vpn evpn neighbor fabric activate exit-address-family exit
Проверка BGP
frr1# show bgp summary
L2VPN EVPN Summary: BGP router identifier 192.168.32.101, local AS number 65000 VRF default vrf-id 0 BGP table version 0 RIB entries 0, using 0 bytes of memory Peers 1, using 24 KiB of memory Peer groups 1, using 64 bytes of memory Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd PfxSnt Desc 192.168.32.102 4 65000 1411 1411 0 0 0 23:28:54 0 0 FRRouting/10.2.1 Total number of neighbors 1
L2EVPN не является IP что можно видеть по ошибке ниже:
<BRE>
frr1# sho ip bgp summary
% No BGP neighbors found in VRF default
Никаких маршрутов пока нет
frr1# show bgp
No BGP prefixes displayed, 0 exist
Добавление конечных точек VTEP
Для начала добвляются конечные точки только на одно роутере - FRR1
Для добавления VTEP используется скрипт, рассчитаный на добавление множества VTEP но в целях упрощения добавляем только один.
- seq 11025 11025 даст список из 1 элемента - 11025
- LOCAL_IP="192.168.32.101" - source-адрес VxLAN-тунелей (loopback, причины его использования такие же как и для BGP)
- для FRR2 LOCAL_IP="192.168.32.102"
#!/bin/bash
LOCAL_IP="192.168.32.101"
for vni in $(seq 11025 11025) ; do
# Create VXLAN interface
ip link add vxlan${vni} type vxlan \
id ${vni} \
dstport 4789 \
local ${LOCAL_IP} \
nolearning
brctl addbr br-vni${vni}
brctl addif br-vni${vni} vxlan${vni}
brctl stp br-vni${vni} off
ip link set up dev br-vni${vni}
ip link set up dev vxlan${vni}
done
В результате работы скрипта будет создан 1 VxLAN-тунель и добавлен в бридж
7: vxlan11025: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-vni11025 state UNKNOWN mode DEFAULT group default qlen 1000
link/ether 66:f8:b3:52:6b:af brd ff:ff:ff:ff:ff:ff
# brctl show bridge name bridge id STP enabled interfaces br-vni11025 8000.5e240380730e no vxlan11025
BGP после добавления конечных точек
Можно увидеть доступный VNI (номер его 11025 ожидаемо совпадает с добавленным)
show bgp evpn vni
Advertise Gateway Macip: Disabled Advertise SVI Macip: Disabled Advertise All VNI flag: Enabled BUM flooding: Head-end replication VXLAN flooding: Enabled Number of L2 VNIs: 1 Number of L3 VNIs: 0 Flags: * - Kernel VNI Type RD Import RT Export RT MAC-VRF Site-of-Origin Tenant VRF * 11025 L2 192.168.32.101:2 65000:11025 65000:11025 default
Однако маршрут в BGP отсутвует (show bgp evpn route)
Для того что бы маршрут появился требуется добавить строчку в конфигурацию
advertise-all-vni
address-family l2vpn evpn neighbor fabric activate advertise-all-vni exit-address-family
После чего маршрут появляется в BGP
|
В случае нескольких VNI анонсированны будут все |
Маршруты
show bgp evpn route
BGP table version is 3, local router ID is 192.168.32.101
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal
Origin codes: i - IGP, e - EGP, ? - incomplete
EVPN type-1 prefix: [1]:[EthTag]:[ESI]:[IPlen]:[VTEP-IP]:[Frag-id]
EVPN type-2 prefix: [2]:[EthTag]:[MAClen]:[MAC]:[IPlen]:[IP]
EVPN type-3 prefix: [3]:[EthTag]:[IPlen]:[OrigIP]
EVPN type-4 prefix: [4]:[ESI]:[IPlen]:[OrigIP]
EVPN type-5 prefix: [5]:[EthTag]:[IPlen]:[IP]
Network Next Hop Metric LocPrf Weight Path
Extended Community
Route Distinguisher: 192.168.32.101:2
*> [3]:[0]:[32]:[192.168.32.101]
192.168.32.101 32768 i
ET:8 RT:65000:11025
Или более подробно
frr1# show bgp evpn route detail
Route Distinguisher: 192.168.32.101:2
BGP routing table entry for 192.168.32.101:2:[3]:[0]:[32]:[192.168.32.101]
Paths: (1 available, best #1)
Advertised to non peer-group peers:
192.168.32.102
Route [3]:[0]:[32]:[192.168.32.101] VNI 11025
Local
192.168.32.101 from 0.0.0.0 (192.168.32.101)
Origin IGP, weight 32768, valid, sourced, local, best (First path received)
Extended Community: ET:8 RT:65000:11025
Last update: Thu Feb 13 10:52:39 2025
PMSI Tunnel Type: Ingress Replication, label: 11025
Displayed 1 prefixes (1 paths)
Это Маршрут типа 3 (подробно маршрут такого типа разобран по ссылке)
Тип маршрута виден из [3]:[0]:[32]:[192.168.32.101] выделенной части вывода
Тут отмечу коротко что он означает:
- Route_Distinguisher 192.168.32.101:2
192.168.32.101:2:[3]:[0]:[32]:[192.168.32.101]Advertised to non peer-group peers: 192.168.32.102Route [3]:[0]:[32]:[192.168.32.101] VNI 11025
Команды
show bgp summary
- show evpn mac vni all
- show bgp evpn vni