Exercice 06 : Virtual Network, sous-réseaux et NSG
🎯 Objectifs
À la fin de cet exercice, vous serez capable de :
- ✅ Créer un VNet avec plusieurs sous-réseaux segmentés
- ✅ Configurer des NSG (Network Security Groups) avec des règles entrantes/sortantes
- ✅ Associer un NSG à un sous-réseau et vérifier le filtrage du trafic
- ✅ Utiliser "Vérification du flux IP" pour déboguer les règles NSG
Durée estimée : 40 minutes
Difficulté : ⭐⭐⭐☆☆ (Intermédiaire)
Prérequis : Azure CLI installée, notions de réseau TCP/IP
📖 Contexte
Un Virtual Network (VNet) est votre réseau privé isolé dans Azure. Il est l'équivalent d'un VPC AWS. Sans VNet, vos ressources Azure seraient exposées directement à internet. La segmentation en sous-réseaux + les NSG créent des zones de sécurité : les bases de données dans le sous-réseau privé ne sont accessibles que depuis le sous-réseau applicatif.
📋 Énoncé
Créez une architecture réseau sécurisée à deux niveaux : public (web) et privé (données).
🧭 Déroulement de l'exercice
Tâche 1 : Créer le VNet et ses sous-réseaux
az group create --name rg-reseau-exercice --location francecentral
# Créer le VNet avec l'espace d'adressage principal
az network vnet create \
--name vnet-exercice \
--resource-group rg-reseau-exercice \
--location francecentral \
--address-prefixes 10.0.0.0/16
# Créer le sous-réseau public (pour les serveurs web/load balancers)
az network vnet subnet create \
--name subnet-public \
--resource-group rg-reseau-exercice \
--vnet-name vnet-exercice \
--address-prefix 10.0.1.0/24
# Créer le sous-réseau privé (pour les bases de données)
az network vnet subnet create \
--name subnet-prive \
--resource-group rg-reseau-exercice \
--vnet-name vnet-exercice \
--address-prefix 10.0.2.0/24
# Vérifier la structure
az network vnet show \
--name vnet-exercice \
--resource-group rg-reseau-exercice \
--query "{adresses:addressSpace.addressPrefixes,subnets:subnets[*].{nom:name,plage:addressPrefix}}" \
--output jsonTâche 2 : Créer les Network Security Groups
# NSG pour le sous-réseau public (autorise HTTP/HTTPS/SSH)
az network nsg create \
--name nsg-public \
--resource-group rg-reseau-exercice
# Règle : autoriser HTTP depuis internet
az network nsg rule create \
--nsg-name nsg-public \
--resource-group rg-reseau-exercice \
--name "Autoriser-HTTP" \
--priority 100 \
--access Allow \
--protocol Tcp \
--direction Inbound \
--source-address-prefixes "*" \
--destination-port-ranges 80 \
--description "Trafic HTTP depuis internet"
# Règle : autoriser HTTPS
az network nsg rule create \
--nsg-name nsg-public \
--resource-group rg-reseau-exercice \
--name "Autoriser-HTTPS" \
--priority 110 \
--access Allow \
--protocol Tcp \
--direction Inbound \
--source-address-prefixes "*" \
--destination-port-ranges 443
# Règle : autoriser SSH depuis une IP spécifique seulement
MON_IP=$(curl -s https://checkip.amazonaws.com)
az network nsg rule create \
--nsg-name nsg-public \
--resource-group rg-reseau-exercice \
--name "Autoriser-SSH-MonIP" \
--priority 120 \
--access Allow \
--protocol Tcp \
--direction Inbound \
--source-address-prefixes "$MON_IP/32" \
--destination-port-ranges 22# NSG pour le sous-réseau privé (autorise uniquement les connexions depuis le subnet public)
az network nsg create \
--name nsg-prive \
--resource-group rg-reseau-exercice
# Règle : autoriser PostgreSQL depuis le subnet public seulement
az network nsg rule create \
--nsg-name nsg-prive \
--resource-group rg-reseau-exercice \
--name "Autoriser-Postgres-DepuisPublic" \
--priority 100 \
--access Allow \
--protocol Tcp \
--direction Inbound \
--source-address-prefixes 10.0.1.0/24 \
--destination-port-ranges 5432
# Règle : BLOQUER tout autre trafic entrant
az network nsg rule create \
--nsg-name nsg-prive \
--resource-group rg-reseau-exercice \
--name "Bloquer-Tout-Reste" \
--priority 4000 \
--access Deny \
--protocol "*" \
--direction Inbound \
--source-address-prefixes "*" \
--destination-port-ranges "*"Tâche 3 : Associer les NSG aux sous-réseaux
# Associer nsg-public au subnet public
az network vnet subnet update \
--name subnet-public \
--resource-group rg-reseau-exercice \
--vnet-name vnet-exercice \
--network-security-group nsg-public
# Associer nsg-prive au subnet privé
az network vnet subnet update \
--name subnet-prive \
--resource-group rg-reseau-exercice \
--vnet-name vnet-exercice \
--network-security-group nsg-prive
# Vérifier les associations
az network vnet subnet list \
--resource-group rg-reseau-exercice \
--vnet-name vnet-exercice \
--query '[*].{nom:name,plage:addressPrefix,nsg:networkSecurityGroup.id}' \
--output tableTâche 4 : Tester les règles NSG
Créer une VM dans le subnet public pour tester :
az vm create \
--name vm-test-public \
--resource-group rg-reseau-exercice \
--image Ubuntu2204 \
--vnet-name vnet-exercice \
--subnet subnet-public \
--nsg "" \ # Le NSG est déjà sur le subnet
--size Standard_B1s \
--admin-username azureuser \
--generate-ssh-keys \
--public-ip-sku Standard
# Récupérer l'IP publique
VM_IP=$(az vm show \
--resource-group rg-reseau-exercice \
--name vm-test-public \
--show-details \
--query publicIps -o tsv)
echo "IP de la VM : $VM_IP"Utiliser "Vérification du flux IP" dans Azure Network Watcher :
# Activer Network Watcher
az network watcher configure \
--resource-group NetworkWatcherRG \
--locations francecentral \
--enabled
# Vérifier si le port 80 entrant est autorisé
VM_ID=$(az vm show --resource-group rg-reseau-exercice --name vm-test-public --query id -o tsv)
az network watcher test-ip-flow \
--resource-group rg-reseau-exercice \
--direction Inbound \
--local $VM_IP:80 \
--remote 203.0.113.1:12345 \
--protocol TCP \
--vm $VM_ID
# → Access: Allow (règle: Autoriser-HTTP)
# Vérifier si le port 8080 est bloqué
az network watcher test-ip-flow \
--resource-group rg-reseau-exercice \
--direction Inbound \
--local $VM_IP:8080 \
--remote 203.0.113.1:12345 \
--protocol TCP \
--vm $VM_ID
# → Access: Deny (règle: DenyAllInBound - règle par défaut)Tâche 5 : Nettoyer
az group delete --name rg-reseau-exercice --yes --no-wait✅ Vérification du résultat
- Le VNet
10.0.0.0/16contient 2 sous-réseaux : public (10.0.1.0/24) et privé (10.0.2.0/24) - Le NSG public autorise HTTP (80), HTTPS (443) et SSH depuis mon IP
- Le NSG privé n'autorise PostgreSQL que depuis
10.0.1.0/24 - La "Vérification du flux IP" confirme que le port 80 est
Allowet le port 8080 estDeny
💡 À retenir
Ordre d'évaluation des règles NSG :
- Règles triées par priorité (100 = plus haute, 4096 = plus basse)
- Première règle correspondante = résultat final (Allow ou Deny)
- Règles par défaut implicites :
DenyAllInboundetAllowVnetInbound
NSG sur subnet vs NSG sur NIC :
- NSG sur subnet : s'applique à toutes les VM du subnet
- NSG sur NIC : s'applique à une seule VM
- Les deux peuvent coexister (les deux sont évalués)
✨ Solution Complète
# Créer un NSG minimal pour un serveur web
az network nsg create --name mon-nsg --resource-group mon-rg
az network nsg rule create --nsg-name mon-nsg --resource-group mon-rg \
--name HTTP --priority 100 --access Allow --direction Inbound \
--protocol Tcp --destination-port-ranges 80 443
az network vnet subnet update --name mon-subnet --resource-group mon-rg \
--vnet-name mon-vnet --network-security-group mon-nsg