Multi-datacenter VXLAN/EVPN fabric with:
- Per-DC autonomous systems (AS 65000 for DC1, AS 65001 for DC2)
- eBGP underlay with numbered /31 spine-leaf P2P links
- EVPN overlay with per-DC RR (route reflector) architecture
- Multi-tenant segmentation (5 tenants × 5 VLANs each)
- Symmetric IRB for inter-tenant routing
- Full infrastructure-as-code with Arista AVD
- Containerlab-based testing and validation
- eBGP on all links (no iBGP at leaf layer)
- Easy to scale with new leaves
- Fast convergence on failover
graph TD
subgraph DC1["DC1 UNDERLAY (AS 65000)<br/>Loopback: 10.0.0.0/24 | P2P: 10.1.0.0/16"]
S1["dc1-spine1<br/>10.0.0.1<br/>AS 65000"]
S2["dc1-spine2<br/>10.0.0.2<br/>AS 65000"]
L1["dc1-leaf1<br/>10.0.0.10<br/>AS 65101"]
L2["dc1-leaf2<br/>10.0.0.11<br/>AS 65102"]
L3["dc1-leaf3<br/>10.0.0.12<br/>AS 65103"]
L4["dc1-leaf4<br/>10.0.0.13<br/>AS 65104"]
S1 -->|E1: 10.1.0.0/31| L1
S1 -->|E2: 10.1.0.2/31| L2
S1 -->|E3: 10.1.0.4/31| L3
S1 -->|E4: 10.1.0.6/31| L4
S2 -->|E1: 10.1.1.0/31| L1
S2 -->|E2: 10.1.1.2/31| L2
S2 -->|E3: 10.1.1.4/31| L3
S2 -->|E4: 10.1.1.6/31| L4
end
style S1 fill:#fff9c4
style S2 fill:#fff9c4
style L1 fill:#b3e5fc
style L2 fill:#b3e5fc
style L3 fill:#b3e5fc
style L4 fill:#b3e5fc
router bgp 65000
bgp log-neighbor-changes
neighbor 10.1.0.1 remote-as 65101 # dc1-leaf1
neighbor 10.1.0.3 remote-as 65102 # dc1-leaf2
neighbor 10.1.0.5 remote-as 65103 # dc1-leaf3
neighbor 10.1.0.7 remote-as 65104 # dc1-leaf4
!
address-family ipv4 unicast
redistribute connected
neighbor 10.1.0.1 activate
neighbor 10.1.0.3 activate
neighbor 10.1.0.5 activate
neighbor 10.1.0.7 activate
exit-address-family
DC1 and DC2 spines peer via eBGP for EVPN reachability:
DC1-Spine1 (AS 65000) ←→ DC2-Spine1 (AS 65001) [10.3.0.0/31]
DC1-Spine1 (AS 65000) ←→ DC2-Spine2 (AS 65001) [10.3.0.2/31]
DC1-Spine2 (AS 65000) ←→ DC2-Spine1 (AS 65001) [10.3.0.4/31]
DC1-Spine2 (AS 65000) ←→ DC2-Spine2 (AS 65001) [10.3.0.6/31]
This allows DC1 leaves to advertise routes to DC2 leaves and vice versa.
- Isolation: Per-DC EVPN domains with inter-DC connectivity
- Scalability: RR architecture vs full-mesh
- Multi-tenancy: VRF per tenant (extensible)
graph TD
subgraph DC1["DC1 OVERLAY (AS 65000)<br/>All devices use same AS for iBGP"]
RR["Route Reflectors<br/>Spines with RR enabled<br/>Cluster ID: 10.0.0.1"]
L1["dc1-leaf1<br/>iBGP Client"]
L2["dc1-leaf2<br/>iBGP Client"]
L3["dc1-leaf3<br/>iBGP Client"]
L4["dc1-leaf4<br/>iBGP Client"]
RR ---|iBGP| L1
RR ---|iBGP| L2
RR ---|iBGP| L3
RR ---|iBGP| L4
L1 ---|EVPN<br/>Routes| RR
L2 ---|EVPN<br/>Routes| RR
L3 ---|EVPN<br/>Routes| RR
L4 ---|EVPN<br/>Routes| RR
end
style RR fill:#c8e6c9
style L1 fill:#b3e5fc
style L2 fill:#b3e5fc
style L3 fill:#b3e5fc
style L4 fill:#b3e5fc
-
Type 1 (EAD - Ethernet Auto-Discovery)
- Signals leaf is active in VLAN
- Used for all-active multihoming (future)
-
Type 2 (MAC/IP)
- Carries MAC+IP bindings
- Enables MAC learning on remote VTEP
-
Type 3 (Inclusive Multicast)
- VXLAN tunnel source
- Remote VTEP discovery
-
Type 4 (ES Route)
- For MLAG scenarios (not in scope)
-
Type 5 (IP Prefix)
- Inter-tenant routing via symmetric IRB
Per-device RD: ASN:Loopback0
dc1-leaf1: 65000:10.0.0.10
dc1-leaf2: 65000:10.0.0.11
dc2-leaf1: 65001:10.0.1.10
dc2-leaf2: 65001:10.0.1.11
Per-VLAN RT (export/import):
For tenant1-vlan100:
Route Target: 65000:10100
All leaves in DC1 export/import
DC2 leaves also import (for multi-DC)
Per-VRF RT (symmetric IRB):
For default VRF:
Route Target: 65000:999
All spines/leaves export/import
Each tenant has dedicated VLANs and routing context:
Tenant1:
VLAN 100 → VNI 10100 → RT 65000:10100
VLAN 101 → VNI 10101 → RT 65000:10101
VLAN 102 → VNI 10102 → RT 65000:10102
VLAN 103 → VNI 10103 → RT 65000:10103
VLAN 104 → VNI 10104 → RT 65000:10104
[Repeat for Tenants 2-5 with different VLAN/VNI ranges]
Traffic isolation:
- Hosts in Tenant1 VLAN 100 cannot reach Tenant2 VLAN 100 (different RT)
- Unless explicitly routed via inter-tenant gateway (L3)
Tenant1: VLANs 100-104, VNIs 10100-10104
Tenant2: VLANs 110-114, VNIs 10110-10114
Tenant3: VLANs 120-124, VNIs 10120-10124
Tenant4: VLANs 130-134, VNIs 10130-10134
Tenant5: VLANs 140-144, VNIs 10140-10144
L3 VRF: VLAN 999, VNI 999 (symmetric IRB)
SVI Interfaces:
VLAN 100.1: 192.168.100.1/24 (Tenant1)
VLAN 101.1: 192.168.101.1/24 (Tenant1)
VLAN 102.1: 192.168.102.1/24 (Tenant1)
VLAN 103.1: 192.168.103.1/24 (Tenant1)
VLAN 104.1: 192.168.104.1/24 (Tenant1)
VLAN 110.1: 192.168.110.1/24 (Tenant2)
... (rest of tenants)
VXLAN Mappings:
Ingress:
Host MAC from VLAN 100 → VNI 10100 encap
Egress:
VNI 10100 → VLAN 100 decap → Host
Enables inter-tenant routing (L3) with consistent ingress/egress:
sequenceDiagram
participant HostA as Host A<br/>Tenant1, VLAN100
participant Leaf1 as dc1-leaf1<br/>IRB Gateway
participant Leaf2 as dc1-leaf2<br/>Tenant2 Owner
participant HostB as Host B<br/>Tenant2, VLAN110
HostA->>Leaf1: Send to 192.168.100.1<br/>(default gateway)
activate Leaf1
Leaf1->>Leaf1: Routing lookup<br/>Destination: 192.168.110.0/24
Leaf1->>Leaf1: Encapsulate in VXLAN<br/>L3 VNI 999
Leaf1->>Leaf2: VXLAN Tunnel
deactivate Leaf1
activate Leaf2
Leaf2->>Leaf2: Decapsulate<br/>VXLAN L3 VNI 999
Leaf2->>Leaf2: IRB Routing
Leaf2->>HostB: Deliver to VLAN110
deactivate Leaf2
Note over Leaf1,Leaf2: Symmetric: Both leaves<br/>perform IRB routing
vrf definition TENANT_VRF
rd 65000:999
route-target export 65000:999
route-target import 65000:999
interface VLAN 100
vrf forwarding TENANT_VRF
ip address 192.168.100.1 255.255.255.0
interface VLAN 110
vrf forwarding TENANT_VRF
ip address 192.168.110.1 255.255.255.0
interface Loopback1
vrf forwarding TENANT_VRF
ip address 10.0.0.110 255.255.255.255
description "Anycast gateway IP for symmetric IRB"
All VXLAN tunnels source from Loopback0:
dc1-leaf1: Tunnel source 10.0.0.10
dc1-leaf2: Tunnel source 10.0.0.11
dc1-leaf3: Tunnel source 10.0.0.12
dc1-leaf4: Tunnel source 10.0.0.13
dc2-leaf1: Tunnel source 10.0.1.10
... (etc)
Why Loopback0?
✓ Stable, doesn't change with interface flaps
✓ Routable via BGP underlay
✓ Independent of physical link topology
sequenceDiagram
participant L1 as dc1-leaf1<br/>10.0.0.10
participant RR as DC1 Spines<br/>Route Reflectors
participant ICS as Inter-DC<br/>Spines
participant L2 as dc2-leaf1<br/>10.0.1.10
Note over L1: Learns VNI 10100<br/>owner via EVPN
L1->>RR: EVPN Type 3<br/>Inclusive Multicast
RR->>ICS: Advertise EVPN routes
ICS->>L2: Route reaches DC2
Note over L1,L2: VXLAN Tunnel Created:<br/>10.0.0.10 → 10.0.1.10
L1->>L2: Original Frame<br/>[ETH][IP:10.0.0.10→10.0.1.10]<br/>[UDP:4789][VXLAN]<br/>[Original VLAN100 Frame]
L2->>L2: Decapsulate VXLAN<br/>Extract VLAN100 frame
L2-->>L1: Bidirectional tunnel<br/>also active
Configuration on each leaf:
interface Vxlan1
vxlan source-interface Loopback0
vxlan udp-port 4789
vxlan vlan 100 vni 10100
vxlan vlan 101 vni 10101
... (repeat for all 25 VLANs per DC)
graph LR
A["1. Deploy<br/>Topology"] --> B["2. Configure<br/>Loopbacks & P2P"]
B --> C["3. Enable<br/>BGP"]
C --> D["4. Verify<br/>Neighbors"]
D --> E{All<br/>Established?}
E -->|No| C
E -->|Yes| F["✓ Phase 1<br/>Complete"]
style A fill:#e1bee7
style F fill:#c8e6c9
style E fill:#fff9c4
graph LR
A["1. Enable EVPN<br/>on Spines"] --> B["2. Enable EVPN<br/>on Leaves"]
B --> C["3. Create VLANs"]
C --> D["4. Configure<br/>SVIs"]
D --> E["5. Enable VXLAN"]
E --> F["6. Verify<br/>Routes"]
F --> G{Routes<br/>Present?}
G -->|No| E
G -->|Yes| H["✓ Phase 2<br/>Complete"]
style A fill:#e1bee7
style H fill:#c8e6c9
style G fill:#fff9c4
graph LR
A["1. Configure<br/>VRF"] --> B["2. Configure<br/>SVIs"]
B --> C["3. Enable<br/>Loopback1"]
C --> D["4. Test<br/>Connectivity"]
D --> E{Working?}
E -->|No| C
E -->|Yes| F["✓ Phase 3<br/>Complete"]
style A fill:#e1bee7
style F fill:#c8e6c9
style E fill:#fff9c4
graph LR
A["1. Verify<br/>BGP Peers"] --> B["2. Verify<br/>VXLAN Tunnels"]
B --> C["3. Test Host<br/>Across DCs"]
C --> D["4. Run<br/>Tests"]
D --> E{All<br/>Passing?}
E -->|No| C
E -->|Yes| F["✓ Complete<br/>Deployment"]
style A fill:#e1bee7
style F fill:#c8e6c9
style E fill:#fff9c4
- Create new host_vars file with unique:
- Device name
- Loopback IPs
- ASN
- P2P IPs
- Add to containerlab topology
- Ansible playbook handles the rest
- Create new VLAN/VNI ranges in group_vars
- Configure SVIs per leaf
- Define new RT values
- No changes to existing tenants
- Define new fabric AS (65002, 65003, etc.)
- Create new group_vars/dc{n}*.yml
- Create new host_vars for all devices
- Add inter-DC spine peering
- Ansible handles the deployment
- Onboard devices to CVP
- Use CloudVision for change approval
- Event-based alerting
- Automated rollback on config failure
- Add segment routing alongside ECMP
- Enable traffic engineering (TE)
- Implement SR-MPLS or SRv6
✓ BGP neighbor state
✓ Interface status
✓ Loopback reachability
✓ EVPN route count
✓ Host-to-host in same VLAN
✓ Host-to-host in different VLANs (same tenant)
✓ Inter-tenant routing
✓ Multi-DC reachability
✓ Failover scenarios
○ 1000+ MAC addresses per VLAN
○ Convergence time after spine failure
○ Data plane traffic during reconvergence
- RFC 8365: A Network Virtualization Overlay Solution Using EVPN — VXLAN data plane for EVPN
- RFC 7432: BGP MPLS-Based Ethernet VPN — EVPN control plane
- Arista AVD Documentation
Document Version: 1.1
Last Updated: March 2026