Networking
Azure Private Endpoints et DNS hybride sans casser la résolution de noms
Article orienté exploitation sur les Private Endpoints, les zones DNS privées, la résolution hybride, les validations nécessaires et les schémas qui produisent du NXDOMAIN en environnement réel.
Les Private Endpoints paraissent simples jusqu’au moment où une application continue à résoudre une IP publique, où un DNS on premise répond autre chose que prévu, ou où une zone privée commence à retourner NXDOMAIN pour une ressource qui n’avait jamais vocation à devenir privée. Très souvent, le Private Endpoint lui-même est sain. Le problème se situe dans la chaîne DNS autour de lui.
L’objectif ici n’est pas seulement de créer un Private Endpoint. L’objectif est de faire en sorte que le nom se résolve correctement depuis Azure et, quand c’est nécessaire, depuis le réseau on premise, sans créer de comportement DNS contradictoire.
Ce qui doit fonctionner
Une conception propre doit rendre vrais tous les points suivants en même temps.
Le service Azure conserve son FQDN standard.
Le DNS public retourne un CNAME qui mène vers le nom privatelink.
La bonne zone DNS privée existe et est liée aux bons VNets.
Les clients qui doivent résoudre en privé disposent d’un chemin de résolution qui connaît cette zone privée.
Les clients qui doivent résoudre en public ne sont pas piégés par une zone privée incomplète.
Cible d’exemple
Les exemples ci-dessous utilisent Azure SQL Database et Storage, parce que ce sont deux cas qui exposent très bien les erreurs de design les plus fréquentes.
Service: Azure SQL Database
Nom public: appdb.database.windows.net
Zone privée: privatelink.database.windows.net
Service: Azure Storage blob
Nom public: mystorage.blob.core.windows.net
Zone privée: privatelink.blob.core.windows.net Créer les zones DNS privées
Créer les zones d’abord, puis les lier au VNet qui héberge les charges de travail devant résoudre l’IP privée.
RG_NET="rg-network-prod"
LOCATION="westeurope"
VNET_NAME="vnet-hub-prod"
az network private-dns zone create --resource-group $RG_NET --name privatelink.database.windows.net
az network private-dns zone create --resource-group $RG_NET --name privatelink.blob.core.windows.net
az network private-dns link vnet create --resource-group $RG_NET --zone-name privatelink.database.windows.net --name sql-zone-link-hub --virtual-network $VNET_NAME --registration-enabled false
az network private-dns link vnet create --resource-group $RG_NET --zone-name privatelink.blob.core.windows.net --name blob-zone-link-hub --virtual-network $VNET_NAME --registration-enabled false Il ne faut pas créer une zone vague en espérant que le reste s’alignera. Microsoft documente des noms de zones privés recommandés par service, et ces noms comptent réellement pour que la chaîne CNAME publique se termine correctement. citeturn359180search1
Créer le Private Endpoint pour SQL
La séquence la plus sûre reste zone d’abord, endpoint ensuite, validation en troisième étape.
RG_APP="rg-app-prod"
SQL_SERVER_ID="/subscriptions/<sub-id>/resourceGroups/rg-data-prod/providers/Microsoft.Sql/servers/sql-prod-01"
PE_SUBNET_ID="/subscriptions/<sub-id>/resourceGroups/rg-network-prod/providers/Microsoft.Network/virtualNetworks/vnet-hub-prod/subnets/snet-private-endpoints"
az network private-endpoint create --name pe-sql-prod-01 --resource-group $RG_APP --location westeurope --subnet $PE_SUBNET_ID --private-connection-resource-id $SQL_SERVER_ID --group-id sqlServer --connection-name pe-sql-prod-01-conn
az network private-endpoint dns-zone-group create --resource-group $RG_APP --endpoint-name pe-sql-prod-01 --name default --private-dns-zone privatelink.database.windows.net --zone-name privatelink.database.windows.net Le zone group est important. Si l’endpoint existe mais que l’association DNS est absente ou incorrecte, l’objet réseau peut paraître propre alors que les clients continuent de résoudre le chemin public.
Vérifier les enregistrements DNS côté Azure
Contrôler le record privé et l’IP affectée à l’endpoint.
az network private-endpoint show --resource-group $RG_APP --name pe-sql-prod-01 --query 'customDnsConfigs[].{fqdn:fqdn,ipAddresses:ipAddresses}' --output table
az network private-dns record-set a list --resource-group $RG_NET --zone-name privatelink.database.windows.net --output table Si tout est correct, le nom du serveur SQL doit apparaître avec une IP privée dans la zone privatelink.database.windows.net.
Vérifier depuis une charge de travail Azure
Le test doit être fait depuis une VM ou un conteneur qui utilise réellement le chemin DNS attendu, pas seulement depuis un poste d’administration.
nslookup sql-prod-01.database.windows.net
nslookup sql-prod-01.privatelink.database.windows.net
dig +short sql-prod-01.database.windows.net
dig +short sql-prod-01.privatelink.database.windows.net
Test-NetConnection sql-prod-01.database.windows.net -Port 1433 Le bon résultat n’est pas seulement que le nom privatelink réponde. Le nom public du service doit lui aussi suivre la chaîne CNAME jusqu’à l’IP privée pour les clients qui doivent rester sur le chemin privé. Microsoft documente explicitement ce comportement. citeturn359180search1
DNS hybride avec forwarders on premise
Si des clients on premise doivent résoudre l’endpoint privé, ils ont besoin d’un chemin vers Azure pour la zone privatelink. Le design propre ressemble souvent à ceci.
Serveur DNS on premise.
Forward conditionnel pour privatelink.database.windows.net et les autres zones privées nécessaires.
Destination vers un Azure DNS Private Resolver inbound endpoint, ou vers un autre chemin DNS Azure contrôlé.
Le modèle Azure DNS Private Resolver est celui que Microsoft recommande pour éviter de maintenir des VM DNS dédiées uniquement pour cette fonction. citeturn359180search5turn359180search10turn359180search8
Exemple sur un serveur DNS Windows.
Add-DnsServerConditionalForwarderZone -Name "privatelink.database.windows.net" -MasterServers 10.10.0.4 -ReplicationScope "Forest"
Add-DnsServerConditionalForwarderZone -Name "privatelink.blob.core.windows.net" -MasterServers 10.10.0.4 -ReplicationScope "Forest" Validation depuis un hôte on premise.
Resolve-DnsName sql-prod-01.database.windows.net
Resolve-DnsName sql-prod-01.privatelink.database.windows.net
Test-NetConnection sql-prod-01.database.windows.net -Port 1433 Storage est le point où beaucoup de designs dérivent
Storage expose plusieurs sous-ressources. Blob, file, queue et table ne partagent pas une zone privée universelle. Si un Private Endpoint est créé seulement pour blob, cela ne rend pas file privé. Microsoft documente des zones distinctes par sous-ressource, et c’est un point qu’il faut traiter explicitement. citeturn359180search1
Blob -> privatelink.blob.core.windows.net
File -> privatelink.file.core.windows.net
Queue -> privatelink.queue.core.windows.net
Table -> privatelink.table.core.windows.net Chaque sous-ressource doit être traitée comme une décision DNS et réseau à part entière.
Le piège NXDOMAIN
Un des schémas les plus trompeurs apparaît quand une zone DNS privée est liée dans un réseau où les requêtes vers des ressources publiques du même type passent désormais par cette zone. S’il n’existe pas d’enregistrement privé correspondant, la zone peut répondre NXDOMAIN au lieu de laisser une résolution publique normale. Microsoft le signale explicitement et documente les mécanismes de fallback. citeturn359180search1
Symptôme typique.
nslookup somepublicstorage.blob.core.windows.net
*** dns.corp.local can't find somepublicstorage.blob.core.windows.net: Non-existent domain Cause habituelle.
Une zone privée comme privatelink.blob.core.windows.net a été introduite pour un seul compte Storage, puis liée trop largement, sans stratégie de fallback pour les autres comptes qui devaient continuer à résoudre publiquement.
Vérifications à avoir dans chaque fenêtre de changement
az network private-endpoint show --resource-group $RG_APP --name pe-sql-prod-01 --output jsonc
az network private-endpoint dns-zone-group list --resource-group $RG_APP --endpoint-name pe-sql-prod-01 --output table
az network private-dns record-set a list --resource-group $RG_NET --zone-name privatelink.database.windows.net --output table
nslookup sql-prod-01.database.windows.net
nslookup sql-prod-01.privatelink.database.windows.net
dig sql-prod-01.database.windows.net
tcpping sql-prod-01.database.windows.net 1433 Si l’un de ces contrôles manque, le changement n’est pas suffisamment validé pour un passage en production.
Règles de design qui évitent les surprises
Aligner les zones privées sur la recommandation Microsoft.
Créer les zones avant les endpoints.
Utiliser les zone groups de façon explicite.
Forwarder uniquement les zones qui doivent produire des réponses privées.
Valider depuis chaque contexte de résolution important.
Traiter séparément les sous-ressources Storage.
Documenter ce qui doit rester public, sinon une zone privée finira souvent par produire du NXDOMAIN plus tard.