Challenge 02: Estratégia de sub-rede para serviços do Azure
60-90 minutos | ~$0,10 (VNets, sub-redes e NSGs são gratuitos; Bastion gera custo por hora se implantado) | Peso no exame: 25-30%
Cenário
A equipe de rede da Contoso está projetando uma VNet hub que hospedará vários serviços do Azure. Cada serviço impõe requisitos específicos de sub-rede em relação ao tamanho mínimo, convenções de nomenclatura e delegação. Sua tarefa é planejar e configurar sub-redes corretamente, aplicar delegação quando necessário e entender quais sub-redes devem ser dedicadas versus compartilhadas.
Objetivos
Após completar este desafio você será capaz de:
- Planejar e configurar sub-redes para Azure Virtual Network Gateways, Azure Firewall, Azure Bastion, Application Gateway e Private Endpoints
- Configurar delegação de sub-rede para integração VNet do App Service, Azure Container Instances e API Management
- Distinguir entre requisitos de sub-redes dedicadas e compartilhadas
- Aplicar regras de NSG exigidas pelo Azure Bastion
Pré-requisitos
- Assinatura do Azure com acesso de Contributor
- Azure CLI 2.60+ instalado
- Familiaridade com notação CIDR e planejamento de endereços IP
Tarefa 1: Criar a VNet hub com sub-redes específicas para serviços
Os serviços do Azure possuem requisitos rigorosos para nomenclatura de sub-rede, comprimento mínimo de prefixo e se outros recursos podem coexistir na mesma sub-rede. Crie uma VNet hub com espaço de endereçamento 10.0.0.0/16 e as seguintes sub-redes:
| Nome da sub-rede | Prefixo | Tamanho mínimo | Nome obrigatório | Dedicada |
|---|---|---|---|---|
| GatewaySubnet | 10.0.0.0/27 | /27 | Sim (exato) | Sim |
| AzureFirewallSubnet | 10.0.1.0/26 | /26 | Sim (exato) | Sim |
| AzureFirewallManagementSubnet | 10.0.2.0/26 | /26 | Sim (exato) | Sim |
| AzureBastionSubnet | 10.0.3.0/26 | /26 | Sim (exato) | Sim |
| AppGatewaySubnet | 10.0.4.0/24 | /24 recomendado | Não | Recomendada |
| PrivateEndpointSubnet | 10.0.5.0/24 | Sem mínimo | Não | Não |
# Set variables
RG="rg-contoso-hub"
LOCATION="eastus2"
VNET_NAME="vnet-hub-eastus2"
# Create resource group
az group create --name $RG --location $LOCATION
# Create the hub VNet
az network vnet create \
--resource-group $RG \
--name $VNET_NAME \
--location $LOCATION \
--address-prefixes 10.0.0.0/16
# GatewaySubnet — exact name required, no NSG allowed, minimum /27
az network vnet subnet create \
--resource-group $RG \
--vnet-name $VNET_NAME \
--name GatewaySubnet \
--address-prefixes 10.0.0.0/27
# AzureFirewallSubnet — exact name required, minimum /26
az network vnet subnet create \
--resource-group $RG \
--vnet-name $VNET_NAME \
--name AzureFirewallSubnet \
--address-prefixes 10.0.1.0/26
# AzureFirewallManagementSubnet — required for forced tunneling scenarios
az network vnet subnet create \
--resource-group $RG \
--vnet-name $VNET_NAME \
--name AzureFirewallManagementSubnet \
--address-prefixes 10.0.2.0/26
# AzureBastionSubnet — exact name required, minimum /26, requires specific NSG
az network vnet subnet create \
--resource-group $RG \
--vnet-name $VNET_NAME \
--name AzureBastionSubnet \
--address-prefixes 10.0.3.0/26
# Application Gateway subnet — dedicated recommended, no delegation needed
az network vnet subnet create \
--resource-group $RG \
--vnet-name $VNET_NAME \
--name AppGatewaySubnet \
--address-prefixes 10.0.4.0/24
# Private Endpoints subnet — can share with other resources, NSG supported
az network vnet subnet create \
--resource-group $RG \
--vnet-name $VNET_NAME \
--name PrivateEndpointSubnet \
--address-prefixes 10.0.5.0/24
- GatewaySubnet deve usar exatamente esse nome. Você não pode associar um NSG a ela. Mínimo /27 (recomendado /27 para coexistência com ExpressRoute).
- AzureFirewallSubnet deve usar exatamente esse nome. Mínimo /26 para suportar escalabilidade.
- AzureFirewallManagementSubnet é necessária apenas ao usar tunelamento forçado. Também deve ter no mínimo /26.
- AzureBastionSubnet deve usar exatamente esse nome. Mínimo /26. NSG é suportado, mas requer regras específicas.
- Application Gateway não requer um nome específico, mas a Microsoft recomenda uma sub-rede dedicada sem outros recursos.
- Private Endpoints podem coexistir com outros recursos na mesma sub-rede. O suporte a NSG foi adicionado em 2023.
Tarefa 2: Configurar delegação de sub-rede
A delegação de sub-rede concede a um serviço designado do Azure permissão para injetar recursos específicos do serviço na sub-rede. Uma sub-rede pode ser delegada a apenas um serviço por vez.
Crie três sub-redes adicionais com delegação:
# Subnet delegated to App Service for VNet integration
az network vnet subnet create \
--resource-group $RG \
--vnet-name $VNET_NAME \
--name AppServiceIntegrationSubnet \
--address-prefixes 10.0.10.0/24 \
--delegations Microsoft.Web/serverFarms
# Subnet delegated to Azure Container Instances
az network vnet subnet create \
--resource-group $RG \
--vnet-name $VNET_NAME \
--name AciSubnet \
--address-prefixes 10.0.11.0/24 \
--delegations Microsoft.ContainerInstance/containerGroups
# Subnet delegated to API Management (internal mode)
az network vnet subnet create \
--resource-group $RG \
--vnet-name $VNET_NAME \
--name ApimSubnet \
--address-prefixes 10.0.12.0/24 \
--delegations Microsoft.ApiManagement/service
Você também pode adicionar delegação a uma sub-rede existente usando update:
# Add delegation to an existing subnet
az network vnet subnet update \
--resource-group $RG \
--vnet-name $VNET_NAME \
--name ApimSubnet \
--delegations Microsoft.ApiManagement/service

:::tip[Fatos importantes para o exame]
- Uma sub-rede só pode ser delegada a **um** serviço por vez.
- A delegação não impede que você coloque manualmente outros recursos na sub-rede, mas o serviço delegado pode aplicar políticas de rede que restringem o que mais pode coexistir.
- `Microsoft.Web/serverFarms` é o valor de delegação para integração VNet do App Service (não `Microsoft.Web/sites`).
- Remover a delegação requer a remoção de todos os recursos delegados da sub-rede primeiro.
:::
---
## Tarefa 3: Sub-redes compartilhadas versus dedicadas
Entender quais sub-redes devem ser dedicadas é fundamental para cenários de exame:
| Sub-rede | Deve ser dedicada? | Motivo |
|---|---|---|
| GatewaySubnet | Sim | O Azure impõe isso; nenhum outro tipo de recurso é permitido |
| AzureFirewallSubnet | Sim | Azure Firewall requer uso exclusivo |
| AzureFirewallManagementSubnet | Sim | Apenas tráfego de gerenciamento |
| AzureBastionSubnet | Sim | Azure Bastion requer uso exclusivo |
| Application Gateway | Recomendada | Vários Application Gateways podem compartilhar, mas nenhum outro tipo de recurso |
| Private Endpoints | Não | Podem compartilhar com VMs, NICs e outros recursos |
| Sub-redes delegadas | Depende | O serviço delegado determina o que mais pode coexistir |
Verifique o que está implantado em cada sub-rede:
```bash
# List all resources in a subnet by checking IP configurations
az network vnet subnet show \
--resource-group $RG \
--vnet-name $VNET_NAME \
--name PrivateEndpointSubnet \
--query "{addressPrefix: addressPrefix, delegations: delegations[].serviceName, ipConfigurations: ipConfigurations[].id}" \
--output json
Tarefa 4: Configurar NSG para AzureBastionSubnet
O Azure Bastion requer um conjunto específico de regras de NSG. Se você aplicar um NSG à AzureBastionSubnet, deve incluir todas as regras a seguir. Omitir qualquer regra impedirá o Bastion de receber atualizações da plataforma ou bloqueará a conectividade com VMs.
Criar o NSG
NSG_NAME="nsg-bastion"
az network nsg create \
--resource-group $RG \
--name $NSG_NAME \
--location $LOCATION
Regras de entrada
# Allow HTTPS from Internet (user browser connections)
az network nsg rule create \
--resource-group $RG \
--nsg-name $NSG_NAME \
--name AllowHttpsInbound \
--priority 120 \
--direction Inbound \
--access Allow \
--protocol Tcp \
--source-address-prefixes Internet \
--source-port-ranges '*' \
--destination-address-prefixes '*' \
--destination-port-ranges 443
# Allow GatewayManager (control plane communication)
az network nsg rule create \
--resource-group $RG \
--nsg-name $NSG_NAME \
--name AllowGatewayManagerInbound \
--priority 130 \
--direction Inbound \
--access Allow \
--protocol Tcp \
--source-address-prefixes GatewayManager \
--source-port-ranges '*' \
--destination-address-prefixes '*' \
--destination-port-ranges 443
# Allow Azure Load Balancer health probes
az network nsg rule create \
--resource-group $RG \
--nsg-name $NSG_NAME \
--name AllowAzureLoadBalancerInbound \
--priority 140 \
--direction Inbound \
--access Allow \
--protocol Tcp \
--source-address-prefixes AzureLoadBalancer \
--source-port-ranges '*' \
--destination-address-prefixes '*' \
--destination-port-ranges 443
# Allow Bastion data-plane communication between hosts
az network nsg rule create \
--resource-group $RG \
--nsg-name $NSG_NAME \
--name AllowBastionHostCommunicationInbound \
--priority 150 \
--direction Inbound \
--access Allow \
--protocol '*' \
--source-address-prefixes VirtualNetwork \
--source-port-ranges '*' \
--destination-address-prefixes VirtualNetwork \
--destination-port-ranges 8080 5701
Regras de saída
# Allow SSH and RDP to target VMs in VNet
az network nsg rule create \
--resource-group $RG \
--nsg-name $NSG_NAME \
--name AllowSshRdpOutbound \
--priority 100 \
--direction Outbound \
--access Allow \
--protocol '*' \
--source-address-prefixes '*' \
--source-port-ranges '*' \
--destination-address-prefixes VirtualNetwork \
--destination-port-ranges 22 3389
# Allow outbound to Azure Cloud (diagnostics and metering)
az network nsg rule create \
--resource-group $RG \
--nsg-name $NSG_NAME \
--name AllowAzureCloudOutbound \
--priority 110 \
--direction Outbound \
--access Allow \
--protocol Tcp \
--source-address-prefixes '*' \
--source-port-ranges '*' \
--destination-address-prefixes AzureCloud \
--destination-port-ranges 443
# Allow Bastion data-plane communication outbound
az network nsg rule create \
--resource-group $RG \
--nsg-name $NSG_NAME \
--name AllowBastionCommunicationOutbound \
--priority 120 \
--direction Outbound \
--access Allow \
--protocol '*' \
--source-address-prefixes VirtualNetwork \
--source-port-ranges '*' \
--destination-address-prefixes VirtualNetwork \
--destination-port-ranges 8080 5701
# Allow HTTP outbound to Internet (certificate validation)
az network nsg rule create \
--resource-group $RG \
--nsg-name $NSG_NAME \
--name AllowHttpOutbound \
--priority 130 \
--direction Outbound \
--access Allow \
--protocol '*' \
--source-address-prefixes '*' \
--source-port-ranges '*' \
--destination-address-prefixes Internet \
--destination-port-ranges 80
Associar o NSG à AzureBastionSubnet
az network vnet subnet update \
--resource-group $RG \
--vnet-name $VNET_NAME \
--name AzureBastionSubnet \
--network-security-group $NSG_NAME
Todas as oito regras listadas acima são obrigatórias quando você aplica um NSG à AzureBastionSubnet. Omitir qualquer regra impedirá o Bastion de receber atualizações da plataforma ou bloqueará a conectividade com VMs. Em caso de dúvida, não associe um NSG à sub-rede do Bastion.
Tarefa 5: Verificar status de delegação e testar restrições
Verificar delegação
# Show delegation on the App Service integration subnet
az network vnet subnet show \
--resource-group $RG \
--vnet-name $VNET_NAME \
--name AppServiceIntegrationSubnet \
--query "delegations[].{service:serviceName, actions:actions}" \
--output table
# Show all subnets and their delegations
az network vnet subnet list \
--resource-group $RG \
--vnet-name $VNET_NAME \
--query "[].{name:name, prefix:addressPrefix, delegation:delegations[0].serviceName}" \
--output table
Remover delegação (requer remoção dos recursos delegados primeiro)
# Clear delegation by passing empty value
az network vnet subnet update \
--resource-group $RG \
--vnet-name $VNET_NAME \
--name AciSubnet \
--delegations ""
Cenários de quebra e correção
Estes exercícios demonstram erros comuns e proteções da plataforma.
Cenário 1: Tentar associar um NSG à GatewaySubnet
A GatewaySubnet não suporta associação de NSG. Tentar isso resultará em um erro:
# This will fail
az network nsg create \
--resource-group $RG \
--name nsg-gateway-test \
--location $LOCATION
az network vnet subnet update \
--resource-group $RG \
--vnet-name $VNET_NAME \
--name GatewaySubnet \
--network-security-group nsg-gateway-test
Resultado esperado: A operação será rejeitada com um erro indicando que o NSG não pode ser associado à GatewaySubnet.
Cenário 2: Implantar um recurso incompatível em uma sub-rede delegada
Quando uma sub-rede é delegada, o serviço pode impor restrições sobre quais outros tipos de recurso podem ser implantados:
# Attempt to create a VM NIC in the ACI-delegated subnet
az network nic create \
--resource-group $RG \
--name nic-test-aci \
--vnet-name $VNET_NAME \
--subnet AciSubnet
Resultado esperado: Dependendo da delegação, você pode receber um erro ou a operação pode ter sucesso, mas com avisos. A delegação Microsoft.ContainerInstance/containerGroups restringe a sub-rede apenas a recursos de grupos de contêiner.
Cenário 3: Criar AzureBastionSubnet com tamanho insuficiente
O Azure Bastion requer um prefixo mínimo /26. Tentar um prefixo menor falhará:
# This will fail — /28 is too small for AzureBastionSubnet
az network vnet subnet create \
--resource-group $RG \
--vnet-name $VNET_NAME \
--name AzureBastionSubnet \
--address-prefixes 10.0.100.0/28
Resultado esperado: A operação falhará com um erro de validação informando que o tamanho mínimo de sub-rede para Azure Bastion é /26.
Limpeza
az group delete --name $RG --yes --no-wait
Verificação de conhecimento
1. Qual é o comprimento mínimo do prefixo de subnet para a AzureBastionSubnet?
2. Qual das seguintes subnets NÃO pode ter um NSG associado a ela?
3. Qual é o valor correto de delegação para integração de VNet do App Service?
4. Uma subnet delegada para Microsoft.ContainerInstance/containerGroups já existe. Você precisa também delegá-la para Microsoft.Web/serverFarms. O que você deve fazer?
5. Qual regra de saída do NSG é necessária na AzureBastionSubnet para que o Bastion se conecte às VMs de destino?
6. Você precisa implantar Private Endpoints e um conjunto de VMs na mesma subnet. Isso é suportado?