VXLAN : poser l'adresse VTEP locale — EVPN inopérant entre deux hyperviseurs two #51
Labels
No labels
bug fix
feature implementation
new feature
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
syonad/two#51
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Constat
Entre deux hyperviseurs gérés par two, le trafic d'un subnet
vxlanne passe pas : les VM d'un mêmesubnet ne se joignent pas d'un hyperviseur à l'autre.
two crée ses VXLAN (
internal/netif.CreateVxlan, appelé parsubnet.setupVxlanHost) avec lepériphérique parent (
dev <local_iface>,VtepDevIndex) mais sans adresse source (local) :FRR voit bien la VNI (
advertise-all-vni), mais sans adresse VTEP locale :bgpd ne compte alors aucune L2 VNI (
Number of L2 VNIs: 0) et n'annonce aucune route EVPN pourcet hyperviseur. Avec
nolearning, la FDB du VXLAN n'est remplie que par EVPN : sans annonce, aucunVTEP distant n'est connu, l'ARP ne traverse pas.
Mesuré
Lab #50 (Scaleway, 2026-10-04) — deux hyperviseurs Debian 12, release
0.2.0rc002, FRR 10.7.1,même VPC et même subnet
vxlansur les deux, une VM de chaque côté :ip link set vxlan-<id> type vxlan local <IP>des deux côtésLocal VTEP IP(null)00:00:00:00:00:00 dst <autre VTEP>ping -M do -s 1472)lab1 — le ping fonctionne alors que son VXLAN n'a pas de
local(Local VTEP IP: 0.0.0.0) :l'autre extrémité est le routeur de test (
192.168.14.1), qui a une adresse VTEP et l'annonce.lab1 l'apprend par EVPN et envoie vers lui, le noyau choisissant l'adresse source par la table de
routage. Un seul VTEP correct suffit donc dans ce cas ; deux hyperviseurs gérés par two ne se
voient pas. (Au passage, la session EVPN de lab1 n'était pas établie depuis environ six semaines :
sa configuration FRR était en AS 66000 au lieu de 64600 — sans lien avec ce ticket, corrigé.)
Décision
L'adresse VTEP locale est l'adresse IPv4 primaire, de portée globale, du
local_ifacedusubnet — le périphérique déjà passé au VXLAN. Pas de loopback, pas d'option de configuration :
l'hyperviseur reste le plus simple possible, une adresse sur le réseau des VM. Un bridge ou une
interface supplémentaire (pour un VPC d'administration, par exemple) ne change rien : on prend
l'adresse du
local_ifacedu subnet concerné.IFA_F_SECONDARY) ; elles sontécartées, comme les adresses de portée lien.
local_iface: la création du VXLAN échoue avec un messageexplicite, plutôt que de créer un VXLAN muet.
Patch proposé
internal/netif/vxlan.go:AF_INETvient desyscallet les deux valeurs du noyau (RT_SCOPE_UNIVERSE = 0,IFA_F_SECONDARY = 0x01) sont des constantes du paquet :unix.RT_SCOPE_UNIVERSE,unix.IFA_F_SECONDARYetnetlink.FAMILY_V4n'existent que sous Linux, et le paquet doit compilersur macOS.
Le choix de l'adresse est une fonction pure (
vtepAddress), testée sur macOS(
internal/netif/vxlan_test.go, 4 tests) : adresse primaire globale retenue ; secondaires etportée lien écartées ; interface sans adresse utilisable refusée (aucune adresse, seulement des
secondaires, seulement de portée lien, seulement de l'IPv6) ; adresse rendue sur 4 octets.
Validé sur le lab #50 : agent compilé avec ce patch sur les deux hyperviseurs, nouvelle VPC et
nouveau subnet
vxlansans aucune retouche manuelle —localposé par two, VTEP distant appris parEVPN, ping et MTU 1500 VM ↔ VM entre hyperviseurs.
Reste à trancher
local, et un redémarrage de l'agent ne lesrecrée pas. Soit les recréer, soit une migration au démarrage de l'agent —
ip link set vxlan-<id> type vxlan local <IP>s'applique à chaud, sans recréer l'interface (vérifié dans lelab et sur lab1). À décider selon les subnets
vxlanen service.du
local_ifacechange ensuite, le VXLAN garde l'ancienne.Analyse de risque
vxlandont lelocal_ifacen'a pas d'adresse IPv4primaire était créé (et ne fonctionnait pas entre hyperviseurs) ; il est désormais refusé à la
création (
Executeen erreur, étaterror). Choix délibéré : un échec visible plutôt qu'un VXLANmuet.
la table de routage — elle devient explicite.
rabaisse le VXLAN à 1450 alors que les VM sont à 1500 — les trames pleine taille sont perdues.
L'underlay doit être à 1550 au moins.
règles internes.
Trouvé pendant #50 (lab multi-nœud), qui en dépend pour ses scénarios EVPN (E5).
Tests du patch — nouveau fichier
internal/netif/vxlan_test.go, exécutables sur macOS (go test ./internal/netif) :