DMVPN Phase 1, 2 & 3
Traditional hub-and-spoke VPNs require a static tunnel between every spoke and the hub — manageable for five sites, unscalable at fifty. DMVPN (Dynamic Multipoint VPN) replaces the static tunnel mesh with a single mGRE (Multipoint GRE) interface on each router and a registration protocol — NHRP (Next Hop Resolution Protocol) — that resolves which public IP hides behind each tunnel address. Spokes register their public IPs with the hub at startup; the hub maintains an NHRP database. From that foundation, the three DMVPN phases differ only in how far the NHRP intelligence is pushed. Phase 1 routes all traffic through the hub. Phase 2 lets spokes query the hub for each other's public IPs and build direct tunnels on demand. Phase 3 adds NHRP redirect so the hub signals spokes to build shortcuts without needing per-spoke routing entries, enabling route summarisation at the hub.
DMVPN builds on standard GRE tunnel concepts. For a GRE foundation see GRE Tunnel Configuration. IPsec is layered on top of the mGRE interface to encrypt DMVPN traffic — for the IPsec building blocks see IPsec Site-to-Site VPN and IPsec Basics. For the EIGRP routing that runs over the DMVPN overlay see EIGRP Configuration and EIGRP Overview. For alternative routing protocols over DMVPN see OSPF Configuration and BGP Basics & eBGP. For the WAN transport that forms the DMVPN underlay see WAN and MPLS.
1. DMVPN Architecture — Core Concepts
Building Blocks
| Component | Role | IOS Object |
|---|---|---|
| mGRE | Multipoint GRE — a single tunnel interface that accepts connections from multiple remote peers, each identified by their public IP. Unlike point-to-point GRE, no tunnel destination is needed; destinations are resolved dynamically by NHRP |
tunnel mode gre multipoint |
| NHRP | Next Hop Resolution Protocol — maps tunnel overlay IPs to physical (NBMA) IPs. Spokes register with the hub; spokes query the hub for peer public IPs when building shortcuts | ip nhrp map, ip nhrp registration, ip nhrp network-id |
| NHS | Next Hop Server — the hub router that holds the NHRP registration database and answers resolution queries from spokes | ip nhrp nhs [hub-tunnel-ip] configured on each spoke |
| NBMA address | The public routable IP of each router — what NHRP resolves to. Packets are encapsulated in GRE and sent to this address across the underlay (internet/MPLS) | ip nhrp map [overlay] [NBMA] and ip nhrp map multicast [NBMA] |
| Tunnel key | Optional value that distinguishes multiple DMVPN clouds sharing the same physical interface — must match on all routers in the same cloud | tunnel key [number] |
| NHRP network-id | Locally significant identifier that groups the NHRP domain — does not need to match between hub and spoke (unlike the tunnel key) | ip nhrp network-id [number] |
Phase Comparison
| Feature | Phase 1 | Phase 2 | Phase 3 |
|---|---|---|---|
| Spoke-to-spoke traffic path | Always through hub (hair-pinned) | Direct spoke-to-spoke tunnel after NHRP resolution | Direct spoke-to-spoke tunnel triggered by NHRP redirect from hub |
| Hub tunnel mode | mGRE | mGRE | mGRE |
| Spoke tunnel mode | Point-to-point GRE (hub only) or mGRE | mGRE (required — spokes must accept dynamic peers) | mGRE |
| Hub routing | Specific spoke prefixes — hub re-advertises between spokes | Specific spoke prefixes — next-hop preserved so spokes can find each other | Summary route — hub advertises aggregate; NHRP redirect triggers shortcut |
| NHRP redirect on hub | Not needed | Not needed | Required — ip nhrp redirect on hub tunnel |
| NHRP shortcut on spokes | Not needed | Not needed | Required — ip nhrp shortcut on spoke tunnels |
| Routing next-hop preservation | Not needed — all traffic goes to hub | Critical — no ip next-hop-self eigrp or BGP NH unchanged |
Not needed — summarization hides spoke prefixes; NHRP handles resolution |
| Scalability | Limited — hub is bottleneck | Good — direct paths, but hub must hold all spoke routes | Best — hub summarises; spoke routing table stays small |
Underlay vs Overlay
OVERLAY (tunnel network — DMVPN addresses, routing protocol runs here)
─────────────────────────────────────────────────────────────────────
Tunnel0 addresses:
HUB: 10.0.0.1/24
SPOKE1: 10.0.0.2/24
SPOKE2: 10.0.0.3/24
SPOKE3: 10.0.0.4/24
NHRP maps tunnel IP → NBMA (public) IP:
10.0.0.2 → 203.0.113.10 (Spoke1 public IP)
10.0.0.3 → 203.0.113.20 (Spoke2 public IP)
10.0.0.4 → 203.0.113.30 (Spoke3 public IP)
UNDERLAY (physical network — internet/MPLS — GRE packets travel here)
─────────────────────────────────────────────────────────────────────
Physical interface public IPs:
HUB: 198.51.100.1 (static — spokes must know this)
SPOKE1: 203.0.113.10 (can be dynamic — registered via NHRP)
SPOKE2: 203.0.113.20
SPOKE3: 203.0.113.30
2. Lab Topology
┌─────────────────────┐
│ INTERNET │
│ (underlay network) │
└──────────┬──────────┘
┌─────────────────┼──────────────────┐
│ │ │
203.0.113.10 198.51.100.1 203.0.113.20
Gi0/0 Gi0/0 Gi0/0
[SPOKE1] [ HUB ] [SPOKE2]
Tu0: 10.0.0.2 Tu0: 10.0.0.1 Tu0: 10.0.0.3
LAN: 10.1.0.0/24 LAN: 10.0.1.0/24 LAN: 10.2.0.0/24
Gi0/1 Gi0/1 Gi0/1
DMVPN Overlay Subnet: 10.0.0.0/24
Routing Protocol: EIGRP AS 100 (over the overlay)
IPsec Profile: DMVPN-IPSEC (applied to Tunnel0)
Router hostnames: NetsTuts-HUB, NetsTuts-SP1, NetsTuts-SP2
NHRP Network-ID: 1
Tunnel Key: 100
3. IPsec Profile (Applied to All Phases)
IPsec is configured identically on all routers in all three phases. A protection profile is applied directly to the Tunnel0 interface — no crypto maps needed. Configure this on the hub and all spokes before proceeding to phase-specific tunnel setup:
! ═══ Configure on HUB, SPOKE1, and SPOKE2 ════════════════ ! ! ── IKE Phase 1 policy ─────────────────────────────────── crypto isakmp policy 10 authentication pre-share encryption aes 256 hash sha256 group 14 lifetime 86400 ! ! ── Pre-shared key — wildcard covers all DMVPN peers ───── crypto isakmp key NetsTuts-DMVPN address 0.0.0.0 0.0.0.0 ! ! ── IPsec transform set ────────────────────────────────── crypto ipsec transform-set DMVPN-TS esp-aes 256 esp-sha256-hmac mode transport ! ! ── IPsec profile — attached to tunnel interface ───────── crypto ipsec profile DMVPN-IPSEC set transform-set DMVPN-TS set isakmp-profile DMVPN-ISAKMP !
mode transport is used instead of mode tunnel
because GRE already provides the outer encapsulation — IPsec only
needs to encrypt the GRE payload, not add another IP header. The
wildcard pre-shared key (address 0.0.0.0 0.0.0.0)
allows any DMVPN peer with the correct key to establish an IKE
session — essential since spoke public IPs are dynamic and cannot
be enumerated in advance. In production, certificate-based
authentication (PKI) is preferred over pre-shared keys for
scalability. The IPsec profile is applied to the tunnel interface
with tunnel protection ipsec profile DMVPN-IPSEC.
After completing configuration save with
write memory.
Verify physical interface status with
show ip interface brief.
4. DMVPN Phase 1 — Hub-Routed
Phase 1 is the simplest DMVPN deployment. Every spoke forms a tunnel only with the hub; spoke-to-spoke communication is always hair-pinned through the hub. Spokes can use either point-to-point GRE or mGRE tunnel interfaces. All NHRP resolution stops at the hub — spokes never query for each other's NBMA addresses.
Phase 1 — Hub Configuration
! ════════════════════════════════════════════════════════════ ! NetsTuts-HUB — DMVPN Phase 1 ! ════════════════════════════════════════════════════════════ ! interface Tunnel0 description DMVPN-Phase1-Hub ip address 10.0.0.1 255.255.255.0 ! ! ── mGRE: single interface accepts all spoke tunnels ───── tunnel mode gre multipoint tunnel source GigabitEthernet0/0 tunnel key 100 ! ! ── NHRP: hub is the NHS — no nhs command needed on hub ── ip nhrp network-id 1 ip nhrp map multicast dynamic ! ! ── IPsec encryption ───────────────────────────────────── tunnel protection ipsec profile DMVPN-IPSEC ! ip mtu 1400 ip tcp adjust-mss 1360 ! ! ── Physical WAN interface ──────────────────────────────── interface GigabitEthernet0/0 ip address 198.51.100.1 255.255.255.0 no shutdown ! interface GigabitEthernet0/1 ip address 10.0.1.1 255.255.255.0 no shutdown ! ! ── EIGRP over the DMVPN overlay ───────────────────────── router eigrp 100 network 10.0.0.0 0.0.0.255 network 10.0.1.0 0.0.0.255 no auto-summary !
ip nhrp map multicast dynamic is the single most
important hub command. It tells the hub to dynamically build a
multicast replication list from the NHRP registration database —
any spoke that registers gets added automatically. Without this,
EIGRP Hello packets (which are multicast) would not reach spokes,
and routing adjacencies would never form. The hub never needs an
ip nhrp nhs command — it IS the NHS. The tunnel key
(100) must match on every router in the cloud; mismatches silently
drop all GRE packets.
Phase 1 — Spoke Configuration
! ════════════════════════════════════════════════════════════ ! NetsTuts-SP1 — DMVPN Phase 1 Spoke ! (SP2 identical — change addresses accordingly) ! ════════════════════════════════════════════════════════════ ! interface Tunnel0 description DMVPN-Phase1-Spoke ip address 10.0.0.2 255.255.255.0 ! ! ── mGRE on spoke — allows future phase upgrade ─────────── tunnel mode gre multipoint tunnel source GigabitEthernet0/0 tunnel key 100 ! ! ── NHRP: register with the hub NHS ────────────────────── ip nhrp network-id 1 ! ! ── Static NHRP entry: hub's tunnel IP → hub's public IP ─ ip nhrp map 10.0.0.1 198.51.100.1 ! ! ── Multicast replication toward hub (for EIGRP Hellos) ── ip nhrp map multicast 198.51.100.1 ! ! ── Point to hub as the NHS ────────────────────────────── ip nhrp nhs 10.0.0.1 ! tunnel protection ipsec profile DMVPN-IPSEC ! ip mtu 1400 ip tcp adjust-mss 1360 ! interface GigabitEthernet0/0 ip address 203.0.113.10 255.255.255.0 no shutdown ! interface GigabitEthernet0/1 ip address 10.1.0.1 255.255.255.0 no shutdown ! router eigrp 100 network 10.0.0.0 0.0.0.255 network 10.1.0.0 0.0.0.255 no auto-summary !
ip nhrp map
10.0.0.1 198.51.100.1 is the static bootstrap entry that
maps the hub's tunnel IP to its known public IP — without this the
spoke cannot send the initial NHRP registration request because it
does not know where the hub lives. ip nhrp map multicast
198.51.100.1 ensures EIGRP multicast Hellos are replicated
to the hub's public IP (EIGRP uses 224.0.0.10 which must be
forwarded as unicast over the GRE tunnel). ip nhrp nhs
10.0.0.1 designates the hub as the NHS server for this
spoke's NHRP domain. In Phase 1, spokes never send NHRP resolution
requests for other spokes — NHRP is used only for registration.
Phase 1 Traffic Flow
SP1 (10.1.0.x) → SP2 (10.2.0.x) in Phase 1: 1. SP1 has route to 10.2.0.0/24 via 10.0.0.1 (hub) ← hub re-advertises 2. SP1 sends packet: src 10.1.0.10, dst 10.2.0.10 → encapsulate in GRE → send to hub NBMA 198.51.100.1 3. Hub decapsulates → re-encapsulates → sends to SP2 NBMA 203.0.113.20 4. SP2 delivers to 10.2.0.10 All inter-spoke traffic traverses the hub twice (once inbound, once outbound). Hub bandwidth and CPU are the bottleneck.
5. DMVPN Phase 2 — Spoke-to-Spoke Shortcuts
Phase 2 adds the ability for spokes to build direct tunnels to each other on demand. When Spoke1 sends traffic destined for Spoke2's network, it triggers an NHRP resolution request to the hub asking "what is the public IP for tunnel address 10.0.0.3?" The hub replies with Spoke2's NBMA address, and Spoke1 caches that mapping and builds a direct GRE tunnel. All spokes must use mGRE tunnels in Phase 2.
Phase 2 Changes from Phase 1
The tunnel interface configuration is identical to Phase 1 — no tunnel commands change between phases. The critical Phase 2 requirement is in the routing protocol. EIGRP must preserve the original next-hop when advertising spoke routes across the hub — if the hub changes the next-hop to itself (default EIGRP behaviour), spokes send traffic to the hub rather than directly to the originating spoke, and NHRP resolution is never triggered.
Phase 2 — Hub EIGRP Change (Critical)
! ════════════════════════════════════════════════════════════ ! NetsTuts-HUB — Phase 2 EIGRP change ! ════════════════════════════════════════════════════════════ ! router eigrp 100 network 10.0.0.0 0.0.0.255 network 10.0.1.0 0.0.0.255 no auto-summary ! interface Tunnel0 ! ── Preserve original next-hop when advertising to spokes ─ no ip next-hop-self eigrp 100 ! ! ── EIGRP split horizon disabled — hub must re-advertise ! ── routes learned from spokes back to other spokes ─────── no ip split-horizon eigrp 100 !
no ip split-horizon eigrp 100 allows the hub to
re-advertise routes learned from one spoke back out the same
Tunnel0 interface to other spokes — split horizon normally blocks
this, which would prevent spokes from learning each other's
prefixes entirely. no ip next-hop-self eigrp 100
preserves the original spoke's tunnel IP as the EIGRP next-hop
when the hub forwards the advertisement. Without this, the hub
replaces the next-hop with 10.0.0.1 (itself) and spokes route
everything through the hub — exactly Phase 1 behaviour despite
being configured as Phase 2.
Phase 2 Traffic Flow — NHRP Resolution
SP1 → SP2 first packet (Phase 2):
1. SP1 routing table: 10.2.0.0/24 via 10.0.0.3 (SP2 tunnel IP) ← next-hop preserved!
2. SP1 does not know SP2's NBMA IP — sends NHRP Resolution Request to hub (10.0.0.1)
"What is the NBMA address for tunnel IP 10.0.0.3?"
3. First packet is forwarded to hub while NHRP query is outstanding
4. Hub looks up NHRP cache: 10.0.0.3 → 203.0.113.20
5. Hub sends NHRP Resolution Reply to SP1: "10.0.0.3 is at NBMA 203.0.113.20"
6. SP1 caches the mapping; builds direct IPsec/GRE tunnel to 203.0.113.20
7. All subsequent SP1 → SP2 traffic takes the direct path (bypasses hub)
8. NHRP cache entry expires after hold time (default 7200 sec) — resolved again if needed
Phase 2 — NHRP Hold Timer Tuning
! ── Apply on hub and all spokes ────────────────────────── interface Tunnel0 ! ── How long NHRP registrations are valid ──────────────── ip nhrp holdtime 300 ! ! ── How often spokes re-register (should be < holdtime) ── ip nhrp registration timeout 60 !
6. DMVPN Phase 3 — NHRP Redirect and Summarization
Phase 3 solves the primary Phase 2 scaling limitation: with hundreds of spokes, each spoke's routing table must contain a specific route for every other spoke's LAN — advertised with the original next-hop preserved. Phase 3 moves the intelligence to NHRP. The hub advertises only a summary route covering all spoke networks; spokes install that summary pointing to the hub. When Spoke1 sends traffic matching the summary (destined for Spoke2's LAN), the packet reaches the hub. The hub — instead of forwarding — sends an NHRP Redirect message back to Spoke1 telling it to go directly to Spoke2. Spoke1 sends an NHRP resolution request to Spoke2 directly and builds a shortcut route.
Phase 3 — Hub Configuration Changes
! ════════════════════════════════════════════════════════════ ! NetsTuts-HUB — Phase 3 changes ! ════════════════════════════════════════════════════════════ ! interface Tunnel0 ! ── Enable NHRP redirect — hub sends redirect on transit ── ip nhrp redirect ! ! ── Phase 3: next-hop-self and split-horizon can be RE-ENABLED ! ── (or left off — no functional difference in Phase 3) ─── ! ip next-hop-self eigrp 100 ← optional in Phase 3 ! ip split-horizon eigrp 100 ← optional in Phase 3 ! ! ── Hub advertises a summary to spokes instead of specifics ─ router eigrp 100 network 10.0.0.0 0.0.0.255 network 10.0.1.0 0.0.0.255 no auto-summary ! interface Tunnel0 ! ── Summarise all spoke LANs into one prefix ───────────── ip summary-address eigrp 100 10.0.0.0 255.0.0.0 !
ip nhrp redirect on the hub tunnel interface is the
single command that defines Phase 3. When the hub receives a
packet that will transit the DMVPN cloud (source and destination
are both DMVPN tunnel addresses), it forwards the packet normally
AND sends an NHRP Traffic Indication (redirect) message to the
source spoke, telling it to resolve the destination directly.
The summary address (10.0.0.0/8 covering all spoke
LANs in this example) means each spoke only needs one route for
all remote sites — the hub's tunnel IP — until NHRP builds a
shortcut. When the summary is broad enough, spoke routing tables
scale to O(1) rather than O(n) for remote prefixes. For route
summarisation techniques see
Route Summarisation
& Aggregation.
Phase 3 — Spoke Configuration Changes
! ════════════════════════════════════════════════════════════ ! NetsTuts-SP1 and NetsTuts-SP2 — Phase 3 changes ! ════════════════════════════════════════════════════════════ ! interface Tunnel0 ! ── Enable NHRP shortcut — spoke installs shortcut routes ─ ip nhrp shortcut !
ip nhrp shortcut on each spoke tunnel enables the
spoke to install NHRP-derived shortcut routes in its routing table
when it receives an NHRP resolution reply. Without this, the spoke
receives the NHRP redirect from the hub and sends the resolution
request, but never installs the resulting shortcut — traffic
continues flowing through the hub. The shortcut route is installed
as a host route (/32) or specific prefix in the RIB, overriding
the summary route from the hub for that specific destination until
the NHRP cache entry expires.
Phase 3 Traffic Flow — NHRP Redirect
SP1 → SP2 in Phase 3 (first packet):
1. SP1 routing table: 10.0.0.0/8 via 10.0.0.1 (hub summary) — no specific SP2 route
2. SP1 sends packet to hub (10.0.0.1 → 198.51.100.1 underlay)
3. Hub forwards packet to SP2 AND sends NHRP Traffic Indication (redirect) to SP1:
"You should send directly to 10.0.0.3 — its NBMA is 203.0.113.20"
4. SP1 sends NHRP Resolution Request directly to SP2 (203.0.113.20)
5. SP2 sends NHRP Resolution Reply: confirms its own NBMA
6. SP1 installs shortcut route: 10.2.0.0/24 via 10.0.0.3 (overrides summary)
7. SP1 builds direct IPsec tunnel to 203.0.113.20
8. All subsequent SP1 → SP2 traffic takes the direct path
Key Phase 3 advantage:
SP1 routing table has 1 remote route (summary) instead of N spoke-specific routes
Shortcut routes are temporary — installed on demand, removed when idle
Complete Phase 3 Spoke Config (All Commands Combined)
! ════════════════════════════════════════════════════════════ ! NetsTuts-SP1 — Complete Phase 3 configuration ! ════════════════════════════════════════════════════════════ ! interface Tunnel0 description DMVPN-Phase3-Spoke ip address 10.0.0.2 255.255.255.0 tunnel mode gre multipoint tunnel source GigabitEthernet0/0 tunnel key 100 ip nhrp network-id 1 ip nhrp map 10.0.0.1 198.51.100.1 ip nhrp map multicast 198.51.100.1 ip nhrp nhs 10.0.0.1 ip nhrp shortcut ip nhrp holdtime 300 tunnel protection ipsec profile DMVPN-IPSEC ip mtu 1400 ip tcp adjust-mss 1360 ! interface GigabitEthernet0/0 ip address 203.0.113.10 255.255.255.0 no shutdown ! interface GigabitEthernet0/1 ip address 10.1.0.1 255.255.255.0 no shutdown ! router eigrp 100 network 10.0.0.0 0.0.0.255 network 10.1.0.0 0.0.0.255 no auto-summary !
7. Verification
show dmvpn
NetsTuts-HUB#show dmvpn
Legend: Attrb --> S - Static, D - Dynamic, I - Incomplete
N - NATed, L - Local, X - No Socket, T1 - Route Installed, T2 - Nexthop-override
C - CTS Authenticated, I2 - Temporary
#Ent --> Number of NHRP entries with same NBMA peer
NHS Status: E --> Expecting Replies, R --> Responding, W --> Waiting
Interface: Tunnel0, IPv4 NHRP Details
Type:Hub, NHRP Peers:2,
# Ent Peer NBMA Addr Peer Tunnel Add State UpDn Tm Attrb
----- ---------------- --------------- ----- -------- -----
1 203.0.113.10 10.0.0.2 UP 00:12:43 D
1 203.0.113.20 10.0.0.3 UP 00:08:17 D
ip nhrp map
command. Spoke-to-spoke shortcuts (Phase 2/3) appear as
additional Dynamic entries.
show dmvpn detail
NetsTuts-HUB#show dmvpn detail
...
# Ent Peer NBMA Addr Peer Tunnel Add State UpDn Tm Attrb
1 203.0.113.10 10.0.0.2 UP 00:12:43 D
Tunnel Protect: DMVPN-IPSEC
IKE SA status: Active
IPsec SA status: Active (ESP)
NHRP registration expires: 00:04:57
show ip nhrp — NHRP Cache on Hub
NetsTuts-HUB#show ip nhrp 10.0.0.2/32 via 10.0.0.2 Tunnel0 created 00:12:43, expire 00:04:57 Type: dynamic, Flags: router rib nho NBMA address: 203.0.113.10 10.0.0.3/32 via 10.0.0.3 Tunnel0 created 00:08:17, expire 00:09:03 Type: dynamic, Flags: router rib nho NBMA address: 203.0.113.20
nho flag indicates Next-Hop Override
is active (relevant in Phase 2 for the next-hop preservation
behaviour). On a spoke after Phase 3 shortcut installation,
run show ip nhrp to see the temporary shortcut
entry for the remote spoke.
show ip nhrp — On Spoke After Phase 3 Shortcut
NetsTuts-SP1#show ip nhrp 10.0.0.1/32 via 10.0.0.1 Tunnel0 created 00:12:43, expire 00:04:57 Type: static, Flags: used NBMA address: 198.51.100.1 10.0.0.3/32 via 10.0.0.3 Tunnel0 created 00:00:12, expire 00:04:48 Type: dynamic, Flags: router rib NBMA address: 203.0.113.20
created time confirms this is fresh. Run
show ip route 10.2.0.0 on SP1 to see the specific
shortcut route that overrides the hub summary.
show ip route — Verify Shortcut Route (Phase 3)
NetsTuts-SP1#show ip route 10.2.0.0
Routing entry for 10.2.0.0/24
Known via "nhrp", distance 250, metric 0
Tag 10.0.0.3, type extern
Last update from 10.0.0.3 on Tunnel0, 00:00:10 ago
Routing Descriptor Blocks:
* 10.0.0.3, from 10.0.0.3, via Tunnel0
Route metric is 0, traffic share count is 1
show ip eigrp neighbors — Verify Routing Adjacencies
NetsTuts-HUB#show ip eigrp neighbors
EIGRP-IPv4 Neighbors for AS(100)
H Address Interface Hold Uptime SRTT RTO Q Seq
(sec) (ms) Cnt Num
0 10.0.0.2 Tu0 12 00:12:43 15 100 0 42
1 10.0.0.3 Tu0 11 00:08:17 18 108 0 31
Verification Command Summary
| Command | Shows | Key Field to Check |
|---|---|---|
show dmvpn |
NHRP peer state, NBMA addresses, tunnel IPs, up/down time | State: UP for all peers; D (dynamic) for spokes on hub |
show dmvpn detail |
IPsec SA status per peer, NHRP expiry, IKE status | IPsec SA status: Active; NHRP registration time remaining |
show ip nhrp |
NHRP cache — tunnel IP → NBMA IP mappings with type and expiry | Hub: dynamic entries for all spokes; Spoke: static hub entry + dynamic shortcuts |
show ip nhrp detail |
Full NHRP entry detail including flags, requester, and VPN info | Flags: router rib confirms route installed; shortcut confirms Phase 3 |
show ip eigrp neighbors |
EIGRP adjacencies over the DMVPN overlay | All spokes (from hub) or hub (from spoke) showing Hold timer > 0 |
show ip route |
Full routing table — check for NHRP shortcut routes (source: nhrp, AD 250) | Phase 3: specific spoke LAN routes via spoke tunnel IP (not hub); source "nhrp" |
show crypto isakmp sa |
IKE Phase 1 SA state per peer | State: QM_IDLE (active) for each DMVPN peer; MM_NO_STATE indicates failure |
show crypto ipsec sa |
IPsec Phase 2 SA — encrypt/decrypt counters, SPI | pkts encaps and pkts decaps incrementing confirms bidirectional encryption |
8. Troubleshooting DMVPN
| Problem | Symptom | Cause | Fix |
|---|---|---|---|
| No spokes register with hub | show dmvpn on hub shows no peers; show ip nhrp empty |
Tunnel key mismatch; tunnel source interface down; NHRP network-id mismatch; underlay routing broken (spoke cannot reach hub public IP) | Verify tunnel key matches on all routers. Confirm show interfaces Tunnel0 shows up/up. Test underlay: ping hub public IP (198.51.100.1) from spoke's physical interface. Check ip nhrp map on spoke points to correct hub public IP |
| EIGRP adjacency not forming over tunnel | show ip eigrp neighbors shows no neighbours on Tunnel0 |
ip nhrp map multicast missing on spokes (EIGRP Hellos not forwarded to hub); split horizon blocking re-advertisement on hub; tunnel interface not in EIGRP network statement |
Verify ip nhrp map multicast 198.51.100.1 on each spoke. On hub, confirm ip nhrp map multicast dynamic and no ip split-horizon eigrp 100 on Tunnel0. Confirm Tunnel0's subnet is in network statement |
| Phase 2: all traffic still going through hub | Traceroute shows hub as transit hop for spoke-to-spoke traffic; show ip nhrp on spoke shows no dynamic entries for other spokes |
no ip next-hop-self eigrp 100 missing on hub — hub changes EIGRP next-hop to itself so spokes route to hub, never triggering NHRP resolution for remote spoke addresses |
Add no ip next-hop-self eigrp 100 to hub Tunnel0. Verify with show ip eigrp topology on a spoke — the next-hop for a remote spoke's LAN should be the spoke's tunnel IP (10.0.0.3) not the hub (10.0.0.1) |
| Phase 3: spoke-to-spoke shortcuts not forming | Traffic still transits hub after Phase 3 config; show ip nhrp on spoke shows no shortcut entries; route source is EIGRP not NHRP |
ip nhrp redirect missing on hub Tunnel0; ip nhrp shortcut missing on spoke Tunnel0; summary route too specific (not covering spoke LANs) |
Verify ip nhrp redirect on hub and ip nhrp shortcut on all spokes. Confirm summary covers all spoke LAN prefixes. Test by pinging spoke-to-spoke — first ping hits hub, second ping should take shortcut. Run debug ip nhrp to see redirect messages |
| IPsec not encrypting tunnel traffic | show crypto ipsec sa shows 0 packets; show dmvpn detail shows IPsec SA: Inactive |
Pre-shared key mismatch; transform set mismatch; IKE policy mismatch; tunnel protection profile not applied to Tunnel0 | Confirm tunnel protection ipsec profile DMVPN-IPSEC on all Tunnel0 interfaces. Verify IKE policy parameters (encryption, hash, DH group) match exactly. Check pre-shared key is identical. Run debug crypto isakmp to see Phase 1 negotiation failure reason |
| Large packets failing across DMVPN | Small pings work; large transfers or application sessions fail | ip mtu 1400 or ip tcp adjust-mss 1360 missing on Tunnel0 — GRE (24 bytes) + IPsec (variable, ~50 bytes) overhead reduces usable MTU below 1500 |
Add ip mtu 1400 and ip tcp adjust-mss 1360 to all Tunnel0 interfaces. Test with ping [destination] size 1400 df-bit — should succeed. Adjust mtu downward if still failing with IPsec overhead |
| NHRP registrations expiring before renewal | Spokes intermittently disappear from show dmvpn; connectivity drops then recovers |
NHRP hold time too short or registration timer too long — spoke does not re-register before expiry on hub | Ensure ip nhrp registration timeout on spokes is less than ip nhrp holdtime. Standard values: holdtime 300, registration timeout 60. Verify underlay connectivity is stable — registration failures often mask an underlying physical or routing issue |
Key Points & Exam Tips
- DMVPN combines three technologies: mGRE (single multipoint tunnel interface), NHRP (dynamic tunnel IP to public IP mapping), and IPsec (optional encryption). All three must function for a working DMVPN cloud.
- The hub's public IP must be static — spokes hard-code it in
ip nhrp mapandip nhrp nhs. Spoke public IPs can be dynamic; they register via NHRP at startup. ip nhrp map multicast dynamicon the hub is essential — it dynamically adds registered spokes to the multicast replication list so EIGRP Hello packets reach all spokes. Without it, no routing adjacencies form.- The tunnel key must match on all routers in the same DMVPN cloud. A mismatch silently drops all GRE packets — the tunnel appears up but passes no traffic.
- Phase 1 — all traffic through hub; no routing changes required beyond standard EIGRP.
- Phase 2 — direct spoke-to-spoke tunnels on demand. Requires two hub EIGRP commands:
no ip split-horizon eigrp [AS](so hub re-advertises spoke routes back out Tunnel0) andno ip next-hop-self eigrp [AS](so spoke routes retain the originating spoke's tunnel IP as next-hop, triggering NHRP resolution). - Phase 3 — direct tunnels triggered by hub redirect; spoke routing tables only need a summary. Requires
ip nhrp redirecton the hub Tunnel0 andip nhrp shortcuton all spoke Tunnel0 interfaces. The hub advertises a summary; NHRP shortcut routes (AD 250, source "nhrp") override the summary for active paths. - NHRP shortcut routes have an administrative distance of 250 — higher than EIGRP (90/170) or OSPF (110). They override the hub summary through longest prefix match, not lower AD.
- IPsec uses
mode transport(not tunnel) on DMVPN because GRE already provides outer encapsulation. The wildcard pre-shared key (address 0.0.0.0 0.0.0.0) allows any DMVPN peer to authenticate — required for dynamic spokes. - MTU on DMVPN tunnels: GRE adds 24 bytes; IPsec adds approximately 50–70 bytes. Set
ip mtu 1400andip tcp adjust-mss 1360on Tunnel0 to prevent fragmentation across all DMVPN phases.