Skip to content

Instantly share code, notes, and snippets.

@vorlon001
Last active October 24, 2026 06:41
Show Gist options
  • Select an option

  • Save vorlon001/d5247c1eea25b1e7272db22dbe0ebd86 to your computer and use it in GitHub Desktop.

Select an option

Save vorlon001/d5247c1eea25b1e7272db22dbe0ebd86 to your computer and use it in GitHub Desktop.
EVPN L2 FRR GLM example

L2 EVPN (VXLAN) на FRR: 3 ВМ + netns, 10.0.0.0/24

example: https://docs.frrouting.org/en/latest/evpn.html

Схема

      netns host1          netns host2          netns host3
      10.0.0.11/24         10.0.0.12/24         10.0.0.13/24
          | veth               | veth               | veth
        [br0]                [br0]                [br0]
          | vxlan0 VNI 10010   |                    |
      VTEP 192.168.100.1   VTEP 192.168.100.2   VTEP 192.168.100.3
          eth1                 eth1                 eth1
          └─────── underlay 192.168.100.0/24 ───────┘
              eBGP 65001 ↔ 65002 ↔ 65003, AFI l2vpn evpn
n1 n2 n3
underlay (eth1) 192.168.100.1/24 192.168.100.2/24 192.168.100.3/24
AS 65001 65002 65003
netns host1 host2 host3
IP в netns 10.0.0.11/24 10.0.0.12/24 10.0.0.13/24

VNI одинаковый на всех — 10010. Управляющий протокол — BGP EVPN (маршруты Type-2 MAC/IP, Type-3 для BUM), дата-плейн — VXLAN UDP/4789.

1. Data plane (одинаковый скрипт на каждой ВМ, правите только переменные)

#!/usr/bin/env bash
set -e
# ================= параметры =================
IF_U=eth1                  # underlay-интерфейс
IP_U=192.168.100.1/24      # underlay IP = VTEP IP
VNI=10010
BR=br0
NS=host1                   # host2 / host3 на других нодах
NS_IP=10.0.0.11/24         # 10.0.0.12/24 / 10.0.0.13/24
# =============================================

modprobe vxlan
sysctl -w net.ipv4.ip_forward=1
sysctl -w net.ipv4.conf.all.rp_filter=0

ip addr add $IP_U dev $IF_U 2>/dev/null || true
ip link set $IF_U up

# bridge + VTEP
ip link add $BR type bridge
ip link set $BR mtu 1450
ip link add vxlan0 type vxlan id $VNI local ${IP_U%/*} dstport 4789 nolearning
ip link set vxlan0 mtu 1450
ip link set vxlan0 master $BR
ip link set vxlan0 up
ip link set $BR up

# veth в netns
ip link add veth_h type veth peer name veth_ns
ip link set veth_h mtu 1450 master $BR
ip link set veth_h up
ip netns add $NS
ip link set veth_ns netns $NS
ip -n $NS link set lo up
ip -n $NS link set veth_ns mtu 1450 up
ip -n $NS addr add $NS_IP dev veth_ns

Ключевые моменты:

  • nolearning на vxlan — MAC'ы учим только через BGP EVPN, не data-plane'ом;
  • local <VTEP_IP> — FRR zebra автоматически подхватит этот адрес как VTEP IP и рекламит его в Type-3 (это и даёт head-end replication для BUM вместо мультикаста);
  • MTU 1450 на br0/veth, т.к. VXLAN съедает ~50 байт.

2. FRR

/etc/frr/daemons — включить:

zebra=yes
bgpd=yes

/etc/frr/frr.conf на n1:

frr version 8.4
frr defaults traditional
hostname n1
log file /var/log/frr/frr.log
service integrated-vtysh-config
!
ip forwarding
!
router bgp 65001
 bgp router-id 192.168.100.1
 no bgp ebgp-requires-policy
 neighbor 192.168.100.2 remote-as 65002
 neighbor 192.168.100.3 remote-as 65003
 !
 address-family l2vpn evpn
  neighbor 192.168.100.2 activate
  neighbor 192.168.100.3 activate
  advertise-all-vni
 exit-address-family
!
line vty
!
end

На n2/n3 — то же самое с AS 65002/65003, своими router-id и двумя соседями (полный mesh). advertise-all-vni заставляет BGP автоматически рекламить все VNI, найденные zebra в ядре (RD/RT генерируются сами: <router-id>:<vni> / <as>:<vni>).

systemctl restart frr

Важно: FRR поднимайте после создания vxlan/bridge — иначе VNI не будет обнаружен.

3. Проверка

# соседства поднялись?
vtysh -c 'show bgp l2vpn evpn summary'          # State/PfxRcd > 0

# VNI виден и активен, есть remote VTEP'ы
vtysh -c 'show evpn vni'
vtysh -c 'show evpn vni 10010'

# пришедшие EVPN-маршруты (Type-2 MAC/IP, Type-3 IMET)
vtysh -c 'show bgp l2vpn evpn'

# выученные MAC-адреса
vtysh -c 'show evpn mac vni 10010'
bridge fdb show | grep -E 'extern_learn|dst'

Связность:

ip netns exec host1 ping 10.0.0.12      # первый ping: ARP-запрос пойдёт как BUM через head-end replication
ip netns exec host1 ping 10.0.0.13
tcpdump -ni eth1 udp port 4789          # видим VXLAN-пакеты между нодами

После первого ping'а MAC'и появятся в EVPN (Type-2) и трафик между известными MAC пойдёт уже unicast'ом.

4. Грабли

  1. Firewall — между ВМ должен ходить UDP/4789 (iptables -I INPUT -p udp --dport 4789 -j ACCEPT на всякий случай).
  2. MTU: если underlay 1500 — инкапсулированный пакет дропнется; либо MTU 1450 на br0/veth (как выше), либо поднимите MTU на eth1 в лабе.
  3. rp_filter — на underlay-интерфейсе лучше 0, иначе потеря с不对称ным трафиком VXLAN.
  4. no bgp ebgp-requires-policy обязателен на FRR ≥ 7.3 для eBGP без route-policy.
  5. Если ВМ имеет только один NAT-интерфейс — используйте его IP как VTEP (local <ip ВМ>), но через NAT VXLAN не пробросить, хосты должны видеть друг друга напрямую по L3.
  6. BUM (ARP/неизвестный unicast) в такой схеме реплицируется на все изученные VTEP (head-end replication) — мультикаст в underlay не нужен. Для подавления ARP-флуда потом можно включить ARP suppression (FRR шлёт Type-2 с IP).

Источники по синтаксису и автоматическому head-end replication: дока FRR по EVPN, L2 EVPN lab от networkop, EVPN VXLAN с FRR в EVE-NG, разбор BUM/head-end replication в FRR.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment