All Azure networking requirements, best practices, limits and SKU comparisons in one place. Stop digging through hundreds of Microsoft docs pages.
Last updated: March 2026private_endpoint_network_policies = Enabled in Terraform or enable via Azure CLI:
az network vnet subnet update --disable-private-endpoint-network-policies false
The top-level container that holds all virtual hubs. One vWAN resource per organization is typical, with multiple hubs deployed across regions for global connectivity.
📄 Docs: What is Azure Virtual WAN?A Microsoft-managed VNet in a region. Acts as the central routing engine. Contains gateways (S2S VPN, P2S, ExpressRoute) and connects VNets as spokes. Default throughput: 3 Gbps, scalable up to 50 Gbps.
📄 Docs: Virtual hub settingsVNets, VPN sites, ExpressRoute circuits, and P2S users connect to the hub via connections. VNet connections replace traditional peering — no manual peering needed.
📄 Docs: Configure site-to-site connectionAutomated any-to-any transit between all connections (VNets, branches, users). Supports custom route tables for segmentation and isolation (e.g. isolating dev from prod).
📄 Docs: About virtual hub routing| Feature | Basic | Standard |
|---|---|---|
| Site-to-Site VPN | ✓ | ✓ |
| Point-to-Site VPN (User VPN) | ✗ | ✓ |
| ExpressRoute | ✗ | ✓ |
| Inter-hub transit | ✗ | ✓ (global any-to-any) |
| VNet-to-VNet transit | ✗ | ✓ |
| Azure Firewall / NVA | ✗ | ✓ |
| Custom route tables | ✗ | ✓ |
| Max hub throughput | VPN only | Up to 50 Gbps aggregate |
| Max VNet connections | Limited | Up to 1,000 |
| Max S2S VPN connections | Limited | Up to 1,000 |
| Upgrade | Basic → Standard (one-way, cannot downgrade) | |
| Use Case | Simple S2S VPN only | Enterprise, multi-region, hybrid |
A declarative way to tell the vWAN hub: "send all Internet traffic and/or all private traffic through my security solution". No manual route tables, no UDRs — the hub automatically programs the correct routes for all connections (VNets, branches, users).
📄 Docs: Configure routing policies
Internet Traffic Policy — Hub advertises 0.0.0.0/0 to all connections. All internet-bound traffic flows through Azure Firewall / NVA / SaaS security in the hub before reaching the internet.
Private Traffic Policy — All east-west traffic (VNet-to-VNet, branch-to-VNet, inter-hub) flows through the security solution. Full inspection of private traffic across the entire topology.
• Simple — No manual route tables or propagation config. Declare your intent, the hub handles the rest
• Effective — Guarantees all traffic is inspected. No risk of misconfigured routes creating bypass paths
• Extensible — Works with Azure Firewall, third-party NVAs, and SaaS security solutions. Add hubs or connections without reconfiguring routing
• Multi-hub — Policies apply per hub but work across inter-hub links for global security enforcement
| Routing Policy | What it does | Route advertised | Security solution |
|---|---|---|---|
| Internet Traffic | All internet egress from VNets, branches, and users goes through the hub's security solution | 0.0.0.0/0 |
Azure Firewall, NVA, or SaaS |
| Private Traffic | All east-west traffic (VNet↔VNet, branch↔VNet, hub↔hub) goes through the hub's security solution | RFC1918 + all VNet/branch prefixes | Azure Firewall, NVA, or SaaS |
| Decision Area | Prefer Hub & Spoke | Prefer Virtual WAN (Standard) |
|---|---|---|
| Scale | Single region or limited number of VNets/branches. | Many VNets, many branches/users. |
| Multi-Region | Requires manual peering, transit VNets, or VPN mesh between regional hubs — complex to build and maintain. | Native global hub-to-hub transit with automatic any-to-any routing. Strongly recommended for multi-region deployments. |
| Network Control | Maximum control over UDR, BGP propagation, peering flags, and custom NVA insertion. | Prefer Microsoft-managed connectivity and routing abstractions. |
| Routing Model | Need granular custom routes and per-subnet exceptions. | Want a simplified model using hub route tables and Routing Intent. |
| Branch Connectivity | Few branches or existing central gateway/NVA design. | Large branch footprint (S2S/P2S/ER) with global transit requirements. |
| Operations Effort | Team can operate custom hub networking at day-2 (routing, policy drift, troubleshooting). | Team wants faster rollout and lower operational overhead. |
| Typical Fit | Custom landing zones with strict bespoke design constraints. | Enterprise scale, repeatable global architecture, standardized operations. |
| Service | Subnet Name | Min CIDR | Usable IPs | Recommended | Notes | Docs |
|---|---|---|---|---|---|---|
| Azure VMware Solution | — | /22 | 1019 | /22 | For AVS clusters | 📄 |
| App Service Environment v3 | — | /24 | 251 | /24 | Delegation required. Isolated PaaS hosting | 📄 |
| Azure Kubernetes Service (CNI) | — | /24 | 251 | /21 to /16 | 1 IP per pod + 1 IP per node. Plan for scaling | 📄 |
| Azure Firewall | AzureFirewallSubnet | /26 | 59 | /26 | Name mandatory. One per VNet | 📄 |
| Azure Firewall Management | AzureFirewallManagementSubnet | /26 | 59 | /26 | Required for forced tunneling | 📄 |
| Azure Bastion | AzureBastionSubnet | /26 | 59 | /26 | Name mandatory. Secure RDP/SSH access | 📄 |
| Azure Databricks | public + private | /26 × 2 | 59 × 2 | /26 × 2 | Two subnets required for VNet injection | 📄 |
| VPN Gateway | GatewaySubnet | /27 | 27 | /27 | Name mandatory. No NSG. Shared with ExpressRoute GW | 📄 |
| ExpressRoute Gateway | GatewaySubnet | /27 | 27 | /27 | Same subnet as VPN Gateway | 📄 |
| Azure Route Server | RouteServerSubnet | /27 | 27 | /27 | Name mandatory. BGP route exchange | 📄 |
| SQL Managed Instance | — | /27 | 27 | /26 | Delegation required. Dedicated subnet | 📄 |
| Azure Cache for Redis (Premium) | — | /27 | 27 | /27 | 2 IPs per shard + 1 LB | 📄 |
| API Management (VNet) | — | /27 | 27 | /27 | /29 possible for lightweight (stv2) | 📄 |
| Application Gateway | — | /28 | 11 | /27 or /26 | One AppGW per subnet. Plan for autoscaling | 📄 |
| Azure NetApp Files | — | /28 | 11 | /28 | Delegation required (Microsoft.NetApp/volumes) | 📄 |
| Azure Spring Apps | — | /28 | 11 | /26 | Two subnets: service runtime + apps | 📄 |
| Entra Domain Services | — | /28 | 11 | /28 | Managed AD in Azure | 📄 |
| Azure Dedicated HSM | — | /28 | 11 | /28 | Hardware Security Modules | 📄 |
| Private DNS Resolver (inbound) | — | /28 | 11 | /28 | Delegation required | 📄 |
| Private DNS Resolver (outbound) | — | /28 | 11 | /28 | Delegation required | 📄 |
| Azure Container Instances | — | /29 | 3 | /27 | Delegation required for container groups | 📄 |
| NAT Gateway | — | /29 | 3 | — | Attaches to an existing subnet, no dedicated subnet needed | 📄 |
| Private Endpoint | — | /29 | 3 | /27 | 1 IP per Private Endpoint. Plan based on PE count | 📄 |
az network vnet subnet list-available-delegations --location westeurope
| Service | Delegation Name | Shared | Docs |
|---|---|---|---|
| App Service / Functions (VNet Integration) | Microsoft.Web/serverFarms | No | 📄 |
| App Service Environment v3 | Microsoft.Web/hostingEnvironments | No | 📄 |
| SQL Managed Instance | Microsoft.Sql/managedInstances | No | 📄 |
| Azure Container Instances | Microsoft.ContainerInstance/containerGroups | No | 📄 |
| Azure NetApp Files | Microsoft.NetApp/volumes | No | 📄 |
| Azure Databricks | Microsoft.Databricks/workspaces | No | 📄 |
| API Management | Microsoft.ApiManagement/service | No | 📄 |
| Azure Kubernetes Service | Microsoft.ContainerService/managedClusters | No | 📄 |
| Container Apps Environment | Microsoft.App/environments | No | 📄 |
| Azure Cosmos DB (dedicated) | Microsoft.AzureCosmosDB/clusters | No | 📄 |
| Azure Batch | Microsoft.Batch/batchAccounts | No | 📄 |
| Private DNS Resolver (inbound) | Microsoft.Network/dnsResolvers | No | 📄 |
| Private DNS Resolver (outbound) | Microsoft.Network/dnsResolvers | No | 📄 |
| Azure Machine Learning | Microsoft.MachineLearningServices/workspaces | No | 📄 |
| Service / Subnet | NSG | UDR | Notes | Docs |
|---|---|---|---|---|
GatewaySubnet | ✗ Forbidden | ⚠ Limited | No NSG. UDR supported but 0.0.0.0/0 → NVA is not allowed | 📄 |
AzureFirewallSubnet | ✗ Forbidden | ✓ | UDR only for management (forced tunneling) | 📄 |
AzureBastionSubnet | ✓ | ✓ | NSG with specific rules required (see docs) | 📄 |
RouteServerSubnet | ✗ Forbidden | ✗ Forbidden | No customization allowed | 📄 |
| Application Gateway | ✓ | ⚠ Limited | NSG: allow GatewayManager ports. No UDR to 0.0.0.0/0 | 📄 |
| API Management | ✓ | ✓ | NSG required with specific rules (ports 3443, etc.) | 📄 |
| AKS (Azure CNI) | ✓ | ✓ | UDR to force egress traffic through a firewall | 📄 |
| SQL Managed Instance | ✓ | ✓ | NSG auto-managed by the service. Don't remove the rules | 📄 |
| Private Endpoints | ✓ | ✓ | Requires network policies enabled on the subnet, otherwise NSG/UDR are bypassed | 📄 |
| App Service (VNet Integration) | ✓ | ✓ | Outbound traffic from the app goes through the subnet | 📄 |
| Azure NetApp Files | ✗ Ignored | ✗ Ignored | NSG and UDR are applied but ignored by ANF | 📄 |
| Route Table | Applied to | Routes | GW Route Propagation | Purpose |
|---|---|---|---|---|
| rt-spoke | All Spoke subnets | 0.0.0.0/0 → NVA private IP |
Disabled | Forces all traffic (internet + private) through the NVA |
| rt-gateway | GatewaySubnet (Hub) | Spoke CIDRs → NVA private IP | Enabled | Return traffic from on-prem to Spokes goes through the NVA |
When a VPN/ExpressRoute gateway is in the Hub, it propagates BGP-learned on-premises routes to all peered VNets. If propagation is enabled on Spoke subnets, on-prem traffic bypasses the NVA because the BGP route is more specific than 0.0.0.0/0. Always set disable_bgp_route_propagation = true on Spoke route tables.
The NVA's NIC(s) must have IP forwarding enabled in Azure (NIC setting) and in the OS (kernel). Without this, Azure drops packets not destined for the NVA's own IP. For Azure Firewall, this is handled automatically.
📄 Docs: IP forwardingOn the Spoke-to-Hub peering, enable use_remote_gateways = true. On the Hub-to-Spoke peering, enable allow_gateway_transit = true. This lets Spokes use the Hub's VPN/ExpressRoute gateway without deploying their own.
| Route Table | Applied to | Routes | GW Route Propagation | Purpose |
|---|---|---|---|---|
| rt-spoke-internet | Subnets needing direct internet (AppGW, APIM…) |
0.0.0.0/0 → Internet10.0.0.0/8 → NVA private IP172.16.0.0/12 → NVA private IP192.168.0.0/16 → NVA private IP
|
Disabled | Internet traffic goes out directly; RFC1918 private traffic goes through the NVA for inspection |
• Application Gateway — needs direct internet for health probes (GatewayManager) and public listeners
• API Management — management plane requires internet access (port 3443)
• AKS (public) — kube API server and image pulls from public registries
• Azure Bastion — control plane needs internet for management
• Any service with public IP exposure — inbound internet traffic cannot pass through the NVA
The 3 RFC1918 routes (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16) cover all private address space — Azure VNets, on-premises networks, and other Spokes. This ensures that even without 0.0.0.0/0 pointing to the NVA, all east-west and hybrid traffic is still inspected. Only internet-bound traffic bypasses the NVA.
0.0.0.0/0 → NVA + no BGP propagation. Subnets with services needing internet exposure get 0.0.0.0/0 → Internet + RFC1918 → NVA + no BGP propagation. The GatewaySubnet gets specific Spoke CIDRs → NVA with propagation enabled.
| SKU | Throughput | S2S Tunnels | P2S (IKEv2) | BGP | Zone-Redundant | Use Case |
|---|---|---|---|---|---|---|
| VpnGw1AZ | 650 Mbps | 30 | 250 | ✓ | ✓ | Small business, dev/test |
| VpnGw2AZ | 1.25 Gbps | 30 | 500 | ✓ | ✓ | SMB, moderate workloads |
| VpnGw3AZ | 2.5 Gbps | 30 | 1,000 | ✓ | ✓ | Enterprise, multi-site |
| VpnGw4AZ | 5 Gbps | 100 | 5,000 | ✓ | ✓ | Large scale, hybrid cloud |
| VpnGw5AZ | 10 Gbps | 100 | 10,000 | ✓ | ✓ | Very large scale — otherwise use Virtual WAN |
A logical connection between your on-premises network and Microsoft's edge, provisioned through a connectivity provider at a peering location. Defined by a bandwidth tier (50 Mbps to 100 Gbps with ExpressRoute Direct) and a SKU (Local, Standard, Premium).
Peering types:
A virtual network gateway deployed in the GatewaySubnet of your Hub VNet. It terminates the ExpressRoute connection on the Azure side. Can coexist with a VPN Gateway in the same GatewaySubnet for redundancy.
Gateway SKU determines throughput, number of circuits, and VM connections (see table below).
📄 Docs: ExpressRoute virtual network gatewaysThe link between the Gateway and the Circuit. A single circuit can be connected to gateways in multiple VNets (up to the SKU limit). A single gateway can connect to multiple circuits. Each connection represents one logical link.
In Terraform: azurerm_express_route_circuit → azurerm_virtual_network_gateway_connection → azurerm_virtual_network_gateway
| Circuit SKU | Region Scope | Global Reach | Data Plan | Routes (Private Peering) | VNet Links | Use Case | Docs |
|---|---|---|---|---|---|---|---|
| Local | Same metro only | ✗ | Unlimited (included) | 4,000 | 10 | Single-region, data-heavy | 📄 |
| Standard | Same geopolitical region | ✗ | Metered or Unlimited | 4,000 | 10 | Multi-region, same geography | 📄 |
| Premium | Global (all regions) | ✓ | Metered or Unlimited | 10,000 | 100 | Global enterprise, cross-geo | 📄 |
| Gateway SKU | Max Throughput | Max Circuits | Max VMs | FastPath | Zone-Redundant | Use Case | Docs |
|---|---|---|---|---|---|---|---|
| ErGw1Az | 1 Gbps | 4 | 2,000 | ✗ | ✓ | Dev/test, small workloads | 📄 |
| ErGw2Az | 2 Gbps | 8 | 4,000 | ✗ | ✓ | Moderate workloads | |
| ErGw3Az | 10 Gbps | 16 | 10,000 | ✓ | ✓ | Production, enterprise | |
| ErGwScale | 1–40 Gbps | 4–16 | Up to 50,000 | ✓ (≥10 units) | ✓ | Large scale, auto-scaling |
| Feature | Basic | Standard | Premium |
|---|---|---|---|
| Throughput | 250 Mbps | 30 Gbps | 100 Gbps |
| Autoscaling | ✗ | ✓ | ✓ |
| Threat Intelligence | Alert | Alert/Deny | Alert/Deny |
| FQDN Filtering (L7) | ✓ | ✓ | ✓ |
| DNS Proxy | ✗ | ✓ | ✓ |
| Web Categories | ✗ | ✓ | ✓ |
| TLS/SSL Inspection | ✗ | ✗ | ✓ |
| IDPS | ✗ | ✗ | ✓ (67k+ sigs) |
| URL Filtering (full path) | ✗ | ✗ | ✓ |
| Availability Zones | ✓ | ✓ | ✓ |
| Use Case | SMB, dev/test | Production, enterprise | Compliance (PCI, HIPAA) |
| Criteria | Service Endpoint | Private Endpoint |
|---|---|---|
| IP Type | Public IP of the service | Private IP in your VNet |
| Granularity | Subnet level | Resource level (NIC) |
| Isolation | Partial (need firewall rules too) | Complete — no internet exposure |
| DNS | Public DNS | Private DNS Zone required |
| On-Premises Access | No | Yes (via VPN/ExpressRoute) |
| Cross-Region | No | Yes |
| Cost | Free | ~$7.30/month + data |
| Complexity | Simple | Medium (DNS, NSG config) |
| Recommendation | Dev/Test, non-critical workloads | Production, compliance, hybrid |
| Azure Service | Service Endpoint | Private Endpoint | Private DNS Zone | Docs |
|---|---|---|---|---|
| Azure Storage (Blob/File/Queue/Table) | ✓ | ✓ | privatelink.blob.core.windows.net |
📄 |
| Azure SQL Database | ✓ | ✓ | privatelink.database.windows.net |
📄 |
| Azure Cosmos DB | ✓ | ✓ | privatelink.documents.azure.com |
📄 |
| Azure Key Vault | ✓ | ✓ | privatelink.vaultcore.azure.net |
📄 |
| Azure Container Registry | ✓ | ✓ | privatelink.azurecr.io |
📄 |
| Azure Event Hubs | ✓ | ✓ | privatelink.servicebus.windows.net |
📄 |
| Azure Service Bus | ✓ | ✓ | privatelink.servicebus.windows.net |
📄 |
| Azure App Service | ✓ | ✓ | privatelink.azurewebsites.net |
📄 |
| Azure Database for PostgreSQL | ✓ | ✓ | privatelink.postgres.database.azure.com |
📄 |
| Azure Database for MySQL | ✓ | ✓ | privatelink.mysql.database.azure.com |
📄 |
| Azure Synapse Analytics | ✓ | ✓ | privatelink.sql.azuresynapse.net |
📄 |
| Azure Monitor (Log Analytics) | ✗ | ✓ | privatelink.monitor.azure.com |
📄 |
| Azure Machine Learning | ✗ | ✓ | privatelink.api.azureml.ms |
📄 |
| Azure Data Factory | ✗ | ✓ | privatelink.datafactory.azure.net |
📄 |
| Azure OpenAI / Cognitive Services | ✗ | ✓ | privatelink.cognitiveservices.azure.com |
📄 |
| Azure Backup | ✗ | ✓ | privatelink.{region}.backup.windowsazure.com |
📄 |
| Method | Predictable IP | Scale (SNAT ports) | Cost | Use Case |
|---|---|---|---|---|
| NAT Gateway | ✓ up to 16 PIPs | 64k per IP (up to 1M total) | ~$32/month + data | Recommended default for predictable, scalable egress |
| Azure Firewall (forced tunnel) | ✓ Firewall PIP(s) | ~2,496 per PIP | Firewall cost (from ~$912/month) | Centralized egress with L3-L7 filtering + FQDN rules |
| Load Balancer outbound rules | ✓ LB frontend IPs | Configurable per rule | LB cost | When LB is already deployed and simple egress is sufficient |
| Instance-level Public IP | ✓ per VM | 64k per VM | PIP cost per VM | Individual VMs needing a dedicated outbound identity |
| Default outbound access | ✗ Random IP | Limited | Free | Deprecation: March 31, 2026. Do not rely on it |
NAT Gateway is assigned per subnet. All resources in that subnet use the NAT Gateway for outbound. It overrides LB outbound rules and default outbound access. However, instance-level public IPs take precedence over NAT Gateway — a VM with its own PIP will use that PIP for egress.
📄 Docs: NAT Gateway resourceAttach up to 16 public IPs or a public IP prefix for a maximum of ~1 million concurrent SNAT ports. Azure distributes flows across all IPs automatically.
📄 Docs: NAT Gateway scalabilityUnlike LB outbound rules, NAT Gateway dynamically allocates SNAT ports on demand (up to 64k per IP). Eliminates the classic SNAT port exhaustion problem that plagues Load Balancer-based egress.
📄 Docs: Troubleshoot SNAT exhaustionNAT Gateway provides outbound and return traffic only. It does not allow unsolicited inbound connections. For inbound, use Load Balancer, Application Gateway, or instance-level PIPs.
📄 Docs: NAT Gateway overview| Feature | Standard_v2 | WAF_v2 |
|---|---|---|
| Layer 7 Load Balancing | ✓ | ✓ |
| URL/Path-based Routing | ✓ | ✓ |
| SSL/TLS Termination | ✓ | ✓ |
| Autoscaling | ✓ (0–125 instances) | ✓ (0–125 instances) |
| Zone Redundancy | ✓ | ✓ |
| Static VIP | ✓ | ✓ |
| Key Vault Integration | ✓ | ✓ |
| Header Rewrite | ✓ | ✓ |
| WebSocket / HTTP/2 | ✓ | ✓ |
| Private-only (no public IP) | ✓ | ✓ |
| Web Application Firewall | ✗ | ✓ (OWASP CRS 3.x) |
| Bot Protection | ✗ | ✓ |
| Custom WAF Rules | ✗ | ✓ |
| Use Case | Internal apps, APIs, microservices | Public-facing apps, compliance |
| Requirement | Details | Docs |
|---|---|---|
| Dedicated subnet | One Application Gateway per subnet. No other resources allowed. Min /28, recommended /27 or /26 for autoscaling | 📄 |
| NSG | Supported but must allow GatewayManager service tag on ports 65200-65535 (v2) | 📄 |
| UDR | Do not add a 0.0.0.0/0 route pointing to an NVA — it breaks health probes. Only specific destination routes allowed | 📄 |
| Autoscaling | Set min instances ≥ 2 for production HA. Each instance ≈ 10 Capacity Units (2,500 persistent connections, ~2.2 Mbps) | 📄 |
| Private Link | Supported for private-only deployments (no public frontend IP required) | 📄 |
| Resource | Limit | Notes |
|---|---|---|
| Instances (autoscaling) | 125 | Min 0, max 125. Set min ≥ 2 for production HA |
| HTTP Listeners | 200 | 100 active (routing traffic). WAF_v2: 40 active listeners |
| Routing Rules | 400 | Request routing rules per gateway |
| Backend Pools | 100 | Up to 1,200 backend targets per pool |
| Backend HTTP Settings | 100 | One per listener/rule combination |
| Frontend Ports | 100 | Per gateway |
| Frontend IP Configs | 4 | 1 public + 1 private (IPv4), 1 public + 1 private (IPv6) |
| SSL Certificates | 100 | One per HTTPS listener |
| Rewrite Rule Sets | 400 | Header and URL rewrite rule sets |
| URL Path Map rules | 100 | Path-based rules per URL map |
| Max request size (WAF) | 4 GB | With WAF_v2 and CRS 3.2 or DRS rule sets |
| Metric | Per Capacity Unit | Per Instance (10 CU) | Max (125 instances) |
|---|---|---|---|
| Persistent connections | 2,500 | 25,000 | ~3,125,000 |
| Throughput | 2.22 Mbps | ~22 Mbps | ~2.75 Gbps |
| New connections/sec | — | ~500 (Std_v2) / ~100 (WAF_v2) | ~62,500 / ~12,500 |
| Feature | Standard | Premium |
|---|---|---|
| Global HTTP/HTTPS Load Balancing | ✓ | ✓ |
| SSL Offload | ✓ | ✓ |
| Custom Domains | ✓ | ✓ |
| URL Redirect / Rewrite | ✓ | ✓ |
| Caching (CDN) | ✓ | ✓ |
| WAF | ✓ (custom rules) | ✓ (managed + custom + bot) |
| Private Link origins | ✗ | ✓ |
| Use Case | Public web apps, CDN, simple WAF | Enterprise, Private Link backends, advanced WAF |
| Feature | Basic (default) | IP Protection | Network Protection |
|---|---|---|---|
| Layer 3/4 protection | ✓ (generic) | ✓ (adaptive) | ✓ (adaptive) |
| Adaptive tuning | ✗ | ✓ | ✓ |
| Metrics & alerts | ✗ | ✓ | ✓ |
| Mitigation flow logs | ✗ | ✓ | ✓ |
| Attack analytics / reports | ✗ | ✓ | ✓ |
| DDoS Rapid Response (DRR) | ✗ | ✗ | ✓ |
| Cost protection (credit) | ✗ | ✗ | ✓ |
| WAF discount | ✗ | ✗ | ✓ |
| Scope | All Azure public IPs (auto) | Per public IP | Per VNet (all IPs in the VNet) |
| Cost | Free | ~$199/IP/month | ~$2,944/month (100 IPs incl.) |
| Best for | Dev/test, default baseline | Few public IPs (1–14) | Enterprise, many IPs (15+) |
Create Private DNS Zones in the Hub/Connectivity subscription and link them to Spoke VNets. Never duplicate zones across subscriptions.
📄 Docs: Private Link and DNS integration at scaleUse Azure Private DNS Resolver to resolve Azure names from on-premises, and on-premises names from Azure. No more custom DNS VMs needed.
📄 Docs: Private DNS Resolver overviewDeploy the Resolver in a dedicated Spoke VNet (or Shared Services Spoke). It requires two dedicated subnets: one for the inbound endpoint (on-prem → Azure resolution, min /28) and one for the outbound endpoint (Azure → on-prem forwarding, min /28). Link the Resolver's VNet to all Private DNS Zones so inbound queries can resolve Private Endpoint records.
📄 Docs: Private DNS Resolver overviewCreate DNS forwarding rulesets on the outbound endpoint to forward specific domains (e.g. corp.local) to on-premises DNS servers. Rulesets can be linked to multiple VNets — no need to configure DNS settings per VNet. Point Spoke VNets' DNS settings to the Resolver inbound endpoint IP.
Private DNS Zones for Private Endpoints follow the format privatelink.{service}.{domain}. Don't change the names — Azure expects them exactly.
DNS auto-registration only works for VMs. A VNet can only have auto-registration enabled for one Private DNS Zone (but a zone supports up to 100 VNets with auto-registration). Use it in the Shared Services Spoke for shared VMs.
📄 Docs: Auto-registration featureWhen you enable a Private Endpoint, public resolution still works for clients not connected to the VNet. The Private DNS Zone only overrides for clients within the linked VNet.
📄 Docs: DNS for on-premises workloadsprivatelink.blob.core.windows.net
privatelink.database.windows.net
privatelink.vaultcore.azure.net
privatelink.azurewebsites.net
privatelink.azurecr.io
Enable Diagnostic Settings on all critical network resources (Firewall, VPN/ER gateways, Application Gateway, Front Door, Bastion, DDoS) and send logs/metrics to Log Analytics.
📄 Docs: Diagnostic settingsUse Virtual Network Flow Logs for traffic visibility and investigation. Build workbooks for top talkers, denied flows, and unexpected east-west traffic paths.
📄 Docs: Virtual Network Flow LogsCreate alerts for tunnel down events, gateway connection failures, firewall health degradation, App Gateway unhealthy backends, and DDoS mitigation activation.
📄 Docs: Azure Monitor alertsStandardize troubleshooting with Effective Routes, Next Hop, IP Flow Verify, Connection Troubleshoot, and Packet Capture before escalating incidents.
📄 Docs: Network Watcher toolsUse policy to enforce baseline controls (for example: approved regions/SKUs, mandatory diagnostic settings, restricted public exposure). Track compliance drift continuously.
📄 Docs: Azure Policy overviewMaintain runbooks for recurring scenarios: route leaks/asymmetry, DNS resolution failures, Private Endpoint outages, VPN/ER failover, and emergency egress controls.
📄 Docs: Operational Excellence| Resource | Default Limit | Max Limit | Scope | Docs |
|---|---|---|---|---|
| VNets per subscription | 1,000 | 1,000 | Per region | 📄 |
| Subnets per VNet | 3,000 | 3,000 | Per VNet | 📄 |
| Peerings per VNet | 500 | 1,000 (with AVNM) | Per VNet | 📄 |
| Private IPs per VNet | 65,536 | 65,536 | Per VNet | 📄 |
| Public IPs (Standard) per sub | 1,000 | On request | Per region | 📄 |
| NSGs per subscription | 5,000 | 5,000 | Per region | 📄 |
| Rules per NSG | 1,000 | 1,000 | Inbound + outbound combined | 📄 |
| Routes per Route Table | 400 | 400 | Per table | 📄 |
| Route Tables per subscription | 200 | 200 | Per region | 📄 |
| BGP routes per gateway | 1,000 | 1,000 | Per BGP peer | 📄 |
| Private Endpoints per subscription | 1,000 | On request | Per region | 📄 |
| Private DNS Zones per sub | 25,000 | 25,000 | Per subscription | 📄 |
| VNet Links per Private DNS Zone | 1,000 | 1,000 | Per zone | 📄 |
| DNS records per Private DNS Zone | 25,000 | 25,000 | Per zone | 📄 |
| NICs per VM | Depends on SKU | 8 (large VMs) | Per VM | 📄 |
| NAT Gateway — concurrent flows | 50,000 | 50,000 | Per public IP | 📄 |
| Load Balancer rules | 300 | 1,000 | Per LB | 📄 |
| Application Security Groups | 3,000 | 3,000 | Per subscription | 📄 |
The Hub VNet should contain only networking infrastructure (Firewall, Gateway, Bastion). Shared services go in a dedicated Spoke. Consider one Spoke per service/usage to simplify filtering, NSG rules, and segmentation.
📄 Docs: Hub-spoke network topologyUse /21 for the Hub, /22 for Spokes. Subnets cannot be resized with resources deployed. Always plan 2x your initial need.
Plan your address space before creating the first VNet. Consider on-premises and other clouds. Overlapping CIDRs block peering and routing.
📄 Docs: VNet FAQ (overlapping)Even with a firewall, apply NSGs to all subnets (except GatewaySubnet and FirewallSubnet). Defense in depth principle. Use Application Security Groups to simplify rules.
📄 Docs: NSG overviewEnable Accelerated Networking on all VMs that support it. It's free and reduces latency by 50%+. Nearly all SKUs with ≥ 2 vCPUs support it.
📄 Docs: Accelerated NetworkingPrefer NAT Gateway over individual public IPs for outbound traffic. Provides a stable outbound IP, more SNAT ports, and avoids Load Balancer SNAT port exhaustion.
📄 Docs: NAT Gateway overviewEnable Network Watcher in every used region. Configure VNet Flow Logs (successor to NSG Flow Logs) to a Storage Account + Log Analytics for auditing and troubleshooting.
📄 Docs: Network Watcher overviewFollow the CAF: vnet-{workload}-{region}-{env}, snet-{purpose}, nsg-{subnet}, rt-{subnet}. Consistent naming prevents production mistakes.
Azure MTU is 1,500 bytes for inter-VNet/peering traffic. Don't rely on jumbo frames cross-VNet. Ensure firewalls don't block ICMP "Fragmentation Needed" messages.
📄 Docs: VM MTU configurationDeploy zone-redundant resources wherever possible: VPN Gateway (AZ SKUs), Azure Firewall, Application Gateway, Load Balancer. Zone-redundant deployment survives a full AZ outage with no downtime.
📄 Docs: Availability Zones overviewFor multi-hub or multi-region deployments, centralize firewall policy management with Azure Firewall Manager. One policy, multiple firewalls. Works with both custom hubs and Virtual WAN secured hubs.
📄 Docs: Firewall Manager overviewMaintain a living IP address plan that covers all VNets, subnets, on-premises ranges, and reserved ranges. Review it before every new VNet or peering. Use a spreadsheet, IPAM tool, or Azure IPAM.
📄 Docs: Plan for IP addressing