Home / Notes / VXLAN Tunnel Establishment Failure
NOTES · VXLAN / EVPN TROUBLESHOOTING

VXLAN Tunnel Won't Establish: EVPN Neighbors, Inclusive Routes and VPN Targets

A VXLAN tunnel that never comes up at all is a different fault from one that's up and flapping, or up and missing one route. This is the layer-by-layer order that finds it — the BGP EVPN neighbor, the route that actually builds the tunnel, and the VPN Target cross-match that decides whether that route is accepted.

By the AtlasCommTech engineering team — 13 years of carrier & enterprise network deployments · Updated July 2026

Three Layers, Split by Tunnel Type

A tunnel that never establishes fails at exactly one of three layers, and the layer depends on whether it's an L2 tunnel or an L3 tunnel.

In a BGP EVPN VXLAN distributed-gateway fabric, the tunnel between two VTEPs isn't configured directly — it's built dynamically once the right route is received. An L2 tunnel is built from a Type 3 Inclusive Multicast route; an L3 tunnel is built from a Type 5 IP Prefix route (also called an IRB route). Either route only gets accepted if the local VPN Target import list overlaps with what the remote side exported. A tunnel that won't establish at all, then, is failing at one of exactly three layers: the BGP EVPN neighbor itself, the route that builds that specific tunnel type, or the VPN Target cross-match that decides whether the route is let in.

This is different from a tunnel that comes up and later drops, or one where the tunnel exists but a specific route inside it is missing — those are their own faults, cross-referenced at the end of this note. What follows here is the three-layer split, the display bgp evpn checks for L2 and L3 tunnels side by side, the root causes behind each layer, and field-tested answers.

Read the Split Before You Touch Any Configuration

VXLAN tunnel-establishment failures split first by tunnel type — L2 or L3 — and then by the same three layers underneath both.

An L2 and an L3 tunnel share layer 1 (the BGP EVPN neighbor) but diverge at layer 2, because they're built from two different EVPN route types with two different configuration commands to check.

VXLAN Tunnel Won't Establish L2 Tunnel -- Type 3 Inclusive Route L3 Tunnel -- Type 5 IP Prefix Route Layer 1 · BGP EVPN neighbor not Establishedshared with the L3 branch -- loopback reachability, TCP session Layer 2 · Inclusive Multicast route not learnedNVE source address, generated locally, received remotely Layer 3 · VPN Target doesn't cross (EVPN instance)no evpn keyword at this level -- import/export-extcommunity Layer 1 · BGP EVPN neighbor not Establishedshared with the L2 branch -- same session, same checks Layer 2 · IP Prefix route not learnedVbdif gateway subnet, generated locally, received remotely Layer 3 · VPN Target doesn't cross (VPN instance)evpn keyword required -- export/import-extcommunity evpn

Diagram labels are kept in English for engineering clarity.

Layer 1 is shared — fix the neighbor once and both tunnel types benefit. Layers 2 and 3 are specific to which tunnel type you're chasing, and the commands genuinely differ between them.

Working Through Each Layer

One shared layer, then two tunnel-specific layers with their own route type and their own VPN Target command.

Layer 1 — BGP EVPN Neighbor Never Reaches Established

Neither tunnel type can build anything before this layer is solid — check it first regardless of whether you're chasing an L2 or L3 fault.

  1. Run display bgp evpn peer. Established with a non-zero PrefRcv means the neighbor layer is fine; go straight to layer 2 for the relevant tunnel type.
  2. If the peer isn't Established, find the source address each side uses for the BGP TCP session (usually a Loopback) with display current-configuration configuration bgp, then confirm the two loopbacks can actually reach each other: ping -a <local-loopback> <remote-loopback>.
  3. If the loopbacks can't reach each other, the fault is in IGP routing between the two VTEPs, not in BGP or EVPN at all — fix that first.
  4. If the loopbacks do reach each other, check display tcp status for the session between the two Router IDs; if it's not cleanly Established, something in the path (an ACL, a CPCAR limit, a middlebox) is dropping the BGP TCP packets themselves.
<VTEP2> display bgp evpn peer
BGP local router ID : 10.3.3.3
Local AS number : 100
Total number of peers : 2        Peers in established state : 2

 Peer          V      AS MsgRcvd MsgSent OutQ Up/Down             State PrefRcv

 10.1.1.1      4      100    4010    4016     0 0066h46m Established     1
 10.2.2.2      4      100    4009    4010     0 0066h40m Established     4

<VTEP2> ping -a 10.2.2.2 10.3.3.3
Reply from 10.3.3.3: bytes=32 time=1ms TTL=126
Ping statistics for 10.3.3.3:
   Packets: Sent = 4, Received = 4, Lost = 0 (0% loss)
// loopback-to-loopback reachable -> if peer still isn't Established, check TCP session state next

<VTEP2> display tcp status
TCPCB Tid/Soid Local Add:port   Foreign Add:port      VPNID State
49f3370c 262/8 10.2.2.2:53342     10.3.3.3:179       0      Established
49f339f4 262/7 10.2.2.2:55160   10.1.1.1:179       0      Established
// clean Established state here -> the neighbor layer is not the problem

Layer 2, L2 Tunnels — Inclusive Multicast (Type 3) Route Not Learned

An L2 tunnel between two VTEPs is built entirely from this one route type — if it isn't there, the tunnel isn't either.

  1. Find this VTEP's own NVE source address (display current-configuration interface nve 1) and its mask (display ip interface brief), then look up the Inclusive route in the format M:L:X.X.X.X — M is always 0, L is the source address's mask length, X.X.X.X is the source address itself.
  2. Confirm the route is generated locally: display bgp evpn all routing-table inclusive-route <M:L:X.X.X.X>. A local entry shows From: 0.0.0.0 and lists Advertised to such N peers.
  3. Run the same lookup for the remote VTEP's source address, on this VTEP. If it's missing, the route either wasn't generated on the remote side or isn't reaching this one — check the neighbor layer again and any route-policy in between.
  4. If the route is present both locally and remotely, the L2 tunnel should be building — move to the VPN Target check in layer 3.
<VTEP2> display current-configuration interface nve 1
interface Nve1
 source 10.2.2.2
 vni 10 head-end peer-list protocol bgp

<VTEP2> display bgp evpn all routing-table inclusive-route 0:32:10.2.2.2
Total routes of Route Distinguisher(1:10): 1
BGP routing table entry information of 0:32:10.2.2.2:
Imported route.
From: 0.0.0.0 (0.0.0.0)
Ext-Community: RT <1 : 100>, RT <10 : 1>, Tunnel Type <VxLan(8)>
Route Type: 3 (Inclusive Multicast Route)
Advertised to such 2 peers:
   10.3.3.3
   10.1.1.1
// From: 0.0.0.0 = generated locally; check the same prefix for the remote VTEP's source address next

Layer 2, L3 Tunnels — IP Prefix (Type 5) Route Not Learned

An L3 tunnel is built from the gateway's IP Prefix route instead — same idea, different route type and a different command.

  1. Find the Vbdif gateway address and mask for the subnet in question: display current-configuration interface vbdif <BD-ID>. The device generates the IP Prefix route from this gateway address automatically.
  2. Look up the route in the format L:X.X.X.X:M (L is always 0, X.X.X.X:M is the gateway subnet): display bgp evpn all routing-table prefix-route <L:X.X.X.X:M>.
  3. Confirm the same prefix shows up under the corresponding VPN-Instance entry, not just the EVPN address family — an L3 tunnel needs the route resolved into the VPN instance's own routing table, not just visible at the EVPN level.
  4. If it's missing on the remote side, work layer 1 again for that peer; if it's present remotely but missing locally, move to the VPN Target check.
<VTEP2> display current-configuration interface vbdif 10
interface Vbdif10
 ip binding vpn-instance vpn1
 ip address 192.168.10.1 255.255.255.0

<VTEP2> display bgp evpn all routing-table prefix-route 0:24:192.168.20.0
Total routes of Route Distinguisher(3:100): 1
BGP routing table entry information of 0:192.168.20.0:24:
Ext-Community: RT <1 : 100>, Tunnel Type <VxLan(8)>
Route Type: 5 (Ip Prefix Route)

VPN-Instance vpn1, Router ID 10.2.2.2:
BGP routing table entry information of 192.168.20.0/24:
Relay Tunnel Out-Interface: VXLAN
// showing up under VPN-Instance vpn1, not just the EVPN address family, is what confirms the L3 tunnel can actually use it

Layer 3 — VPN Target Doesn't Cross (Different Command for Each Tunnel Type)

The route arrived; the local side still has to let it in — and the command that controls that is different for L2 and L3 tunnels.

  1. For an L2 tunnel, compare the received Inclusive route's Ext-Community RT values against this VTEP's EVPN instance: display current-configuration configuration evpn-instance <name>. Look for vpn-target ... import-extcommunity (no evpn keyword at the end).
  2. For an L3 tunnel, compare the received IP Prefix route's Ext-Community RT values against this VTEP's VPN instance instead: display current-configuration configuration vpn-instance <name>. Look for vpn-target ... import-extcommunity evpn — note the trailing evpn keyword, which is easy to drop by habit if you're used to typing the L2 form.
  3. Either way, only one RT value has to overlap between what was received and what's configured to import — if there's no overlap at all, add the missing value to the relevant import-extcommunity line rather than changing the remote side.
// L2 -- EVPN instance, no "evpn" keyword
<VTEP2> display current-configuration configuration evpn-instance evpn10
evpn vpn-instance evpn10 bd-mode
 vpn-target 1:100 10:1 export-extcommunity
 vpn-target 10:1 import-extcommunity

// L3 -- VPN instance, "evpn" keyword required
<VTEP2> display current-configuration configuration vpn-instance vpn1
ip vpn-instance vpn1
 ipv4-family
  vpn-target 1:100 export-extcommunity evpn
  vpn-target 1:100 import-extcommunity evpn
 vxlan vni 100

5 Root Causes That Show Up Again and Again

Once the three layers above have told you where the problem sits, these five account for most of what's actually wrong.

1. BGP EVPN Neighbor Never Reaches Established Because the Loopbacks Can't Route to Each Other

SYMPTOMdisplay bgp evpn peer shows a peer stuck in a non-Established state indefinitely, and nothing downstream — no Inclusive route, no IP Prefix route — has anything to build on.

CAUSEBoth L2 and L3 tunnel-building routes ride on the same BGP EVPN session, and that session is sourced from a Loopback on each VTEP. If the IGP between the two VTEPs doesn't actually carry a route to the peer's Loopback, the TCP session behind BGP can't form at all, and it looks like an EVPN problem when it's really an IGP one.

FIXPing from the local Loopback source address to the remote one directly (ping -a <local> <remote>) before touching any EVPN or VPN-target configuration — if that fails, fix the IGP route first.

2. Something in the Path Silently Drops the BGP TCP Session

SYMPTOMThe two Loopbacks can ping each other fine, but display bgp evpn peer still won't reach Established.

CAUSEReachability between the two loopbacks confirms routing is fine, but doesn't confirm the BGP TCP session itself survives the path — a CPU-defend ACL, a CPCAR rate limit, or a middlebox somewhere in between can quietly drop TCP port 179 traffic while ICMP still gets through cleanly.

FIXCheck display tcp status for the actual session state between the two Router IDs; if it isn't cleanly Established, look for CPCAR limits or ACLs on the path that specifically affect TCP port 179, not just general reachability.

3. L2 Tunnel's Inclusive Route Generates Fine Locally but Never Gets Accepted Remotely

SYMPTOMdisplay bgp evpn all routing-table inclusive-route on the originating VTEP shows the route with From: 0.0.0.0 and lists it as advertised to the remote peer — but the remote VTEP's own lookup for the same prefix comes back empty.

CAUSEThe L2 tunnel's Inclusive Multicast route is only accepted at the remote end if that VTEP's EVPN instance import-extcommunity shares a value with the RT the route was exported with — with no overlap, the route is silently dropped on arrival, with no error on either side.

FIXCompare the remote VTEP's evpn-instance import-extcommunity directly against the Ext-Community RT values shown on the originating side's advertised route, not against what you assume was configured.

4. L3 Tunnel's Prefix Route Is Configured at the Wrong Level Entirely

SYMPTOMThe IP Prefix route looks correctly generated and even shows up in the EVPN address family on the receiving VTEP, but the tunnel to that gateway still won't build and the subnet stays unreachable.

CAUSEAn L3 tunnel needs its VPN Target configured under the VPN instance's ipv4-family with the trailing evpn keyword (vpn-target ... export-extcommunity evpn / import-extcommunity evpn) — configuring it as a plain vpn-target without that keyword, or configuring it under the EVPN instance instead (which is where the L2 form belongs), leaves the route visible at the EVPN level but never resolved into the VPN instance's own routing table.

FIXConfirm with display current-configuration configuration vpn-instance <name> that the export/import-extcommunity lines both carry the evpn keyword, and that the route shows up specifically under the VPN-Instance entry in the routing-table output, not only in the EVPN address family section above it.

5. L2 and L3 Tunnels to the Same Peer Fail Independently — Fixing One Doesn't Fix the Other

SYMPTOMAfter resolving an L2 tunnel-establishment issue between two VTEPs, the L3 tunnel between the same two devices still won't come up, and it reads as though the earlier fix didn't work.

CAUSEThe two tunnel types share only the BGP EVPN neighbor layer — everything above that (the route type, the VPN Target configuration level, the specific import/export command) is independent between L2 and L3. Fixing an EVPN-instance RT mismatch does nothing for a VPN-instance RT mismatch on the same box.

FIXTreat an L2 fix and an L3 fix as two separate tickets on the same neighbor pair, and re-run the layer 2 and layer 3 checks for each tunnel type on its own, even after the other one is confirmed working.

Related solution designs

Six Questions That Come Up Constantly

Pulled straight from the field — the ones worth having an answer ready for.

display bgp evpn peer shows Established — why isn't the tunnel there yet?

Established only confirms the BGP EVPN control-plane session is up between the two VTEPs. The tunnel itself still needs its route type — Inclusive Multicast for L2, IP Prefix for L3 — to be generated, advertised, received, and accepted through the VPN Target cross-match. A healthy neighbor with a missing or rejected route still produces no tunnel.

What's actually different between an Inclusive Multicast route and an IP Prefix route?

Inclusive Multicast (Route Type 3) is what builds an L2 VXLAN tunnel — it's tied to the VTEP's NVE source address and carries no host information at all, just "this VTEP exists and is reachable for this VNI." IP Prefix (Route Type 5) is what builds an L3 tunnel — it's tied to a specific gateway (Vbdif) subnet and is what an IRB gateway advertises so other VTEPs can route to that subnet through it.

My VPN Target values are identical on both ends — why does the route still get dropped?

Check which command level you actually configured it at. For an L2 tunnel the VPN Target lives under the EVPN instance (evpn vpn-instance ... vpn-target ... export/import-extcommunity, no trailing keyword); for an L3 tunnel it lives under the VPN instance's ipv4-family with the evpn keyword (vpn-target ... export/import-extcommunity evpn). Identical-looking RT numbers configured at the wrong level, or missing the evpn keyword on the L3 side, produce exactly this symptom.

How is a tunnel that "won't establish" different from one that's up but flapping, covered in the other VXLAN note?

This note assumes the tunnel has literally never come up — no BGP EVPN Established state, or no Inclusive/IP Prefix route ever accepted. If the tunnel did establish and then drops, flaps, or comes up fine but a VM migration or specific traffic flow behaves oddly, that's a different set of checks — see the VXLAN Overlay Faults note, which picks up from a tunnel that already exists.

The tunnel won't establish, but I can't find a missing route anywhere — what else is there?

If every route check in this note comes back clean — neighbor Established, Inclusive or IP Prefix route generated and received, VPN Target overlapping — and the tunnel still isn't forwarding traffic, the fault has moved past tunnel establishment into a different category: check whether a specific host's EVPN route is missing rather than the tunnel itself, covered in the EVPN Route Not Learned note.

Can I run all of these display and ping commands on a live production fabric?

Yes — every command in this note is read-only except for the loopback-to-loopback ping used to test reachability, which doesn't touch the fabric's data plane. None of them require configuration changes just to diagnose, so there's no reason to wait for a maintenance window before running the checks themselves.

Honest Limits of This Note

Honest Limits of This Note

This note is built around the Huawei CloudEngine-style BGP EVPN distributed-gateway fabric and its display bgp evpn peer / display bgp evpn all routing-table inclusive-route / prefix-route / display current-configuration configuration evpn-instance / vpn-instance commands, plus the field cases behind them. It assumes a standard two-tier (L2 + L3) EVPN VXLAN design and doesn't cover controller-orchestrated (SDN fabric) automatic underlay/overlay provisioning, where these same symptoms can trace back to the controller rather than to the device configuration shown here.

Tunnel between two VTEPs still won't come up?

Tell us which layer it's stuck at — neighbor, route, or VPN Target — plus whether it's an L2 or L3 tunnel, and the relevant display bgp evpn output, and we'll help you read it.

WhatsApp an engineer →

Related Reading