Site-to-site VPN is one of those topics you can't really learn from slides — you have to watch NHRP register, an IKEv2 SA come up, and a spoke-to-spoke shortcut form. This lab builds a DMVPN Phase 3 hub-and-spoke with IPsec protection on Cisco IOL (BYOI), so you can break it, fix it, and actually understand why the tunnel did or didn't come up.
Bottom line: A working DMVPN + IPsec lab means standing up a hub, two spokes, NHRP, an IKEv2/IPsec profile, and a routing protocol over the tunnel — easy to mistype, slow to debug. As of 2026, NetPilot deploys this topology with real CLIs in ~2 minutes — grab the prompt at the bottom and run it.
Lab topology
A single mGRE hub with two spokes. Routing runs over the tunnel (EIGRP here); DMVPN Phase 3 lets spokes build direct spoke-to-spoke tunnels on demand via NHRP redirect/shortcut.
[HUB] Tunnel0 10.0.0.1/24
/ \ (mGRE + IPsec, NHS)
underlay / \ underlay
/ \
[SPOKE1] 10.0.0.2/24 [SPOKE2] 10.0.0.3/24
LAN 192.168.1.0/24 LAN 192.168.2.0/24
\__ Phase 3 spoke-to-spoke shortcut __/- Overlay:
10.0.0.0/24onTunnel0(mGRE,tunnel key 100) - IPsec: IKEv2 + pre-shared key, transport mode protecting the GRE
- NHRP: hub is the next-hop server (NHS); Phase 3 uses
redirecton the hub andshortcuton spokes
Hub configuration
crypto ikev2 keyring DMVPN-KR
peer ANY
address 0.0.0.0 0.0.0.0
pre-shared-key NetPilotLab123
!
crypto ikev2 profile DMVPN-IKEV2
match identity remote address 0.0.0.0
authentication local pre-share
authentication remote pre-share
keyring local DMVPN-KR
!
crypto ipsec transform-set TS esp-aes esp-sha256-hmac
mode transport
crypto ipsec profile DMVPN-IPSEC
set transform-set TS
set ikev2-profile DMVPN-IKEV2
!
interface Ethernet0/0
description HUB underlay (NBMA / public)
ip address 203.0.113.1 255.255.255.0
!
interface Tunnel0
ip address 10.0.0.1 255.255.255.0
no ip redirects
ip nhrp authentication NHRPKEY
ip nhrp map multicast dynamic
ip nhrp network-id 1
ip nhrp redirect
no ip split-horizon eigrp 1
tunnel source Ethernet0/0
tunnel mode gre multipoint
tunnel key 100
tunnel protection ipsec profile DMVPN-IPSEC
!
router eigrp 1
network 10.0.0.0 0.0.0.255
network 192.168.0.0 0.0.255.255Ethernet0/0carries the hub's underlay (NBMA) address203.0.113.1— thetunnel sourceinterface must exist and be reachable before the mGRE tunnel or any IPsec SA can form.tunnel mode gre multipoint+ip nhrp map multicast dynamicis what makes one hub interface serve many spokes.ip nhrp redirecton the hub is the Phase 3 trigger that tells spokes to build a direct shortcut.no ip split-horizon eigrp 1lets the hub re-advertise one spoke's routes to another.
Underlay reachability. In a real deployment the underlay is the WAN/internet that carries traffic between the hub's
203.0.113.1and each spoke's public address; in this lab all three nodes share the203.0.113.0/24underlay segment, so NHRP registration and IKEv2/IPsec to203.0.113.1can come up.
Spoke configuration (SPOKE1)
interface Ethernet0/0
description SPOKE1 underlay (NBMA)
ip address 203.0.113.2 255.255.255.0
!
interface Tunnel0
ip address 10.0.0.2 255.255.255.0
ip nhrp authentication NHRPKEY
ip nhrp map 10.0.0.1 203.0.113.1
ip nhrp map multicast 203.0.113.1
ip nhrp nhs 10.0.0.1
ip nhrp network-id 1
ip nhrp shortcut
tunnel source Ethernet0/0
tunnel mode gre multipoint
tunnel key 100
tunnel protection ipsec profile DMVPN-IPSEC
!
interface Ethernet0/1
description SPOKE1 LAN
ip address 192.168.1.1 255.255.255.0
!
router eigrp 1
network 10.0.0.0 0.0.0.255
network 192.168.1.0 0.0.0.255Ethernet0/0is the spoke's underlay (NBMA) interface —203.0.113.2here, on the same203.0.113.0/24segment as the hub — and it's whattunnel source Ethernet0/0rides on. Without an underlay address reachable to the hub, the NHRP map to203.0.113.1has nowhere to go.- The
Ethernet0/1LAN (192.168.1.0/24) is what the EIGRPnetworkstatement advertises and what the verification ping sources from — without a real interface in that subnet, neither works. ip nhrp nhs 10.0.0.1plus the static map to the hub's underlay address (203.0.113.1) registers the spoke with the hub.ip nhrp shortcutis the spoke side of Phase 3 — it installs the redirect and builds the direct spoke-to-spoke tunnel.
SPOKE2 is identical with Ethernet0/0 underlay 203.0.113.3, Tunnel0 ip address 10.0.0.3, and its own LAN 192.168.2.0/24. (The crypto IKEv2/IPsec stanzas are the same on every node.)
One config, many vendors. DMVPN itself is Cisco-specific, but the underlying IKEv2/IPsec is standards-based. Ask the agent for a Juniper or FRR/strongSwan peer and it generates the equivalent site-to-site IPsec config — no hand-translating between vendors.
Verification
Lead with the agent — one prompt checks the whole VPN and translates per-device output:
"Show DMVPN and IPsec status on the hub and both spokes, then trigger and confirm a direct spoke1-to-spoke2 tunnel."
NetPilot runs the checks across all three routers in parallel and flags any tunnel that's IKE instead of UP. To verify by hand, SSH in and run:
! Hub
show dmvpn detail
show crypto ikev2 sa
show ip nhrp
! Spoke1 — generate spoke-to-spoke traffic, then re-check
ping 192.168.2.1 source 192.168.1.1
show dmvpn detailExpected: each spoke shows the hub as NHS and UP, the IKEv2 SAs are established, and after sourcing traffic between the spoke LANs a direct D (dynamic) entry appears between SPOKE1 and SPOKE2 — that's Phase 3 working.
Common DMVPN/IPsec gotchas
- NHRP won't register. Wrong NHS address, mismatched
ip nhrp authentication, or atunnel keymismatch — all show as a spoke stuck without a mapping. Check the key and the NHS map first. - Tunnel up, IPsec down. GRE forms but
show crypto ikev2 sais empty or stuck — usually a pre-shared-key or IKEv2 profile mismatch. The overlay can look "up" while no traffic is actually encrypted. - No spoke-to-spoke shortcut. You have
redirecton the hub but forgotshortcuton the spokes (or you're testing Phase 2 logic on a Phase 3 design). Shortcuts only appear after real spoke-to-spoke traffic. - MTU / fragmentation. GRE + IPsec overhead drops the effective MTU; large flows blackhole. Set
ip mtu 1400andip tcp adjust-mss 1360on the tunnel. - Recursive routing. If the tunnel's underlay route is learned through the tunnel, it flaps. Keep the underlay in a separate routing process (or static).
Build this lab with AI
Skip the typo-hunting and describe the intent:
"Build a DMVPN Phase 3 lab with one Cisco IOL hub and two spokes. Protect the mGRE tunnels with IKEv2 + IPsec (pre-shared key), run EIGRP over the overlay, and advertise a LAN behind each spoke. Verify NHRP registration, IPsec SAs, and a direct spoke-to-spoke shortcut."
NetPilot generates the hub and spoke configs, the crypto profiles, and the routing, deploys to cloud ContainerLab, and confirms the tunnels — then you SSH in to break and rebuild them. Iterate conversationally ("add a third spoke" or "swap PSK for certificate auth") and it updates every node.
Copy-paste ready: Grab the DMVPN hub-and-spoke prompt from our example library, or the site-to-site IPsec VPN prompt for the policy-based variant.
Want to practice VPNs without the setup? Spin one up in an online network lab, or let the AI network emulator build the IPsec/DMVPN configs from a prompt. Related: BGP Multi-Vendor Lab and FRRouting in the Cloud. Try NetPilot — describe any VPN topology and get a working lab in ~2 minutes.