If NHRP remains stuck in “incomplete” on a DMVPN spoke inside Azure, the issue is almost never the DMVPN config. It is almost always Azure blocking something at the platform layer. Even if you enable IP forwarding on the NIC and VM, DMVPN Phase3 usually fails unless you also fix these 3 points:
- Disable Azure’s default SNAT If the VM’s outbound traffic is going through Azure’s default internet SNAT, DMVPN and NHRP will break. You must place the VM in a subnet with a proper Standard SKU public IP + Standard Load Balancer, or use User Defined Routes to avoid Azure SNAT.
- Ensure UDR allows end-to-end GRE/IP protocol 47 NSGs do not block GRE, but Azure virtual network fabric does not support GRE unless traffic stays inside the same VNet or goes through an NVA that handles it locally. DMVPN relies on GRE (protocol 47), and Azure will not forward GRE packets between subnets like a physical router. That means: DMVPN is not supported as a routed protocol in Azure unless the GRE tunnel is terminated inside the same VM. Your onprem spokes can talk to the hub because the endpoint is reachable, but Azure cannot forward GRE from your Azure spoke to the other on-prem spokes.
Check if the Hub is doing spoke-to-spoke redirection Even in Phase 3, Azure cannot hairpin GRE unless the hub NVA supports full packet re-encapsulation. Most do not.
The bottom line Azure will not forward GRE between spokes. DMVPN Phase 3 requiring GRE redirection will not work in an Azure VNet. Your Azure spoke can build the tunnel to the hub, but spoke-to-spoke NHRP discovery will never complete.
What to do instead Use one of these supported patterns:
Use IPsec route-based VPN instead of DMVPN for Azure spokes.
Terminate DMVPN on a single Azure NVA hub, not as a spoke.
Use SD-WAN or Azure Virtual WAN for multi-branch connectivity.
Please 'Upvote'(Thumbs-up) and 'Accept' as answer if the reply was helpful. This will be benefitting other community members who face the same issue.