Cloud

Azure NAT Gateway : diagnostiquer l’épuisement SNAT et la dérive d’IP sortante

Un runbook opérationnel pour qualifier les incidents de sortie Azure liés à NAT Gateway, aux ports SNAT, aux UDR, aux NSG, aux firewalls, aux allowlists et au rollback.

17 juin 2026 azurenat-gatewaysnatoutbound-networkingudrnsgfirewallapp-serviceaksobservabilitykqlrunbookrollback

Un incident NAT Gateway ressemble rarement à un incident NAT. Une API externe répond par intermittence, un partenaire refuse une IP non prévue, des workers voient des timeouts, ou un service SaaS commence à rejeter des appels pourtant valides. La tentation est forte d’ouvrir l’allowlist côté destination ou de redéployer l’application.

Le bon réflexe est de traiter la sortie Azure comme une chaîne exploitable : subnet source, routes, filtrage, NAT Gateway, ports SNAT, IP observée par la destination, logs et rollback. Le cas d’usage est un workload Azure qui sort vers Internet, un partenaire, une API SaaS ou un service exposé publiquement avec allowlist d’IP.

Lire la sortie comme une chaîne

NAT Gateway agit au niveau du subnet. Il ne corrige pas une route qui part vers un firewall, une résolution DNS incorrecte, une règle NSG trop stricte ou une destination qui refuse l’IP réellement vue.

text azure-outbound-nat-chain.txt
Workload
App Service via VNet Integration, AKS node subnet, VM, job, runner or appliance
Source subnet documented
Expected destination hostname, port and protocol

Resolution
FQDN resolved from the workload path
Public or private address expected
No conclusion based only on the admin workstation

Routing
Effective route from the source subnet
UDR toward Internet, NAT Gateway path, Azure Firewall or NVA
No accidental default route overriding the expected egress

Filtering
NSG on the source subnet or NIC
Azure Firewall or NVA rule when traffic is routed there
Destination-side allowlist or policy

NAT and evidence
NAT Gateway attached to the source subnet
Public IP or prefix expected
SNAT capacity and connection churn
Destination logs, firewall logs and application traces aligned by timestamp

Cette lecture évite deux erreurs fréquentes : conclure trop vite à un épuisement SNAT alors que la route contourne NAT Gateway, ou modifier l’application alors que la destination voit une IP différente de celle documentée.

Classer le symptôme avant de changer l’allowlist

Les mêmes timeouts peuvent venir d’une saturation de ports SNAT, d’un firewall, d’une route, d’une règle destination ou d’une résolution DNS. Le premier travail est de classer le symptôme avec le point de test.

text nat-gateway-symptomes.txt
Symptôme observé
Timeouts intermittents sous charge
  Vérifier la réutilisation de connexions, le churn TCP, la capacité SNAT et les métriques NAT Gateway

403 ou refus côté partenaire
  Comparer l’IP sortante observée avec l’allowlist réellement active

Fonctionne depuis une VM mais pas depuis l’application
  Rejouer depuis le subnet réel ou un probe équivalent

Aucun log côté NAT Gateway ou firewall
  Revenir à DNS, route effective, NSG ou mauvais point de test

Incident après un changement réseau
  Comparer UDR, association NAT Gateway, IP publique, préfixe, firewall et NSG

Incident après montée de trafic
  Vérifier ports SNAT, pooling de connexions, keep-alive et fan-out vers la même destination

Une allowlist plus large peut masquer le problème pendant quelques heures. Elle ne prouve pas que l’egress est maîtrisé.

Prouver le subnet et l’IP sortante

Commencez par vérifier que le workload sort bien depuis le subnet que vous diagnostiquez, puis contrôlez l’association NAT Gateway et l’IP vue par la destination.

bash 01-nat-gateway-subnet-egress-check.sh
VNET_RG=rg-prod-network
VNET=vnet-prod-spoke
SUBNET=snet-prod-workers

az network vnet subnet show -g "$VNET_RG" --vnet-name "$VNET" -n "$SUBNET" --query "{name:name,addressPrefix:addressPrefix,natGateway:natGateway.id,routeTable:routeTable.id,nsg:networkSecurityGroup.id}" -o jsonc

az network nat gateway show --ids "$(az network vnet subnet show -g "$VNET_RG" --vnet-name "$VNET" -n "$SUBNET" --query natGateway.id -o tsv)" --query "{name:name,publicIps:publicIpAddresses[].id,publicPrefixes:publicIpPrefixes[].id,sku:sku.name,idleTimeout:idleTimeoutInMinutes}" -o jsonc

# A exécuter depuis le workload, un conteneur de diagnostic ou un probe équivalent.
curl -s https://ifconfig.me
curl -vk --connect-timeout 5 https://api.partner.example/health

Pour App Service ou Functions avec VNet Integration, le test doit être fait depuis le contexte applicatif ou un point réellement équivalent. Pour AKS, le subnet des nodes et les chemins de sortie du cluster doivent être distingués des pods, ingress et appliances.

Lire routes, NSG et firewall ensemble

NAT Gateway n’est pas toujours le dernier composant avant Internet. Une route par défaut vers Azure Firewall ou une NVA peut être volontaire. Dans ce cas, l’IP sortante observée par la destination peut être celle du firewall, pas celle de NAT Gateway.

bash 02-effective-route-and-filter-check.sh
NIC_ID=/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg-prod/providers/Microsoft.Network/networkInterfaces/nic-prod-worker-01

az network nic show-effective-route-table --ids "$NIC_ID" -o table
az network nic list-effective-nsg --ids "$NIC_ID" -o table

# Si le subnet est routé vers Azure Firewall, vérifier le chemin firewall au lieu de conclure sur NAT Gateway.
FIREWALL_RG=rg-prod-sec
FIREWALL_NAME=afw-prod

az network firewall show -g "$FIREWALL_RG" -n "$FIREWALL_NAME" --query "{name:name,ipConfigurations:ipConfigurations[].publicIpAddress.id,sku:sku.tier}" -o jsonc

Le diagnostic doit donc répondre à une question simple : quel composant porte réellement l’IP de sortie pour ce flux précis ?

Chercher l’épuisement SNAT avec des preuves

L’épuisement SNAT apparaît surtout avec beaucoup de connexions sortantes vers le même endpoint, des connexions courtes, peu de pooling ou une montée de charge brutale. Le symptôme typique est intermittent : tout fonctionne en faible charge, puis les timeouts apparaissent.

text snat-evidence-pack.txt
Pack de preuves minimal
Période exacte de l’incident
Subnet source et NAT Gateway associée
Destination, port et protocole
Volume de connexions et taux d’erreur applicatif
IP sortante observée par la destination
Métriques NAT Gateway sur la même période
Logs firewall ou destination si un intermédiaire existe
Changement récent de route, NAT, IP publique, code ou charge

Les métriques disponibles dépendent de la configuration et de la collecte activée. Le principe reste le même : corréler capacité SNAT, tentatives de connexion et erreurs applicatives sur la même fenêtre.

kusto 03-egress-errors-correlation.kql
let Window = 2h;
let TargetHost = "api.partner.example";
AppTraces
| where TimeGenerated > ago(Window)
| where Message has_any (TargetHost, "timeout", "SocketException", "connection reset", "connection refused", "403")
| project TimeGenerated, AppRoleName, SeverityLevel, Message, OperationId
| order by TimeGenerated desc

Si la destination fournit des logs, demandez l’IP source, le timestamp, le path et le statut. Une erreur 403 avec IP inattendue ne se traite pas comme un timeout sans aucune trace côté destination.

Corriger sans ouvrir trop large

La correction doit viser la couche prouvée. Ajouter une IP à l’allowlist peut être correct si l’IP observée est légitime et documentée. Ajouter toute une plage ou contourner le firewall sans preuve est une dette d’exploitation.

text nat-gateway-correction-matrix.txt
Cause prouvée
NAT Gateway absent du subnet source
  Correction: associer NAT Gateway au bon subnet ou corriger le point de sortie
  Validation: la destination voit l’IP attendue

Route par défaut vers firewall ou NVA
  Correction: documenter l’egress réel ou ajuster UDR et règles firewall
  Validation: logs firewall et destination cohérents

IP sortante non alignée avec l’allowlist
  Correction: aligner IP publique, préfixe ou allowlist ciblée
  Validation: test horodaté depuis le workload

Epuisement SNAT probable
  Correction: réduire le churn, réutiliser les connexions, répartir la charge ou augmenter la capacité de sortie
  Validation: baisse des timeouts et métriques stables

NSG ou firewall bloque le flux
  Correction: règle ciblée source, destination, port, protocole
  Validation: deny disparu sans ouverture globale

Dans beaucoup d’incidents, la meilleure correction n’est pas réseau : activer le pooling HTTP, réduire le fan-out, fixer un timeout raisonnable ou éviter de recréer un client par requête peut réduire fortement la pression SNAT.

Préparer rollback et décision

Un changement d’egress doit avoir un retour arrière clair. Sinon, l’équipe découvre trop tard qu’elle ne sait plus quelle IP un partenaire doit autoriser.

text nat-gateway-rollback.txt
Changement
Association NAT Gateway
  Rollback: réassocier l’ancien NAT Gateway ou retirer l’association fautive
  Preuve: IP sortante avant/après et test destination

IP publique ou préfixe
  Rollback: restaurer l’IP ou le préfixe précédemment autorisé
  Preuve: allowlist partenaire et logs de refus

UDR vers firewall ou Internet
  Rollback: remettre la route précédente
  Preuve: route effective et logs du composant de sortie

Règle NSG ou firewall
  Rollback: revenir à la règle précédente ou exception temporaire ciblée
  Preuve: deny identifié et périmètre limité

Changement applicatif de pooling
  Rollback: revenir à la version précédente si erreurs fonctionnelles
  Preuve: timeouts SNAT réduits ou revenus

La décision de retour au service doit être factuelle : l’IP sortante est attendue, les logs destination sont propres, les timeouts ont cessé, et le chemin réseau est documenté.

Conclusion

Un incident NAT Gateway se traite rarement en regardant NAT Gateway seul. Il faut prouver le subnet source, la route effective, le filtrage, l’IP réellement vue, la pression SNAT et les logs de la destination.

La décision devient alors défendable : corriger l’association NAT si le subnet est faux, ajuster les UDR si le trafic sort ailleurs, cibler NSG ou firewall si un deny est prouvé, aligner l’allowlist si l’IP a dérivé, ou réduire le churn applicatif si l’épuisement SNAT est le vrai signal.