<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>VXLAN on MEDDAH Mohamed</title><link>https://meddah.systems/tags/vxlan/</link><description>Recent content in VXLAN on MEDDAH Mohamed</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Wed, 20 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://meddah.systems/tags/vxlan/index.xml" rel="self" type="application/rss+xml"/><item><title>Building an EVPN/VXLAN Datacenter Fabric from Scratch with Linux and FRRouting</title><link>https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/</link><pubDate>Wed, 20 May 2026 00:00:00 +0000</pubDate><guid>https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/</guid><description>&lt;img src="https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/cover.webp" alt="Featured image of post Building an EVPN/VXLAN Datacenter Fabric from Scratch with Linux and FRRouting" /&gt;&lt;h1 id="building-an-evpnvxlan-datacenter-fabric-from-scratch-with-linux-and-frrouting"&gt;&lt;a href="#building-an-evpnvxlan-datacenter-fabric-from-scratch-with-linux-and-frrouting" class="header-anchor"&gt;&lt;/a&gt;Building an EVPN/VXLAN Datacenter Fabric from Scratch with Linux and FRRouting
&lt;/h1&gt;&lt;p&gt;Traditional datacenter networking has a ceiling. VLANs cap at 4,094 segments. Spanning Tree blocks redundant links. Flood-and-learn burns bandwidth at scale. If you have worked with any of these constraints in production, you already know the pain.&lt;/p&gt;
&lt;p&gt;EVPN/VXLAN is what replaced all of that. It is the fabric technology running inside every major cloud provider and modern datacenter today, from VMware NSX to Cisco ACI to OpenStack Neutron. But most engineers interact with it through vendor GUIs and abstraction layers, never seeing what actually happens at the protocol level.&lt;/p&gt;
&lt;p&gt;This post walks through building a complete EVPN/VXLAN Spine-Leaf fabric from scratch, using nothing but Linux nodes, FRRouting, and GNS3. No vendor appliances, no black boxes. Just protocols, packets, and Wireshark captures to prove it all works.&lt;/p&gt;
&lt;h2 id="why-evpnvxlan-over-traditional-vlanstp"&gt;&lt;a href="#why-evpnvxlan-over-traditional-vlanstp" class="header-anchor"&gt;&lt;/a&gt;Why EVPN/VXLAN Over Traditional VLAN/STP
&lt;/h2&gt;&lt;p&gt;Before getting into the build, it helps to understand why this architecture exists.&lt;/p&gt;
&lt;p&gt;A classic datacenter network relies on VLANs for segmentation and STP for loop prevention. That design has three fundamental problems at scale:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Segment limit&lt;/strong&gt;: VLAN IDs are 12 bits. That gives you 4,094 usable segments. In a multi-tenant datacenter, that runs out fast.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;STP link waste&lt;/strong&gt;: Spanning Tree prevents loops by blocking redundant links. You pay for bandwidth you cannot use.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flood storms&lt;/strong&gt;: Unknown unicast and broadcast traffic floods the entire L2 domain. The bigger the domain, the worse the noise.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;VXLAN (RFC 7348) solves the first problem by using a 24-bit VNI (VXLAN Network Identifier), giving you roughly 16 million virtual segments. It encapsulates L2 frames inside UDP packets, which means your overlay traffic rides on a standard L3 routed underlay. No STP needed. All links carry traffic via ECMP.&lt;/p&gt;
&lt;p&gt;EVPN (RFC 7432) solves the third problem by replacing flood-and-learn with a proper control plane. VTEPs advertise their local MAC/IP bindings proactively via BGP, so remote VTEPs know exactly where to send traffic before the first data packet ever crosses the wire.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/classic_vs_vxlan.png"
width="2816"
height="1536"
srcset="https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/classic_vs_vxlan_hu_fabf24b3fef06432.png 480w, https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/classic_vs_vxlan_hu_c714834ed443745e.png 1024w"
loading="lazy"
alt="Classic datacenter VLAN/STP architecture vs modern VXLAN/EVPN Spine-Leaf"
class="gallery-image"
data-flex-grow="183"
data-flex-basis="440px"
&gt;&lt;/p&gt;
&lt;h2 id="the-architecture-underlay-and-overlay"&gt;&lt;a href="#the-architecture-underlay-and-overlay" class="header-anchor"&gt;&lt;/a&gt;The Architecture: Underlay and Overlay
&lt;/h2&gt;&lt;p&gt;The design separates concerns into two layers:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Underlay&lt;/strong&gt;: A pure L3 IP network running OSPF. Its only job is to provide reachability between VTEP loopback addresses. It has no knowledge of virtual segments, tenant traffic, or MAC addresses.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Overlay&lt;/strong&gt;: Virtual L2 segments stretched across the underlay via VXLAN tunnels. From the perspective of a VM sitting inside the overlay, it sees a flat Ethernet network. It has no awareness of the IP fabric underneath.&lt;/p&gt;
&lt;p&gt;Think of it this way: the underlay is the highway system. The overlay is a private courier service that uses those highways to deliver its packages (L2 frames), with its own internal addressing that the highway infrastructure never needs to understand.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/flux.png"
width="1672"
height="941"
srcset="https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/flux_hu_625b78ebdf6f5c1a.png 480w, https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/flux_hu_9cbdcb0dcaaee89.png 1024w"
loading="lazy"
alt="VXLAN Overlay vs IP Underlay separation of concerns"
class="gallery-image"
data-flex-grow="177"
data-flex-basis="426px"
&gt;&lt;/p&gt;
&lt;h2 id="lab-topology"&gt;&lt;a href="#lab-topology" class="header-anchor"&gt;&lt;/a&gt;Lab Topology
&lt;/h2&gt;&lt;p&gt;The lab runs a Spine-Leaf topology in GNS3 with Linux nodes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;1 Spine&lt;/strong&gt;: Acts as the BGP Route Reflector. It participates only in the control plane, never touches VXLAN data traffic.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2+ Leaves&lt;/strong&gt;: Linux nodes configured as VTEPs. Each one hosts endpoints (simulated via network namespaces) and runs both the VXLAN data plane and the BGP EVPN control plane.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/archi.png"
width="1672"
height="941"
srcset="https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/archi_hu_659239c2b6741250.png 480w, https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/archi_hu_105f365b0e15ca1c.png 1024w"
loading="lazy"
alt="Spine-Leaf architecture diagram"
class="gallery-image"
data-flex-grow="177"
data-flex-basis="426px"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/archi_gns3.png"
width="1078"
height="428"
srcset="https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/archi_gns3_hu_cb761d548c558f69.png 480w, https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/archi_gns3_hu_da67bd083cd00b9e.png 1024w"
loading="lazy"
alt="Lab topology in GNS3"
class="gallery-image"
data-flex-grow="251"
data-flex-basis="604px"
&gt;&lt;/p&gt;
&lt;h2 id="setting-up-the-underlay"&gt;&lt;a href="#setting-up-the-underlay" class="header-anchor"&gt;&lt;/a&gt;Setting Up the Underlay
&lt;/h2&gt;&lt;p&gt;The underlay needs to accomplish one thing: every VTEP loopback must be reachable from every other VTEP loopback. OSPF handles that.&lt;/p&gt;
&lt;p&gt;On each Leaf node, assign the physical interface and the loopback:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Leaf-1: physical interface toward the Spine&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ip addr add 192.168.1.2/30 dev eth0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ip link set eth0 up
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Loopback (this is the VTEP address)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ip addr add 10.0.0.1/32 dev lo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then configure OSPF in FRRouting (&lt;code&gt;/etc/frr/frr.conf&lt;/code&gt;):&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;router ospf
ospf router-id 10.0.0.1
network 192.168.1.0/30 area 0
network 10.0.0.1/32 area 0
passive-interface lo
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Before touching anything else, verify the underlay is converged:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ping 10.0.0.2 &lt;span style="color:#75715e"&gt;# Other Leaf loopback&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ping 10.0.0.254 &lt;span style="color:#75715e"&gt;# Spine loopback&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If these pings fail, nothing else will work. The entire overlay depends on underlay IP reachability between VTEPs.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/screen1.png"
width="652"
height="511"
srcset="https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/screen1_hu_1452e79e3bdf72d5.png 480w, https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/screen1_hu_981ac032c566a43e.png 1024w"
loading="lazy"
alt="OSPF neighbor verification on the Spine"
class="gallery-image"
data-flex-grow="127"
data-flex-basis="306px"
&gt;&lt;/p&gt;
&lt;h2 id="configuring-the-vxlan-data-plane"&gt;&lt;a href="#configuring-the-vxlan-data-plane" class="header-anchor"&gt;&lt;/a&gt;Configuring the VXLAN Data Plane
&lt;/h2&gt;&lt;p&gt;With the underlay converged, each Leaf needs three things: a Linux bridge, a VXLAN interface, and an endpoint.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 1. Create the bridge&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ip link add br10 type bridge &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; ip link set br10 up
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 2. Create the VXLAN interface (VNI 10, VXLAN port 4789)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ip link add vxlan10 type vxlan id &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt; dstport &lt;span style="color:#ae81ff"&gt;4789&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; local 10.0.0.1 nolearning
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ip link set vxlan10 up
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 3. Attach VXLAN to the bridge&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ip link set vxlan10 master br10
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 4. Create a simulated endpoint (network namespace)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ip netns add vm1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ip link add veth0 type veth peer name veth1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ip link set veth1 netns vm1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ip link set veth0 master br10 &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; ip link set veth0 up
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ip netns exec vm1 ip addr add 172.16.10.11/24 dev veth1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ip netns exec vm1 ip link set veth1 up
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The critical flag here is &lt;code&gt;nolearning&lt;/code&gt;. It tells the VXLAN interface not to do data-plane MAC learning. That responsibility gets delegated entirely to the EVPN control plane, which is the whole point.&lt;/p&gt;
&lt;h2 id="the-control-plane-bgp-evpn-with-frrouting"&gt;&lt;a href="#the-control-plane-bgp-evpn-with-frrouting" class="header-anchor"&gt;&lt;/a&gt;The Control Plane: BGP EVPN with FRRouting
&lt;/h2&gt;&lt;p&gt;This is where the architecture comes together. FRRouting runs BGP with the L2VPN EVPN address family, distributing MAC/IP reachability information between VTEPs.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/FRRouting.png"
width="1536"
height="1024"
srcset="https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/FRRouting_hu_2d4360811f047071.png 480w, https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/FRRouting_hu_b4acdea28819b47a.png 1024w"
loading="lazy"
alt="FRRouting daemon architecture and Linux kernel integration"
class="gallery-image"
data-flex-grow="150"
data-flex-basis="360px"
&gt;&lt;/p&gt;
&lt;h3 id="spine-configuration-route-reflector"&gt;&lt;a href="#spine-configuration-route-reflector" class="header-anchor"&gt;&lt;/a&gt;Spine Configuration (Route Reflector)
&lt;/h3&gt;&lt;p&gt;The Spine does not run VXLAN. It only reflects BGP EVPN routes between the Leaves:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;router bgp 65000
bgp router-id 10.0.0.254
neighbor LEAVES peer-group
neighbor LEAVES remote-as 65000
neighbor LEAVES update-source lo
neighbor 10.0.0.1 peer-group LEAVES
neighbor 10.0.0.2 peer-group LEAVES
!
address-family l2vpn evpn
neighbor LEAVES activate
neighbor LEAVES route-reflector-client
exit-address-family
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Without a Route Reflector, you would need a full-mesh of iBGP sessions between all VTEPs. That is N×(N-1)/2 sessions. The RR collapses that to N sessions.&lt;/p&gt;
&lt;h3 id="leaf-configuration-vtep"&gt;&lt;a href="#leaf-configuration-vtep" class="header-anchor"&gt;&lt;/a&gt;Leaf Configuration (VTEP)
&lt;/h3&gt;&lt;p&gt;Each Leaf peers with the Spine and advertises all locally discovered VNIs:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;router bgp 65000
bgp router-id 10.0.0.1
neighbor 10.0.0.254 remote-as 65000
neighbor 10.0.0.254 update-source lo
!
address-family l2vpn evpn
neighbor 10.0.0.254 activate
advertise-all-vni
exit-address-family
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The &lt;code&gt;advertise-all-vni&lt;/code&gt; directive is what triggers automatic discovery. FRRouting scans the Linux kernel for all VXLAN interfaces, reads their VNIs, and generates the corresponding EVPN routes without any manual mapping.&lt;/p&gt;
&lt;h3 id="what-happens-at-convergence"&gt;&lt;a href="#what-happens-at-convergence" class="header-anchor"&gt;&lt;/a&gt;What Happens at Convergence
&lt;/h3&gt;&lt;p&gt;Once BGP sessions establish, the following sequence plays out:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Each Leaf sends a &lt;strong&gt;Type 3 IMET route&lt;/strong&gt; (Inclusive Multicast Ethernet Tag) announcing its participation in VNI 10.&lt;/li&gt;
&lt;li&gt;Each Leaf sends &lt;strong&gt;Type 2 MAC/IP routes&lt;/strong&gt; for every locally learned endpoint.&lt;/li&gt;
&lt;li&gt;The Spine reflects all routes to all peers.&lt;/li&gt;
&lt;li&gt;On receiving a remote Type 2 route, FRR&amp;rsquo;s &lt;code&gt;zebra&lt;/code&gt; daemon calls the Linux kernel via Netlink to insert a static FDB entry on the local &lt;code&gt;vxlan10&lt;/code&gt; interface, pointing the remote MAC to the remote VTEP&amp;rsquo;s IP.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The result: every VTEP knows every endpoint&amp;rsquo;s location before any data traffic is exchanged. No flooding required.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/screen2.png"
width="652"
height="615"
srcset="https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/screen2_hu_aec97492307905ef.png 480w, https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/screen2_hu_fe98755fc8a06053.png 1024w"
loading="lazy"
alt="BGP summary showing established EVPN sessions"
class="gallery-image"
data-flex-grow="106"
data-flex-basis="254px"
&gt;&lt;/p&gt;
&lt;h2 id="verifying-the-fabric"&gt;&lt;a href="#verifying-the-fabric" class="header-anchor"&gt;&lt;/a&gt;Verifying the Fabric
&lt;/h2&gt;&lt;h3 id="evpn-route-table"&gt;&lt;a href="#evpn-route-table" class="header-anchor"&gt;&lt;/a&gt;EVPN Route Table
&lt;/h3&gt;&lt;p&gt;Check the full EVPN route table on the Spine:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vtysh -c &lt;span style="color:#e6db74"&gt;&amp;#34;show bgp l2vpn evpn&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You should see Type 2 (MAC/IP) and Type 3 (IMET) routes from every Leaf, each with its VTEP loopback as the next-hop and the Route Target (RT) identifying VNI 10.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/screen3.png"
width="656"
height="680"
srcset="https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/screen3_hu_d731cb8e2bbd8593.png 480w, https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/screen3_hu_5c56cec7fb84a5c0.png 1024w"
loading="lazy"
alt="Full EVPN route table on the Spine showing Type 2 and Type 3 routes"
class="gallery-image"
data-flex-grow="96"
data-flex-basis="231px"
&gt;&lt;/p&gt;
&lt;h3 id="type-2-routes-macip"&gt;&lt;a href="#type-2-routes-macip" class="header-anchor"&gt;&lt;/a&gt;Type 2 Routes (MAC/IP)
&lt;/h3&gt;&lt;p&gt;Filter specifically for MAC/IP advertisements:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vtysh -c &lt;span style="color:#e6db74"&gt;&amp;#34;show bgp l2vpn evpn route type macip&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Each entry shows a MAC address, optionally with an associated IP, the originating VTEP, and the Route Distinguisher. These are the entries that get programmed into remote FDB tables.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/screen9.png"
width="647"
height="701"
srcset="https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/screen9_hu_f4f06dae935063e3.png 480w, https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/screen9_hu_faeccd9cceecd185.png 1024w"
loading="lazy"
alt="Type 2 MAC/IP routes from all VTEPs"
class="gallery-image"
data-flex-grow="92"
data-flex-basis="221px"
&gt;&lt;/p&gt;
&lt;h3 id="type-3-routes-imetmulticast"&gt;&lt;a href="#type-3-routes-imetmulticast" class="header-anchor"&gt;&lt;/a&gt;Type 3 Routes (IMET/Multicast)
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vtysh -c &lt;span style="color:#e6db74"&gt;&amp;#34;show bgp l2vpn evpn route type multicast&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;These define the BUM (Broadcast, Unknown unicast, Multicast) flood list. Only VTEPs that have announced a Type 3 route for a given VNI receive BUM traffic for that VNI.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/screen10.png"
width="658"
height="439"
srcset="https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/screen10_hu_9efd8b3dba201cf5.png 480w, https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/screen10_hu_b44b41806d68505a.png 1024w"
loading="lazy"
alt="Type 3 IMET routes for BUM replication"
class="gallery-image"
data-flex-grow="149"
data-flex-basis="359px"
&gt;&lt;/p&gt;
&lt;h3 id="fdb-entries"&gt;&lt;a href="#fdb-entries" class="header-anchor"&gt;&lt;/a&gt;FDB Entries
&lt;/h3&gt;&lt;p&gt;On a Leaf, inspect the bridge FDB to confirm that EVPN has populated remote MAC entries:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;bridge fdb show dev vxlan10
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You should see entries with &lt;code&gt;extern_learn&lt;/code&gt; flag pointing remote MACs to remote VTEP IPs. These were not learned from data traffic. They were injected by FRR via Netlink based on received EVPN Type 2 routes.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/screen5.png"
width="663"
height="458"
srcset="https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/screen5_hu_3a84302ced6ad6f.png 480w, https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/screen5_hu_cea7ec7ec9dd9336.png 1024w"
loading="lazy"
alt="FDB entries and VNI verification on Leaf-1"
class="gallery-image"
data-flex-grow="144"
data-flex-basis="347px"
&gt;&lt;/p&gt;
&lt;h3 id="connectivity-test"&gt;&lt;a href="#connectivity-test" class="header-anchor"&gt;&lt;/a&gt;Connectivity Test
&lt;/h3&gt;&lt;p&gt;The ultimate validation is a simple ping across the fabric:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ip netns exec vm1 ping -c &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt; 172.16.10.12
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Zero packet loss confirms the full stack is working: OSPF underlay reachability, VXLAN encapsulation/decapsulation on UDP/4789, and EVPN control plane distributing the correct forwarding state.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/screen4.png"
width="664"
height="451"
srcset="https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/screen4_hu_57bb1a715b25291e.png 480w, https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/screen4_hu_e1de7873ca6f48ff.png 1024w"
loading="lazy"
alt="Successful cross-fabric ping and ARP resolution"
class="gallery-image"
data-flex-grow="147"
data-flex-basis="353px"
&gt;&lt;/p&gt;
&lt;h2 id="how-a-packet-actually-crosses-the-fabric"&gt;&lt;a href="#how-a-packet-actually-crosses-the-fabric" class="header-anchor"&gt;&lt;/a&gt;How a Packet Actually Crosses the Fabric
&lt;/h2&gt;&lt;p&gt;Understanding the data path end-to-end is critical. Here is what happens when vm1 on Leaf-1 sends a frame to vm2 on Leaf-2:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The frame exits the namespace via &lt;code&gt;veth1&lt;/code&gt; and arrives on bridge &lt;code&gt;br10&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The bridge consults its FDB (populated by EVPN/FRR). It finds a match: the destination MAC is reachable via &lt;code&gt;vxlan10&lt;/code&gt;, next-hop VTEP 10.0.0.2.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vxlan10&lt;/code&gt; encapsulates the original L2 frame: adds a VXLAN header (VNI 10), wraps it in UDP (destination port 4789), then in IP (source: 10.0.0.1, destination: 10.0.0.2).&lt;/li&gt;
&lt;li&gt;The encapsulated packet is routed through the underlay via OSPF to Leaf-2.&lt;/li&gt;
&lt;li&gt;Leaf-2&amp;rsquo;s &lt;code&gt;vxlan10&lt;/code&gt; interface decapsulates, strips the outer headers, and delivers the original L2 frame to its local &lt;code&gt;br10&lt;/code&gt;, which forwards it to the destination namespace.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src="https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/Datapath.png"
width="1536"
height="1024"
srcset="https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/Datapath_hu_ce49b9f2dc6f4f1f.png 480w, https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/Datapath_hu_a5fd8f87b766e0bd.png 1024w"
loading="lazy"
alt="Complete data path: VM to bridge to VXLAN to underlay"
class="gallery-image"
data-flex-grow="150"
data-flex-basis="360px"
&gt;&lt;/p&gt;
&lt;h2 id="the-difference-flood-and-learn-vs-evpn"&gt;&lt;a href="#the-difference-flood-and-learn-vs-evpn" class="header-anchor"&gt;&lt;/a&gt;The Difference: Flood-and-Learn vs EVPN
&lt;/h2&gt;&lt;p&gt;This comparison captures the fundamental shift:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Flood-and-Learn (reactive)&lt;/strong&gt;: A VTEP receives a frame for an unknown MAC. It floods it to every other VTEP. The receiving VTEPs learn the source MAC from the data traffic itself. This generates enormous BUM traffic at scale.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;EVPN (proactive)&lt;/strong&gt;: Before any data packet is sent, VTEPs proactively advertise their local MACs via BGP Type 2 routes. Remote VTEPs pre-populate their FDB tables. When the first data packet arrives, the destination is already known. No flooding needed.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/flood_vs_bgp.png"
width="2816"
height="1536"
srcset="https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/flood_vs_bgp_hu_fc43e078ea7da3d4.png 480w, https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/flood_vs_bgp_hu_3e86bb3a209f122.png 1024w"
loading="lazy"
alt="Flood-and-Learn vs EVPN proactive control plane"
class="gallery-image"
data-flex-grow="183"
data-flex-basis="440px"
&gt;&lt;/p&gt;
&lt;h2 id="evpn-route-types"&gt;&lt;a href="#evpn-route-types" class="header-anchor"&gt;&lt;/a&gt;EVPN Route Types
&lt;/h2&gt;&lt;p&gt;Two route types carry the core signaling:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Type 2 (MAC/IP Advertisement)&lt;/strong&gt;: &amp;ldquo;MAC X with IP Y is behind me, on VNI Z.&amp;rdquo; This is what populates the FDB on remote VTEPs with unicast forwarding entries.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Type 3 (IMET - Inclusive Multicast Ethernet Tag)&lt;/strong&gt;: &amp;ldquo;I exist as a participant in VNI Z, send me BUM traffic for that segment.&amp;rdquo; This builds the per-VNI flood list.&lt;/p&gt;
&lt;p&gt;There are additional types (Type 1 for multi-homing, Type 5 for IP prefix routes in L3 VPN scenarios), but Type 2 and Type 3 are what make the basic L2 overlay function.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/types.png"
width="1672"
height="941"
srcset="https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/types_hu_f8fca3bc666bc8ed.png 480w, https://meddah.systems/post/infrastructure/evpn-vxlan-datacenter-fabric/types_hu_c19b762415daf8f.png 1024w"
loading="lazy"
alt="EVPN Route Type 2 (MAC/IP) and Type 3 (IMET) signaling"
class="gallery-image"
data-flex-grow="177"
data-flex-basis="426px"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: In the diagram above, VTEP-3 is labeled 10.0.0.2/32 instead of 10.0.0.3/32.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="where-this-gets-used-in-production"&gt;&lt;a href="#where-this-gets-used-in-production" class="header-anchor"&gt;&lt;/a&gt;Where This Gets Used in Production
&lt;/h2&gt;&lt;p&gt;This is not a lab exercise for its own sake. EVPN/VXLAN is the production standard for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Multi-tenant isolation&lt;/strong&gt;: Each tenant gets dedicated VNIs. IP address ranges can overlap across tenants without conflict. EVPN distributes routes only to authorized VTEPs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Live VM migration&lt;/strong&gt;: When a VM migrates between hypervisors, the new VTEP generates a fresh Type 2 route. Remote FDB tables update within milliseconds via BGP. The VM keeps its MAC and IP. Zero network reconfiguration.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;STP replacement&lt;/strong&gt;: The routed underlay eliminates L2 loops by design. All links carry traffic. ECMP distributes load.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Distributed anycast gateway&lt;/strong&gt;: The same gateway IP and MAC are configured on every Leaf. VMs always route through a local gateway, avoiding traffic tromboning to a centralized router.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="security-considerations"&gt;&lt;a href="#security-considerations" class="header-anchor"&gt;&lt;/a&gt;Security Considerations
&lt;/h2&gt;&lt;p&gt;From an infrastructure security perspective, VXLAN has a significant gap: it provides no native authentication or encryption. An attacker with access to the underlay network can inject arbitrary frames into the overlay by crafting VXLAN-encapsulated packets with a valid VNI. Similarly, the BGP EVPN control plane is susceptible to route poisoning if BGP sessions are not properly secured with MD5 authentication or TCP-AO.&lt;/p&gt;
&lt;p&gt;In production deployments, this is typically addressed through:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IPsec or MACsec on the underlay&lt;/li&gt;
&lt;li&gt;BGP session authentication&lt;/li&gt;
&lt;li&gt;Microsegmentation policies enforced at the hypervisor or Leaf level&lt;/li&gt;
&lt;li&gt;Strict ACLs on management plane access&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These attack vectors represent an active area of research in datacenter security.&lt;/p&gt;
&lt;h2 id="stack-and-references"&gt;&lt;a href="#stack-and-references" class="header-anchor"&gt;&lt;/a&gt;Stack and References
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tools used&lt;/strong&gt;: FRRouting, GNS3, Linux iproute2, Wireshark, BGP/OSPF&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key RFCs&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RFC 7348: VXLAN&lt;/li&gt;
&lt;li&gt;RFC 7432: BGP MPLS-Based Ethernet VPN (EVPN)&lt;/li&gt;
&lt;li&gt;RFC 8365: A Network Virtualization Overlay Solution Using EVPN&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Further reading&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dinesh Dutt, &lt;em&gt;Cloud Native Data Center Networking&lt;/em&gt;, O&amp;rsquo;Reilly Media, 2019&lt;/li&gt;
&lt;li&gt;Cisco VXLAN BGP EVPN Design and Deployment Guide (Cisco Validated Design)&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.frrouting.org/" target="_blank" rel="noopener"
&gt;FRRouting Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Source code&lt;/strong&gt;: The full project (configs, scripts, GNS3 topology, and diagrams) is available on GitHub: &lt;a class="link" href="https://github.com/mrmeddah/evpn-vxlan-datacenter-fabric" target="_blank" rel="noopener"
&gt;mrmeddah/evpn-vxlan-datacenter-fabric&lt;/a&gt;&lt;/p&gt;</description></item></channel></rss>