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][3]- тип маршрута[0]- В случае типа 3 это вероятно (но не точно!) VLAN ID (уточнить)[32]длинна следующего поля - IPv4[192.168.32.101]Источник маршрута
Advertised to non peer-group peers: 192.168.32.102- информация о том кому анонсируется маршрутRoute [3]:[0]:[32]:[192.168.32.101] VNI 11025VNI 11025- Номер VNI
Origin IGP, weight 32768, valid, sourced, local, best (First path received)источник маршрута - Internal Gateway ProtocolExtended Community: ET:8 RT:65000:11025ET:8Encapsulation Type 8 - тип зарезервированный за VxLANRT:65000:11025Route Target - поле на основании которого принимается решение куда (в какой VRF) помещать маршрут
Last update: Thu Feb 13 10:52:39 2025- Очевидно?PMSI Tunnel Type: Ingress Replication, label: 11025label: 11025- VNI 11025
|
Обратить внимание - это маршрут типа 3 и значит он применим только для Broadcast / Unknown Unicast / Multicast (BUM) трафика |
Добавление VNI на втором роутере (FFR2)
После добавлениея интерфейса на втором роутере (тем же скриптом) и активации опции advertise-all-vni ожидаемо появляется второй маршрут (зеркальный по отношению к первому)
Network Next Hop Metric LocPrf Weight Path
Extended Community
Route Distinguisher: 192.168.32.101:2
*>i [3]:[0]:[32]:[192.168.32.101]
192.168.32.101 100 0 i
RT:65000:11025 ET:8
Route Distinguisher: 192.168.32.102:2
*> [3]:[0]:[32]:[192.168.32.102]
192.168.32.102 32768 i
ET:8 RT:65000:11025
Проверка работы BUM трафика
После того как в таблице маршрутизации присутвует 2 маршрута (прямой и обратный) Типа 3 ожидается что по ним можно будет отправлять например широковещательный трафик
Проверка
Добавить адреса на бриджи с обоих сторон=
FRR1
ip addr add 192.168.99.1/24 dev br-vni11025
FRR2
ip addr add 192.168.99.2/24 dev br-vni11025
Поднять бриджи
Команда одинаковая на обоих FRR
ip link set up dev br-vni11025
Проверить IP адрес
Команда одинаковая на обоих FRR, пример для FFR2
ip -4 a s dev br-vni11025
8: br-vni11025: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
inet 192.168.99.2/24 scope global br-vni11025
valid_lft forever preferred_lft forever
Проверить что маршрут указывает в правильный интерфейс
ip ro get 192.168.99.1
192.168.99.1 dev br-vni11025 src 192.168.99.2 uid 0
cache
Запустить ping с FRR2 (192.168.99.2) на FRR1 (192.168.99.1)
Тут видно что на VXLAN есть arp-запросы
root@frr1:/etc/frr# tcpdump -n -ee -i vxlan11025 tcpdump: verbose output suppressed, use -v[v]... for full protocol decode listening on vxlan11025, link-type EN10MB (Ethernet), snapshot length 262144 bytes 17:34:36.096216 5e:24:03:80:73:0e > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Request who-has 192.168.99.1 tell 192.168.99.2, length 28 17:34:37.106661 5e:24:03:80:73:0e > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Request who-has 192.168.99.1 tell 192.168.99.2, length 28 17:34:38.130696 5e:24:03:80:73:0e > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Request who-has 192.168.99.1 tell 192.168.99.2, length 28
А на бридже есть как запросы так и ответы - но так как маршрут типа 3 только для BUM- трафика то ответы никуда дальше бриджа не уходят
tcpdump -n -ee -i br-vni11025 tcpdump: verbose output suppressed, use -v[v]... for full protocol decode listening on br-vni11025, link-type EN10MB (Ethernet), snapshot length 262144 bytes 17:42:34.674829 5e:24:03:80:73:0e > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Request who-has 192.168.99.1 tell 192.168.99.2, length 28 17:42:34.674914 5e:24:03:80:73:0e > 5e:24:03:80:73:0e, ethertype ARP (0x0806), length 42: Reply 192.168.99.1 is-at 5e:24:03:80:73:0e, length 28 17:42:35.698781 5e:24:03:80:73:0e > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Request who-has 192.168.99.1 tell 192.168.99.2, length 28
Подключение виртуальных CE
Для имитации CE я не буду создавать виртуальные машины, а использую просто veth один из которых включая в бридж, а второй "как бы" и есть CE
FRR2
Настройка интерфейса
Для начала добавляю конфигурацию на FRR2
ip link add dev pe2 type veth peer name ce2
brctl addif br-vni11025 pe2
ip link set up dev pe2
ip link set up dev ce2
Проверка BGP
show bgp evpn route
BGP table version is 3, local router ID is 192.168.32.102
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
*>i [3]:[0]:[32]:[192.168.32.101]
192.168.32.101 100 0 i
RT:65000:11025 ET:8
Route Distinguisher: 192.168.32.102:2
*> [2]:[0]:[48]:[ce:3b:3b:dc:8d:29]
192.168.32.102 32768 i
ET:8 RT:65000:11025
*> [3]:[0]:[32]:[192.168.32.102]
192.168.32.102 32768 i
ET:8 RT:65000:11025
Displayed 3 prefixes (3 paths)
frr2# 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)
Not advertised to any peer
Route [3]:[0]:[32]:[192.168.32.101]
Local
192.168.32.101 (metric 20) from 192.168.32.101 (192.168.32.101)
Origin IGP, localpref 100, valid, internal, best (First path received)
Extended Community: RT:65000:11025 ET:8
Last update: Thu Feb 13 10:52:39 2025
PMSI Tunnel Type: Ingress Replication, label: 11025
Route Distinguisher: 192.168.32.102:2
BGP routing table entry for 192.168.32.102:2:[2]:[0]:[48]:[ce:3b:3b:dc:8d:29]
Paths: (1 available, best #1)
Advertised to non peer-group peers:
192.168.32.101
Route [2]:[0]:[48]:[ce:3b:3b:dc:8d:29] VNI 11025
Local
192.168.32.102 from 0.0.0.0 (192.168.32.102)
Origin IGP, weight 32768, valid, sourced, local, best (First path received)
Extended Community: ET:8 RT:65000:11025
Last update: Fri Feb 14 13:42:50 2025
BGP routing table entry for 192.168.32.102:2:[3]:[0]:[32]:[192.168.32.102]
Paths: (1 available, best #1)
Advertised to non peer-group peers:
192.168.32.101
Route [3]:[0]:[32]:[192.168.32.102] VNI 11025
Local
192.168.32.102 from 0.0.0.0 (192.168.32.102)
Origin IGP, weight 32768, valid, sourced, local, best (First path received)
Extended Community: ET:8 RT:65000:11025
Last update: Thu Feb 13 17:24:02 2025
PMSI Tunnel Type: Ingress Replication, label: 11025
Displayed 3 prefixes (3 paths)
FRR1
Команды
show bgp summary
show evpn mac vni allshow bgp evpn vni