1. The Problem: Public PaaS Endpoints

  • Azure Storage, SQL, Key Vault, etc. are reachable over the internet by default (e.g., mystorageacct.blob.core.windows.net → public IP).
  • Even with firewall rules, traffic traverses the Microsoft backbone but leaves the VNet boundary — violating zero-trust network segmentation.
  • Compliance frameworks (PCI-DSS, HIPAA) often require data-plane traffic to stay on private networks end-to-end.

2. Service Endpoints vs Private Endpoints

Aspect
Service Endpoint
Private Endpoint
Mechanism
Optimized route from subnet to PaaS public IP
NIC with private IP mapped to specific PaaS resource
IP seen by PaaS
VNet's public IP (source changes to VNet IP)
Private IP from your subnet
Cross-region
Same region only (except Storage RA-GRS)
Works across regions & tenants
DNS change needed
No — still resolves to public IP
Yes — must resolve to private IP
On-premises access
Not supported (public IP path)
Reachable via VPN/ER + DNS forwarding
NSG support
Service tags in NSG
NSG on PE subnet (since 2023)
Cost
Free
~$7.30/month per endpoint + data processing
Zero-trust alignment
Partial — still public IP resolution
Full — true private connectivity

3. Private Endpoint Architecture

App queries storageacct.blob.core.windows.net
↓ CNAME
Redirects to storageacct.privatelink.blob.core.windows.net
↓ Private DNS Zone
Private DNS Zone returns 10.1.2.5 (PE private IP)
↓ direct
Traffic flows VNet → PE NIC → Private Link → PaaS resource
  • Private Endpoint — A network interface placed in your subnet with a private IP, mapped to a specific sub-resource (e.g., blob, sqlServer, vault).
  • Private Link — The underlying platform that maps the PE NIC to the PaaS resource's data plane via Microsoft's backbone.
  • Traffic never leaves Microsoft's network; no public IP exposure for the PaaS resource.
  • PE supports sub-resource targeting: one PE per sub-resource (e.g., separate PEs for blob vs table on same storage account).

4. DNS Integration — The Critical Piece

Private DNS Zones linked here (e.g., privatelink.blob.core.windows.net) + DNS Forwarder / Azure DNS Private Resolver
↕ VNet Links
VNets linked to Private DNS Zones — queries resolve PE IPs automatically
↕ VPN / ExpressRoute
Conditional forwarder → DNS Private Resolver inbound endpoint (168.63.129.16 via hub)
  • Private DNS Zones — Azure-managed DNS zones (e.g., privatelink.blob.core.windows.net) hosting A records for PE IPs.
  • VNet Links — Link Private DNS Zone to each VNet needing resolution. Auto-registration optional.
  • Azure DNS Private Resolver — Enables on-prem → Azure DNS queries (inbound endpoint) and Azure → on-prem (outbound endpoint + ruleset).
  • Conditional Forwarding — On-prem DNS forwards *.privatelink.*.core.windows.net to Private Resolver inbound IP.
  • Pitfall: Without correct DNS, clients resolve the public IP and bypass the PE — traffic blocked if public access is disabled.

5. Common Services with Private Endpoints

ServiceSub-resourceDNS Zone
Storage (Blob)blobprivatelink.blob.core.windows.net
Azure SQLsqlServerprivatelink.database.windows.net
Cosmos DBSql / MongoDBprivatelink.documents.azure.com
Key Vaultvaultprivatelink.vaultcore.azure.net
ACRregistryprivatelink.azurecr.io
AKS APImanagementprivatelink.{region}.azmk8s.io

6. Private Link Service — Expose YOUR Service

  • Private Link Service (PLS) — Place behind a Standard Load Balancer to expose your service to consumers in other VNets/tenants.
  • Consumer creates a Private Endpoint that targets your PLS — gets a private IP in their VNet mapped to your LB frontend.
  • Approval workflow — You control who can connect (auto-approve by subscription or manual approval).
  • NAT — Consumer's source IP is NAT'd; you see traffic from the PLS NAT IP range, not the consumer's original IP.
  • Use case: ISV SaaS platforms exposing APIs privately to enterprise customers without peering.

7. Disable Public Access

  • Creating a PE alone does NOT block public access — you must explicitly disable it.
  • Storage: Set publicNetworkAccess: Disabled or use "Allow access from selected VNets" with no entries.
  • SQL: Set "Deny public network access" = Yes.
  • Key Vault: Disable public access under Networking → Firewalls.
  • Validate: From an external network, confirm connections are refused; from PE-enabled VNet, confirm connectivity.

🌍 Real-World Scenario

Zero-Trust Data Platform

A financial services firm builds an analytics platform: Azure SQL, Storage (Data Lake), Key Vault, and Azure Data Factory — all with public access disabled. Private Endpoints for each service are deployed into a dedicated "data-services" subnet in a spoke VNet. Private DNS Zones are centralized in the hub VNet with VNet links to all spokes. On-premises ETL servers reach PaaS services via ExpressRoute → hub DNS Private Resolver → PE resolution. NSGs on the PE subnet restrict traffic to only the Data Factory managed VNet and the analytics App Service subnet. Result: all data-plane traffic is private, auditable, and passes through network-layer controls — satisfying PCI-DSS and internal zero-trust mandates.

📝 Exam Tip

When a question involves on-premises access to PaaS over VPN/ExpressRoute, the answer is Private Endpoint (not Service Endpoint — those don't work from on-prem). Remember: DNS is the #1 failure point — if the question mentions "client still connects to public IP despite PE," the fix is Private DNS Zone + VNet link or conditional forwarding. Also: Private Endpoint works cross-region; Service Endpoint is same-region only.

🧪 Knowledge Check

Q1: An on-premises application needs to access Azure SQL via ExpressRoute without any public internet exposure. What should you use?

Q2: After creating a Private Endpoint for a Storage account, users in the VNet still connect via the public IP. What is the most likely cause?

Q3: Which statement about Private Link Service is correct?

Q4: What is a key limitation of Service Endpoints compared to Private Endpoints?