Distribuire e configurare Firewall di Azure in una rete ibrida usando Azure PowerShell

Quando si connette la rete locale a una rete virtuale di Azure per creare una rete ibrida, la possibilità di controllare l'accesso alle risorse di rete di Azure è una parte importante di un piano di sicurezza complessivo.

È possibile usare Firewall di Azure per controllare l'accesso alla rete in una rete ibrida usando regole che definiscono il traffico di rete consentito e negato.

Per questo articolo vengono create tre reti virtuali:

  • VNet-Hub: il firewall si trova in questa rete virtuale.
  • VNet-Spoke: la rete virtuale spoke rappresenta il carico di lavoro che si trova in Azure.
  • VNet-Onprem: la rete virtuale locale rappresenta una rete locale. In una distribuzione effettiva è possibile connettersi usando una connessione di rete privata virtuale (VPN) o una connessione Azure ExpressRoute. Per semplicità, questo articolo usa una connessione gateway VPN e una rete virtuale situata in Azure rappresenta una rete locale.

Diagramma che mostra un firewall in una rete ibrida.

Per usare il portale di Azure per completare le procedure descritte in questo articolo, vedere Distribuire e configurare Firewall di Azure in una rete ibrida usando il portale di Azure.

Nota

È consigliabile usare il modulo Azure Az PowerShell per interagire con Azure. Per iniziare, vedere Installare Azure PowerShell. Per informazioni su come eseguire la migrazione al modulo AZ PowerShell, vedere Eseguire la migrazione di Azure PowerShell da AzureRM ad Az.

Prerequisiti

Questo articolo richiede l'esecuzione di PowerShell in locale. È necessario aver installato il modulo di Azure PowerShell. Eseguire Get-Module -ListAvailable Az per trovare la versione. Se è necessario eseguire l'aggiornamento, vedere Installare e configurare Azure PowerShell. Dopo avere verificato la versione di PowerShell, eseguire Login-AzAccount per creare una connessione ad Azure.

Per il corretto funzionamento di questo scenario devono essere soddisfatti tre requisiti principali:

  • Route definita dall'utente (UDR) nella subnet spoke che punta all'indirizzo IP Firewall di Azure come gateway predefinito. La propagazione della route del gateway di rete virtuale deve essere disabilitata in questa tabella di route.

  • Una route definita dall'utente nella subnet del gateway dell'hub deve puntare all'indirizzo IP del firewall come hop successivo per le reti spoke.

    Non è necessaria una route definita dall'utente nella subnet Firewall di Azure, perché apprende le route dal protocollo BGP (Border Gateway Protocol).

  • Assicurarsi di impostare AllowGatewayTransit quando si esegue il peering di VNet-Hub a VNet-Spoke. Impostare UseRemoteGateways quando si esegue il peering di VNet-Spoke a VNet-Hub.

La sezione Creare le route più avanti in questo articolo illustra come creare queste route.

Nota

Connettività diretta al Firewall di Azure. Se la subnet AzureFirewallSubnet apprende una route predefinita alla rete locale tramite BGP, è necessario configurare Firewall di Azure in modalità di tunneling forzato. Se si tratta di un'istanza di Firewall di Azure esistente che non può essere riconfigurata in modalità di tunneling forzato, è consigliabile aggiungere una route definita dall'utente 0.0.0.0/0 nella subnet AzureFirewallSubnet con il NextHopType valore impostato come Internet per mantenere la connettività Internet diretta.

Per altre informazioni, vedere Tunneling forzato di Firewall di Azure.

Il traffico tra reti virtuali con peering diretto viene instradato direttamente, anche se una route definita dall'utente punta a Firewall di Azure come gateway predefinito. Per inviare il traffico da subnet a subnet al firewall in questo scenario, una route definita dall'utente deve contenere il prefisso di rete della subnet di destinazione in modo esplicito in entrambe le subnet.

Per esaminare la documentazione di riferimento di Azure PowerShell correlata, vedere New-AzFirewall.

Se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare.

Dichiarare le variabili

Nell'esempio seguente vengono dichiarate le variabili usando i valori per questo articolo. In alcuni casi, potrebbe essere necessario sostituirne alcuni con valori personalizzati per usare la propria sottoscrizione. Modificare le variabili, se necessario, quindi copiarle e incollarle nella console di 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"

Creare la rete virtuale dell'hub del firewall

Creare prima di tutto il gruppo di risorse per contenere le risorse per questo articolo:

  New-AzResourceGroup -Name $RG1 -Location $Location1

Definire le subnet da includere nella rete virtuale:

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

Creare la rete virtuale dell'hub firewall:

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

Richiedere l'allocazione di un indirizzo IP pubblico al gateway VPN che verrà creato per la rete virtuale. Si noti che il AllocationMethod valore è Dynamic. Non è possibile specificare l'indirizzo IP che si vuole usare. Viene allocato in modo dinamico per il gateway VPN.

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

Creare la rete virtuale spoke

Definire le subnet da includere nella rete virtuale spoke:

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

Creare la rete virtuale spoke:

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

Creare la rete virtuale locale

Definire le subnet da includere nella rete virtuale:

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

Creare la rete virtuale locale:

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

Richiedere l'allocazione di un indirizzo IP pubblico al gateway che verrà creato per la rete virtuale. Si noti che il AllocationMethod valore è Dynamic. Non è possibile specificare l'indirizzo IP che si vuole usare. Viene allocato in modo dinamico per il gateway.

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

Configurare e distribuire il firewall

Distribuire ora il firewall nella rete virtuale 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

Configurare le regole di rete:

$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

Creare e connettere i gateway VPN

Le reti virtuali dell'hub e locale sono connesse tramite gateway VPN.

Creare un gateway VPN per la rete virtuale dell'hub

Creare la configurazione del gateway VPN per la rete virtuale hub. La configurazione del gateway VPN definisce la subnet e l'indirizzo IP pubblico da usare.

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

Creare ora il gateway VPN per la rete virtuale hub. Le configurazioni da rete a rete richiedono il VpnType valore .RouteBased La creazione di un gateway VPN può richiedere spesso 45 minuti o più, a seconda dello SKU selezionato.

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

Creare un gateway VPN per la rete virtuale locale

Creare la configurazione del gateway VPN per la rete virtuale locale. La configurazione del gateway VPN definisce la subnet e l'indirizzo IP pubblico da usare.

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

Creare ora il gateway VPN per la rete virtuale locale. Le configurazioni da rete a rete richiedono il VpnType valore .RouteBased La creazione di un gateway VPN può richiedere spesso 45 minuti o più, a seconda dello SKU selezionato.

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

Creare le connessioni VPN

Creare le connessioni VPN tra l'hub e i gateway locali.

Ottenere i gateway VPN

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

Creare le connessioni

In questo passaggio si crea la connessione dalla rete virtuale dell'hub alla rete virtuale locale. Gli esempi mostrano una chiave condivisa, ma è possibile usare i propri valori per la chiave condivisa. L'importante è che la chiave condivisa corrisponda per entrambe le configurazioni. Il completamento della creazione di una connessione può richiedere un po' di tempo.

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

Creare la connessione di rete virtuale dall'ambiente locale all'hub. Questo passaggio è simile a quello precedente, ad eccezione del fatto che si crea la connessione da VNet-Onprem a VNet-Hub. Assicurarsi che le chiavi condivise corrispondano. La connessione viene stabilita dopo alcuni minuti.

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

Verificare la connessione

È possibile verificare una connessione riuscita usando il Get-AzVirtualNetworkGatewayConnection cmdlet , con o senza -Debug.

Usare l'esempio di cmdlet seguente, ma configurare i valori in modo che corrispondano ai propri. Se richiesto, selezionare A per eseguire All. Nell'esempio si riferisce -Name al nome della connessione da testare.

Get-AzVirtualNetworkGatewayConnection -Name $ConnectionNameHub -ResourceGroupName $RG1

Al termine dell'esecuzione del cmdlet, visualizzare i valori. Nell'esempio seguente viene illustrato lo stato di Connectedconnessione , insieme ai byte in ingresso e in uscita:

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

Eseguire il peering tra le reti virtuali dell'hub e spoke

Eseguire ora il peering delle reti virtuali hub-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

Creare le route

Usare i comandi seguenti per creare queste route:

  • Una route dalla subnet del gateway dell'hub alla subnet spoke attraverso l'indirizzo IP del firewall
  • Una route predefinita dalla subnet spoke attraverso l'indirizzo IP del 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

Creare macchine virtuali

Creare il carico di lavoro spoke e le macchine virtuali locali e inserirli nelle subnet appropriate.

Creare la macchina virtuale per il carico di lavoro

Creare una macchina virtuale nella rete virtuale spoke che esegue Internet Information Services (IIS), non dispone di un indirizzo IP pubblico e consente il ping in. Quando richiesto, immettere un nome utente e una password per la macchina virtuale.

# 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

Creare la macchina virtuale locale

Creare una semplice macchina virtuale che è possibile usare per connettersi tramite accesso remoto all'indirizzo IP pubblico. Da qui è possibile connettersi al server locale tramite il firewall. Quando richiesto, immettere un nome utente e una password per la macchina virtuale.

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

Nota

Azure fornisce un IP di accesso in uscita predefinito per le macchine virtuali a cui non è stato assegnato un indirizzo IP pubblico o che si trovano nel pool back-end di un servizio del bilanciamento del carico di base di Azure. Il meccanismo dell'IP di accesso in uscita predefinito fornisce un IP in uscita non configurabile.

L'IP di accesso in uscita predefinito è disabilitato quando si verifica uno degli eventi seguenti:

  • Alla macchina virtuale viene assegnato un indirizzo IP pubblico.
  • La macchina virtuale è posizionata nel pool back-end di un servizio di bilanciamento del carico standard, con o senza regole in uscita.
  • Una risorsa gateway NAT di Azure viene assegnata alla subnet della macchina virtuale.

Le macchine virtuali create usando set di scalabilità di macchine virtuali in modalità di orchestrazione flessibile non hanno l'accesso in uscita predefinito.

Per altre informazioni sulle connessioni in uscita in Azure, vedere Accesso in uscita predefinito in Azure e Uso di Source Network Address Translation (SNAT) per le connessioni in uscita.

Testare il firewall

  1. Ottenere e quindi prendere nota dell'indirizzo IP privato per la macchina virtuale VM-spoke-01 :

    $NIC.IpConfigurations.privateipaddress
    
  2. Dal portale di Azure connettersi alla macchina virtuale VM-Onprem.

  3. Aprire un prompt dei comandi di Windows PowerShell in VM-Onprem ed effettuare il ping dell'IP privato per VM-spoke-01. Si dovrebbe ricevere una risposta.

  4. Aprire un Web browser in VM-Onprem e passare a http://<VM-spoke-01 private IP>. Verrà aperta la pagina predefinita di IIS.

  5. Da VM-Onprem aprire una connessione di accesso remoto a VM-spoke-01 all'indirizzo IP privato. La connessione dovrebbe avere esito positivo e dovrebbe essere possibile accedere usando il nome utente e la password scelti.

Dopo aver verificato che le regole del firewall funzionano, è possibile:

  • Effettuare il ping del server nella rete virtuale spoke.
  • Passare al server Web nella rete virtuale spoke.
  • Connessione al server nella rete virtuale spoke tramite RDP.

Eseguire quindi lo script seguente per modificare l'azione per la raccolta di regole di rete del firewall in Deny:

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

Set-AzFirewall -AzureFirewall $azfw

Chiudere tutte le connessioni di accesso remoto esistenti. Eseguire di nuovo i test per testare le regole modificate. che dovrebbero avere tutti esito negativo.

Pulire le risorse

È possibile mantenere le risorse del firewall per l'esercitazione successiva. Se non sono più necessari, eliminare il gruppo di risorse FW-Hybrid-Test per eliminare tutte le risorse correlate al firewall.

Passaggi successivi

Monitorare i log del firewall di Azure