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.
#!/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 байт.
/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 не будет обнаружен.
# соседства поднялись?
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'ом.
- Firewall — между ВМ должен ходить UDP/4789 (
iptables -I INPUT -p udp --dport 4789 -j ACCEPTна всякий случай). - MTU: если underlay 1500 — инкапсулированный пакет дропнется; либо MTU 1450 на br0/veth (как выше), либо поднимите MTU на eth1 в лабе.
- rp_filter — на underlay-интерфейсе лучше
0, иначе потеря с不对称ным трафиком VXLAN. no bgp ebgp-requires-policyобязателен на FRR ≥ 7.3 для eBGP без route-policy.- Если ВМ имеет только один NAT-интерфейс — используйте его IP как VTEP (
local <ip ВМ>), но через NAT VXLAN не пробросить, хосты должны видеть друг друга напрямую по L3. - 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.