Azure Virtual Network (VNet) peering enables seamless connectivity between Azure virtual networks. Traffic between virtual machines in peered virtual networks is routed through the Microsoft backbone infrastructure, similar to traffic routed between virtual machines in the same virtual network, through private IP addresses only.
This diagram shows a basic VNet peering setup between two virtual networks (VNet-A and VNet-B) in the same resource group. Each VNet has multiple subnets with different purposes:
The hub and spoke model is a common network topology in Azure that centralizes shared services and connectivity:
This sequence diagram shows how traffic flows between VMs in peered VNets:
When using Azure Firewall in a hub-spoke model, traffic between spokes is controlled:
VNet peering is not transitive, meaning:
az network vnet peering create \ --name "peer-vnet-a-to-vnet-b" \ --resource-group "rg-networking" \ --vnet-name "vnet-a" \ --remote-vnet "vnet-b" \ --allow-vnet-access \ --allow-forwarded-traffic \ --allow-gateway-transit
--name
: Name for the peering connection (must be unique within the VNet)--resource-group
: Resource group containing the source VNet--vnet-name
: Name of the source VNet--remote-vnet
: Name or resource ID of the destination VNet--allow-vnet-access
: Enables communication between VNets--allow-forwarded-traffic
: Allows traffic forwarded by NVA or gateway--allow-gateway-transit
: Allows the remote VNet to use this VNet's gatewayaz network vnet peering create \ --name "peer-vnet-b-to-vnet-a" \ --resource-group "rg-networking" \ --vnet-name "vnet-b" \ --remote-vnet "vnet-a" \ --allow-vnet-access \ --allow-forwarded-traffic \ --use-remote-gateways
--use-remote-gateways
: Uses the remote VNet's gateway for connectivity--allow-gateway-transit
--use-remote-gateways
parameter allows VNet-B to use VNet-A's gateway for external connectivity.
az network vnet peering create \ --name "peer-to-remote-subscription" \ --resource-group "rg-networking" \ --vnet-name "vnet-local" \ --remote-vnet "/subscriptions/12345678-1234-1234-1234-123456789012/resourceGroups/rg-remote/providers/Microsoft.Network/virtualNetworks/vnet-remote" \ --allow-vnet-access
--remote-vnet
: Full resource ID required for cross-subscription peering/subscriptions/{subscription-id}/resourceGroups/{rg-name}/providers/Microsoft.Network/virtualNetworks/{vnet-name}
az network vnet peering create \ --name "peer-cross-region" \ --resource-group "rg-networking-eastus" \ --vnet-name "vnet-eastus" \ --remote-vnet "/subscriptions/12345678-1234-1234-1234-123456789012/resourceGroups/rg-networking-westus/providers/Microsoft.Network/virtualNetworks/vnet-westus" \ --allow-vnet-access
# Create Hub to Spoke-1 peering az network vnet peering create \ --name "hub-to-spoke1" \ --resource-group "rg-hub" \ --vnet-name "vnet-hub" \ --remote-vnet "vnet-spoke1" \ --allow-vnet-access \ --allow-forwarded-traffic \ --allow-gateway-transit
# Create Spoke-1 to Hub peering az network vnet peering create \ --name "spoke1-to-hub" \ --resource-group "rg-spoke1" \ --vnet-name "vnet-spoke1" \ --remote-vnet "vnet-hub" \ --allow-vnet-access \ --allow-forwarded-traffic \ --use-remote-gateways
--allow-gateway-transit
to share its gateway--use-remote-gateways
to access hub's gatewayaz network vnet peering show \ --name "peer-vnet-a-to-vnet-b" \ --resource-group "rg-networking" \ --vnet-name "vnet-a" \ --query "peeringState"
Initiated
: Peering created but reciprocal peering not yet establishedConnected
: Both peerings are established and functionalDisconnected
: Peering exists but is not functionalFailed
: Peering creation failedaz network vnet peering list \ --resource-group "rg-networking" \ --vnet-name "vnet-a" \ --output table
# Check peering state az network vnet peering show \ --name "peer-vnet-a-to-vnet-b" \ --resource-group "rg-networking" \ --vnet-name "vnet-a" \ --query "{Name:name, State:peeringState, RemoteVnet:remoteVirtualNetwork.id}"
# Check VNet address spaces az network vnet show \ --name "vnet-a" \ --resource-group "rg-networking" \ --query "addressSpace.addressPrefixes"
# Check current permissions az role assignment list \ --assignee $(az account show --query user.name -o tsv) \ --query "[?roleDefinitionName=='Network Contributor'].{Role:roleDefinitionName, Scope:scope}"
# Test connectivity between VNets az network watcher test-connectivity \ --source-resource "/subscriptions/{subscription}/resourceGroups/rg-networking/providers/Microsoft.Compute/virtualMachines/vm-a" \ --dest-resource "/subscriptions/{subscription}/resourceGroups/rg-networking/providers/Microsoft.Compute/virtualMachines/vm-b" \ --resource-group "rg-networking"