Implantar e configurar o Firewall do Azure em uma rede híbrida usando o Azure PowerShell

Ao conectar sua rede local a uma rede virtual do Azure para criar uma rede híbrida, a capacidade de controlar o acesso aos recursos da rede do Azure é uma parte importante de um plano geral de segurança.

É possível usar o Firewall do Azure para controlar o acesso de rede em uma rede híbrida usando as regras que definem tráfegos de rede permitidos e negados.

Neste artigo, você criará três redes virtuais:

  • VNet-Hub: o firewall está nessa rede virtual.
  • VNet-Spoke: a rede virtual spoke representa a carga de trabalho localizada no Azure.
  • VNet-Onprem: a rede virtual local representa uma rede local. Em uma implantação real, você pode se conectar a ela usando uma conexão de rede virtual privada (VPN) ou uma conexão do Azure ExpressRoute. Para simplificar, este artigo usa uma conexão de gateway de VPN e uma rede virtual localizada no Azure representa uma rede local.

Diagrama que mostra um firewall em uma rede híbrida.

Caso deseje usar o portal do Azure para concluir este procedimento, consulte Implantar e configurar o Firewall do Azure em uma rede híbrida usando o portal do Azure.

Observação

Recomendamos que você use o módulo Az PowerShell do Azure para interagir com o Azure. Confira Instalar o Azure PowerShell para começar. Para saber como migrar para o módulo Az PowerShell, confira Migrar o Azure PowerShell do AzureRM para o Az.

Pré-requisitos

Este artigo requer a execução do PowerShell localmente. Você deve ter os módulos do Azure PowerShell instalados. Execute Get-Module -ListAvailable Az para encontrar a versão. Se você precisa fazer a atualização, confira Instalar o módulo do Azure PowerShell. Depois de verificar a versão do PowerShell, execute Login-AzAccount para criar uma conexão com o Azure.

Há três requisitos principais para que este cenário funcione corretamente:

  • Uma UDR (rota definida pelo usuário) na sub-rede spoke que aponta para o endereço IP do Firewall do Azure como o gateway padrão. A propagação de rota do gateway de rede virtual deve ser Desabilitada nesta tabela de rotas.

  • Uma UDR na sub-rede do gateway do hub precisa apontar para o endereço IP do firewall como o próximo salto para as redes spoke.

    Nenhuma UDR é necessária na sub-rede do Firewall do Azure, já que ela aprende as rotas com o BGP (Border Gateway Protocol).

  • Certifique-se de definir AllowGatewayTransit ao emparelhar VNet-Hub à VNet-Spoke. Certifique-se de definir UseRemoteGateways ao emparelhar VNet-Spoke à VNet-Hub.

A seção Criar as rotas mais adiante nesse artigo mostra como criar essas rotas.

Observação

O Firewall do Azure deve ter conectividade direta com a Internet. Se o seu AzureFirewallSubnet conhece uma rota padrão para sua rede local via BGP, configure o Firewall do Azure no modo de túnel forçado. Se for um Firewall do Azure existente, que não pode ser reconfigurado no modo de túnel forçado, recomenda-se adicionar um UDR 0.0.0.0/0 no AzureFirewallSubnet com o valor NextHopType definido como Internet para manter a conectividade direta com a Internet.

Para obter mais informações, confira Túnel forçado do Firewall do Azure.

O tráfego entre redes virtuais emparelhadas diretamente é roteado diretamente, mesmo se uma UDR apontar para o Firewall do Azure como o gateway padrão. Para enviar o tráfego de sub-rede para sub-rede para o firewall nesse cenário, uma UDR precisa conter o prefixo de rede da sub-rede de destino explicitamente em ambas as sub-redes.

Para examinar a documentação de referência relacionada do Azure PowerShell, consulte New-AzFirewall.

Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.

Declarar as variáveis

O exemplo a seguir declara as variáveis usando os valores deste artigo. Em alguns casos, é preciso substituir alguns valores pelos seus próprios para trabalhar em sua assinatura. Modifique as variáveis, se for necessário, e depois copie e cole em seu console do PowerShell.

$RG1 = "FW-Hybrid-Test"
$Location1 = "East US"

# Variables for the firewall hub virtual network

$VNetnameHub = "VNet-Hub"
$SNnameHub = "AzureFirewallSubnet"
$VNetHubPrefix = "10.5.0.0/16"
$SNHubPrefix = "10.5.0.0/24"
$SNGWHubPrefix = "10.5.1.0/24"
$GWHubName = "GW-hub"
$GWHubpipName = "VNet-Hub-GW-pip"
$GWIPconfNameHub = "GW-ipconf-hub"
$ConnectionNameHub = "hub-to-Onprem"

# Variables for the spoke virtual network

$VnetNameSpoke = "VNet-Spoke"
$SNnameSpoke = "SN-Workload"
$VNetSpokePrefix = "10.6.0.0/16"
$SNSpokePrefix = "10.6.0.0/24"
$SNSpokeGWPrefix = "10.6.1.0/24"

# Variables for the on-premises virtual network

$VNetnameOnprem = "Vnet-Onprem"
$SNNameOnprem = "SN-Corp"
$VNetOnpremPrefix = "192.168.0.0/16"
$SNOnpremPrefix = "192.168.1.0/24"
$SNGWOnpremPrefix = "192.168.2.0/24"
$GWOnpremName = "GW-Onprem"
$GWIPconfNameOnprem = "GW-ipconf-Onprem"
$ConnectionNameOnprem = "Onprem-to-hub"
$GWOnprempipName = "VNet-Onprem-GW-pip"

$SNnameGW = "GatewaySubnet"

Criar a rede virtual do hub de firewall

Primeiro, crie um grupo de recursos para conter os recursos deste artigo:

  New-AzResourceGroup -Name $RG1 -Location $Location1

Defina as sub-redes a serem incluídas na rede virtual:

$FWsub = New-AzVirtualNetworkSubnetConfig -Name $SNnameHub -AddressPrefix $SNHubPrefix
$GWsub = New-AzVirtualNetworkSubnetConfig -Name $SNnameGW -AddressPrefix $SNGWHubPrefix

Criar a rede virtual do hub de firewall:

$VNetHub = New-AzVirtualNetwork -Name $VNetnameHub -ResourceGroupName $RG1 `
-Location $Location1 -AddressPrefix $VNetHubPrefix -Subnet $FWsub,$GWsub

Solicite um endereço IP público a ser alocado para o gateway de VPN que você criará para sua rede virtual. Observe que o valor AllocationMethod é Dynamic. Você não pode especificar o endereço IP que deseja usar. Ele é alocado dinamicamente para o gateway de VPN.

$gwpip1 = New-AzPublicIpAddress -Name $GWHubpipName -ResourceGroupName $RG1 `
-Location $Location1 -AllocationMethod Dynamic

Criar a rede virtual spoke

Defina as sub-redes a serem incluídas na rede virtual spoke:

$Spokesub = New-AzVirtualNetworkSubnetConfig -Name $SNnameSpoke -AddressPrefix $SNSpokePrefix
$GWsubSpoke = New-AzVirtualNetworkSubnetConfig -Name $SNnameGW -AddressPrefix $SNSpokeGWPrefix

Criar a rede virtual spoke:

$VNetSpoke = New-AzVirtualNetwork -Name $VnetNameSpoke -ResourceGroupName $RG1 `
-Location $Location1 -AddressPrefix $VNetSpokePrefix -Subnet $Spokesub,$GWsubSpoke

Criar a rede virtual local

Defina as sub-redes a serem incluídas na rede virtual:

$Onpremsub = New-AzVirtualNetworkSubnetConfig -Name $SNNameOnprem -AddressPrefix $SNOnpremPrefix
$GWOnpremsub = New-AzVirtualNetworkSubnetConfig -Name $SNnameGW -AddressPrefix $SNGWOnpremPrefix

Criar a rede virtual local:

$VNetOnprem = New-AzVirtualNetwork -Name $VNetnameOnprem -ResourceGroupName $RG1 `
-Location $Location1 -AddressPrefix $VNetOnpremPrefix -Subnet $Onpremsub,$GWOnpremsub

Solicite um endereço IP público para ser alocado para o gateway que será criado para a rede virtual. Observe que o valor AllocationMethod é Dynamic. Você não pode especificar o endereço IP que deseja usar. Ele é alocado dinamicamente ao gateway.

$gwOnprempip = New-AzPublicIpAddress -Name $GWOnprempipName -ResourceGroupName $RG1 `
-Location $Location1 -AllocationMethod Dynamic

Configurar e implantar o firewall

Agora, implante o firewall na rede virtual do hub:

# Get a public IP for the firewall
$FWpip = New-AzPublicIpAddress -Name "fw-pip" -ResourceGroupName $RG1 `
  -Location $Location1 -AllocationMethod Static -Sku Standard
# Create the firewall
$Azfw = New-AzFirewall -Name AzFW01 -ResourceGroupName $RG1 -Location $Location1 -VirtualNetworkName $VNetnameHub -PublicIpName fw-pip

#Save the firewall private IP address for future use

$AzfwPrivateIP = $Azfw.IpConfigurations.privateipaddress
$AzfwPrivateIP

Configurar regras de rede:

$Rule1 = New-AzFirewallNetworkRule -Name "AllowWeb" -Protocol TCP -SourceAddress $SNOnpremPrefix `
   -DestinationAddress $VNetSpokePrefix -DestinationPort 80

$Rule2 = New-AzFirewallNetworkRule -Name "AllowRDP" -Protocol TCP -SourceAddress $SNOnpremPrefix `
   -DestinationAddress $VNetSpokePrefix -DestinationPort 3389

$Rule3 = New-AzFirewallNetworkRule -Name "AllowPing" -Protocol ICMP -SourceAddress $SNOnpremPrefix `
   -DestinationAddress $VNetSpokePrefix -DestinationPort

$NetRuleCollection = New-AzFirewallNetworkRuleCollection -Name RCNet01 -Priority 100 `
   -Rule $Rule1,$Rule2 -ActionType "Allow"
$Azfw.NetworkRuleCollections = $NetRuleCollection
Set-AzFirewall -AzureFirewall $Azfw

Criar e conectar os gateways de VPN

As redes virtuais locais e de hub são conectadas por meio de gateways VPN.

Criar um gateway de VPN para a rede virtual do hub

Crie a configuração do gateway de VPN para a rede virtual do hub. A configuração do gateway de VPN define a sub-rede e o endereço IP público a usar.

$vnet1 = Get-AzVirtualNetwork -Name $VNetnameHub -ResourceGroupName $RG1
$subnet1 = Get-AzVirtualNetworkSubnetConfig -Name "GatewaySubnet" -VirtualNetwork $vnet1
$gwipconf1 = New-AzVirtualNetworkGatewayIpConfig -Name $GWIPconfNameHub `
-Subnet $subnet1 -PublicIpAddress $gwpip1

Agora crie o gateway de VPN para a rede virtual do hub. As configurações de rede para rede exigem um valor VpnType de RouteBased. A criação de um gateway de VPN geralmente pode levar 45 minutos ou mais, dependendo da SKU selecionada.

New-AzVirtualNetworkGateway -Name $GWHubName -ResourceGroupName $RG1 `
-Location $Location1 -IpConfigurations $gwipconf1 -GatewayType Vpn `
-VpnType RouteBased -GatewaySku basic

Criar um gateway de VPN para a rede virtual local

Crie a configuração do gateway de VPN para a rede virtual local. A configuração do gateway de VPN define a sub-rede e o endereço IP público a usar.

$vnet2 = Get-AzVirtualNetwork -Name $VNetnameOnprem -ResourceGroupName $RG1
$subnet2 = Get-AzVirtualNetworkSubnetConfig -Name "GatewaySubnet" -VirtualNetwork $vnet2
$gwipconf2 = New-AzVirtualNetworkGatewayIpConfig -Name $GWIPconfNameOnprem `
-Subnet $subnet2 -PublicIpAddress $gwOnprempip

Agora crie um gateway de VPN para a rede virtual local. As configurações de rede para rede exigem um valor VpnType de RouteBased. A criação de um gateway de VPN geralmente pode levar 45 minutos ou mais, dependendo da SKU selecionada.

New-AzVirtualNetworkGateway -Name $GWOnpremName -ResourceGroupName $RG1 `
-Location $Location1 -IpConfigurations $gwipconf2 -GatewayType Vpn `
-VpnType RouteBased -GatewaySku basic

Criar conexões de VPN

Agora você pode criar as conexões VPN entre o hub e os gateways locais.

Obter gateways de VPN

$vnetHubgw = Get-AzVirtualNetworkGateway -Name $GWHubName -ResourceGroupName $RG1
$vnetOnpremgw = Get-AzVirtualNetworkGateway -Name $GWOnpremName -ResourceGroupName $RG1

Criar as conexões

Nesta etapa, você criará a conexão da rede virtual do hub à rede virtual local. Os exemplos mostram uma chave compartilhada, mas você pode usar seu próprio valor para a chave compartilhada. O importante é que a chave compartilhada deve corresponder em ambas as conexões. Criar uma conexão pode levar alguns minutos para ser concluída.

New-AzVirtualNetworkGatewayConnection -Name $ConnectionNameHub -ResourceGroupName $RG1 `
-VirtualNetworkGateway1 $vnetHubgw -VirtualNetworkGateway2 $vnetOnpremgw -Location $Location1 `
-ConnectionType Vnet2Vnet -SharedKey 'AzureA1b2C3'

Crie a conexão de rede virtual entre o local e o hub. Esta etapa é semelhante à anterior, exceto que você cria a conexão da VNet-Onprem à VNet-Hub. Verifique se as chaves compartilhadas correspondem. Depois de alguns minutos, a conexão deverá ser estabelecida.

New-AzVirtualNetworkGatewayConnection -Name $ConnectionNameOnprem -ResourceGroupName $RG1 `
-VirtualNetworkGateway1 $vnetOnpremgw -VirtualNetworkGateway2 $vnetHubgw -Location $Location1 `
-ConnectionType Vnet2Vnet -SharedKey 'AzureA1b2C3'

Verificar conexão

Você pode verificar se a conexão foi bem-sucedida usando o cmdlet Get-AzVirtualNetworkGatewayConnection com ou sem -Debug.

Use o seguinte exemplo de cmdlet, configurando os valores para coincidirem com os seus. Se solicitado, selecione A para executar All. No exemplo, -Name refere-se ao nome da conexão que você deseja testar.

Get-AzVirtualNetworkGatewayConnection -Name $ConnectionNameHub -ResourceGroupName $RG1

Após a conclusão do cmdlet, exiba os valores. O exemplo a seguir mostra um status de conexão de Connected, juntamente com bytes de entrada e saída:

"connectionStatus": "Connected",
"ingressBytesTransferred": 33509044,
"egressBytesTransferred": 4142431

Emparelhar as redes virtuais hub e spoke

Agora emparelhe as redes virtuais hub e spoke:

# Peer hub to spoke
Add-AzVirtualNetworkPeering -Name HubtoSpoke -VirtualNetwork $VNetHub -RemoteVirtualNetworkId $VNetSpoke.Id -AllowGatewayTransit

# Peer spoke to hub
Add-AzVirtualNetworkPeering -Name SpoketoHub -VirtualNetwork $VNetSpoke -RemoteVirtualNetworkId $VNetHub.Id -AllowForwardedTraffic -UseRemoteGateways

Criar as rotas

Use os seguintes comandos para criar estas rotas:

  • Uma rota da sub-rede do gateway do hub até a sub-rede do spoke pelo endereço IP de firewall
  • Uma rota padrão da sub-rede do spoke pelo endereço IP de firewall
#Create a route table
$routeTableHubSpoke = New-AzRouteTable `
  -Name 'UDR-Hub-Spoke' `
  -ResourceGroupName $RG1 `
  -location $Location1

#Create a route
Get-AzRouteTable `
  -ResourceGroupName $RG1 `
  -Name UDR-Hub-Spoke `
  | Add-AzRouteConfig `
  -Name "ToSpoke" `
  -AddressPrefix $VNetSpokePrefix `
  -NextHopType "VirtualAppliance" `
  -NextHopIpAddress $AzfwPrivateIP `
 | Set-AzRouteTable

#Associate the route table to the subnet

Set-AzVirtualNetworkSubnetConfig `
  -VirtualNetwork $VNetHub `
  -Name $SNnameGW `
  -AddressPrefix $SNGWHubPrefix `
  -RouteTable $routeTableHubSpoke | `
Set-AzVirtualNetwork

#Now, create the default route

#Create a table, with BGP route propagation disabled. The property is now called "Virtual network gateway route propagation," but the API still refers to the parameter as "DisableBgpRoutePropagation."
$routeTableSpokeDG = New-AzRouteTable `
  -Name 'UDR-DG' `
  -ResourceGroupName $RG1 `
  -location $Location1 `
  -DisableBgpRoutePropagation

#Create a route
Get-AzRouteTable `
  -ResourceGroupName $RG1 `
  -Name UDR-DG `
  | Add-AzRouteConfig `
  -Name "ToFirewall" `
  -AddressPrefix 0.0.0.0/0 `
  -NextHopType "VirtualAppliance" `
  -NextHopIpAddress $AzfwPrivateIP `
 | Set-AzRouteTable

#Associate the route table to the subnet

Set-AzVirtualNetworkSubnetConfig `
  -VirtualNetwork $VNetSpoke `
  -Name $SNnameSpoke `
  -AddressPrefix $SNSpokePrefix `
  -RouteTable $routeTableSpokeDG | `
Set-AzVirtualNetwork

Criar máquinas virtuais

Crie a carga de trabalho spoke e as máquinas virtuais locais e coloque-as nas sub-redes apropriadas.

Criar a máquina virtual de carga de trabalho

Crie uma máquina virtual na rede virtual spoke que executa os Serviços de Informações da Internet (IIS) e que não tenha nenhum endereço IP público e permite a busca. Quando for solicitado, insira um nome de usuário e uma senha para a máquina virtual.

# Create an inbound network security group rule for ports 3389 and 80
$nsgRuleRDP = New-AzNetworkSecurityRuleConfig -Name Allow-RDP  -Protocol Tcp `
  -Direction Inbound -Priority 200 -SourceAddressPrefix * -SourcePortRange * -DestinationAddressPrefix $SNSpokePrefix -DestinationPortRange 3389 -Access Allow
$nsgRuleWeb = New-AzNetworkSecurityRuleConfig -Name Allow-web  -Protocol Tcp `
  -Direction Inbound -Priority 202 -SourceAddressPrefix * -SourcePortRange * -DestinationAddressPrefix $SNSpokePrefix -DestinationPortRange 80 -Access Allow

# Create a network security group
$nsg = New-AzNetworkSecurityGroup -ResourceGroupName $RG1 -Location $Location1 -Name NSG-Spoke02 -SecurityRules $nsgRuleRDP,$nsgRuleWeb

#Create the NIC
$NIC = New-AzNetworkInterface -Name spoke-01 -ResourceGroupName $RG1 -Location $Location1 -SubnetId $VnetSpoke.Subnets[0].Id -NetworkSecurityGroupId $nsg.Id

#Define the virtual machine
$VirtualMachine = New-AzVMConfig -VMName VM-Spoke-01 -VMSize "Standard_DS2"
$VirtualMachine = Set-AzVMOperatingSystem -VM $VirtualMachine -Windows -ComputerName Spoke-01 -ProvisionVMAgent -EnableAutoUpdate
$VirtualMachine = Add-AzVMNetworkInterface -VM $VirtualMachine -Id $NIC.Id
$VirtualMachine = Set-AzVMSourceImage -VM $VirtualMachine -PublisherName 'MicrosoftWindowsServer' -Offer 'WindowsServer' -Skus '2016-Datacenter' -Version latest

#Create the virtual machine
New-AzVM -ResourceGroupName $RG1 -Location $Location1 -VM $VirtualMachine -Verbose

#Install IIS on the VM
Set-AzVMExtension `
    -ResourceGroupName $RG1 `
    -ExtensionName IIS `
    -VMName VM-Spoke-01 `
    -Publisher Microsoft.Compute `
    -ExtensionType CustomScriptExtension `
    -TypeHandlerVersion 1.4 `
    -SettingString '{"commandToExecute":"powershell Add-WindowsFeature Web-Server"}' `
    -Location $Location1

#Create a host firewall rule to allow pings in
Set-AzVMExtension `
    -ResourceGroupName $RG1 `
    -ExtensionName IIS `
    -VMName VM-Spoke-01 `
    -Publisher Microsoft.Compute `
    -ExtensionType CustomScriptExtension `
    -TypeHandlerVersion 1.4 `
    -SettingString '{"commandToExecute":"powershell New-NetFirewallRule –DisplayName "Allow ICMPv4-In" –Protocol ICMPv4"}' `
    -Location $Location1

Criar a máquina virtual local

Crie uma máquina virtual simples que você usa para se conectar via acesso remoto ao endereço IP público. A partir daí, você conecta o servidor local por meio do firewall. Quando for solicitado, insira um nome de usuário e uma senha para a máquina virtual.

New-AzVm `
    -ResourceGroupName $RG1 `
    -Name "VM-Onprem" `
    -Location $Location1 `
    -VirtualNetworkName $VNetnameOnprem `
    -SubnetName $SNNameOnprem `
    -OpenPorts 3389 `
    -Size "Standard_DS2"

Observação

O Azure fornece um IP de acesso de saída padrão para VMs que não receberam um endereço IP público ou que estão no pool de back-end de um balanceador de carga do Azure básico interno. O mecanismo de IP de acesso de saída padrão fornece um endereço IP de saída que não é configurável.

O IP de acesso de saída padrão é desabilitado quando um dos seguintes eventos acontece:

  • Um endereço IP público é atribuído à VM.
  • A VM é colocada no pool de back-end de um balanceador de carga padrão, com ou sem regras de saída.
  • Um recurso do Gateway NAT do Azure é atribuído à sub-rede da VM.

As VMs criadas por conjuntos de dimensionamento de máquinas virtuais no modo de orquestração flexível não têm acesso de saída padrão.

Para mais informações sobre conexões de saída no Azure, confira Acesso de saída padrão no Azure e Usar SNAT (conversão de endereços de rede de origem) para conexões de saída.

Testar o firewall

  1. Primeiro, obtenha e anote o endereço IP privado da máquina virtual VM-spoke-01:

    $NIC.IpConfigurations.privateipaddress
    
  2. No portal do Azure, conecte a máquina virtual VM-Onprem.

  3. Abra um prompt de comando do Windows PowerShell na VM-Onprem e execute ping no IP privado para VM-spoke-01. Você deve obter uma resposta.

  4. Abra um navegador da Web em VM-Onprem e navegue até http://<VM-spoke-01 private IP>. A página padrão do IIS deve ser aberta.

  5. Na VM-Onprem, abra uma conexão de acesso remoto para VM-spoke-01 no endereço IP privado. Sua conexão deve ter êxito e você deve conseguir entrar usando o nome de usuário e a senha escolhidos.

Agora que você verificou se as regras de firewall estão funcionando:

  • Procure o servidor Web na rede virtual spoke.
  • Navegue até o servidor Web na rede virtual spoke.
  • Conecte-se ao servidor na rede virtual spoke usando RDP.

Em seguida, execute o script a seguir para alterar a ação da coleção de regras de rede de firewall para Deny:

$rcNet = $azfw.GetNetworkRuleCollectionByName("RCNet01")
$rcNet.action.type = "Deny"

Set-AzFirewall -AzureFirewall $azfw

Feche todas as conexões de acesso remoto existentes. Execute os testes novamente para testar as regras alteradas. Todos devem falhar nesse momento.

Limpar os recursos

Você pode manter os recursos de firewall para o próximo tutorial. Quando não for mais necessário, exclua o grupo de recursos Test-FW-RG para excluir todos os recursos relacionados ao firewall.

Próximas etapas

Monitorar os logs do Firewall do Azure