Indirizzare il traffico di rete con una tabella di route usando PowerShell

Per impostazione predefinita, Azure indirizza automaticamente il traffico tra tutte le subnet di una rete virtuale. È possibile creare le proprie route per eseguire l'override del routing predefinito di Azure. La possibilità di creare route personalizzate è utile se, ad esempio, si vuole indirizzare il traffico tra subnet attraverso un'appliance virtuale di rete. In questo articolo vengono illustrate le operazioni seguenti:

  • Creare una tabella di route
  • Creare una route
  • Creare una rete virtuale con più subnet
  • Associare una tabella di routing a una subnet
  • Creare un'appliance virtuale di rete che indirizza il traffico
  • Distribuire le macchine virtuali in subnet diverse
  • Indirizzare il traffico da una subnet a un'altra attraverso un'appliance virtuale di rete

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

Azure Cloud Shell

Azure Cloud Shell è un ambiente di shell interattivo ospitato in Azure e usato tramite il browser. È possibile usare Bash o PowerShell con Cloud Shell per usare i servizi di Azure. È possibile usare i comandi preinstallati di Cloud Shell per eseguire il codice in questo articolo, senza dover installare alcun elemento nell'ambiente locale.

Per avviare Azure Cloud Shell:

Opzione Esempio/Collegamento
Selezionare Prova nell'angolo superiore destro di un codice o di un blocco di comandi. Selezionando Prova non viene copiato automaticamente il codice o il comando in Cloud Shell. Screenshot that shows an example of Try It for Azure Cloud Shell.
Passare a https://shell.azure.com o selezionare il pulsante Avvia Cloud Shell per aprire Cloud Shell nel browser. Button to launch Azure Cloud Shell.
Selezionare il pulsante Cloud Shell nella barra dei menu nell'angolo in alto a destra del portale di Azure. Screenshot that shows the Cloud Shell button in the Azure portal

Per usare Azure Cloud Shell:

  1. Avviare Cloud Shell.

  2. Selezionare il pulsante Copia in un blocco di codice (o blocco di comandi) per copiare il codice o il comando.

  3. Incollare il codice o il comando nella sessione di Cloud Shell selezionando CTRL+MAIUSC+V in Windows e Linux oppure selezionando CMD+MAIUSC+V in macOS.

  4. Selezionare INVIO per eseguire il codice o il comando.

Se si sceglie di installare e usare PowerShell in locale, per questo articolo è necessario il modulo Azure PowerShell 1.0.0 o versione successiva. Eseguire Get-Module -ListAvailable Az per trovare la versione installata. Se è necessario eseguire l'aggiornamento, vedere Installare e configurare Azure PowerShell. Se si esegue PowerShell in locale, è anche necessario eseguire Connect-AzAccount per creare una connessione con Azure.

Creare una tabella di route

Prima di creare una tabella di route, creare un gruppo di risorse con New-AzResourceGroup. L'esempio seguente crea un gruppo di risorse denominato myResourceGroup per tutte le risorse create in questo articolo.

New-AzResourceGroup -ResourceGroupName myResourceGroup -Location EastUS

Creare una tabella di route con New-AzRouteTable. L'esempio seguente crea una tabella di route denominata myRouteTablePublic.

$routeTablePublic = New-AzRouteTable `
  -Name 'myRouteTablePublic' `
  -ResourceGroupName myResourceGroup `
  -location EastUS

Creare una route

Creare una route recuperando l'oggetto tabella di route con Get-AzRouteTable, creare una route con Add-AzRouteConfig, quindi scrivere la configurazione della route nella tabella di route con Set-AzRouteTable.

Get-AzRouteTable `
  -ResourceGroupName "myResourceGroup" `
  -Name "myRouteTablePublic" `
  | Add-AzRouteConfig `
  -Name "ToPrivateSubnet" `
  -AddressPrefix 10.0.1.0/24 `
  -NextHopType "VirtualAppliance" `
  -NextHopIpAddress 10.0.2.4 `
 | Set-AzRouteTable

Associare una tabella di routing a una subnet

Prima di poter associare una tabella di route a una subnet, è necessario creare una rete virtuale e una subnet. Creare una rete virtuale con New-AzVirtualNetwork. L'esempio seguente crea una rete virtuale denominata myVirtualNetwork con il prefisso dell'indirizzo 10.0.0.0/16.

$virtualNetwork = New-AzVirtualNetwork `
  -ResourceGroupName myResourceGroup `
  -Location EastUS `
  -Name myVirtualNetwork `
  -AddressPrefix 10.0.0.0/16

Creare tre subnet creando tre configurazioni di subnet con New-AzVirtualNetworkSubnetConfig. L'esempio seguente crea tre configurazioni subnet per le subnet Public, Private e DMZ:

$subnetConfigPublic = Add-AzVirtualNetworkSubnetConfig `
  -Name Public `
  -AddressPrefix 10.0.0.0/24 `
  -VirtualNetwork $virtualNetwork

$subnetConfigPrivate = Add-AzVirtualNetworkSubnetConfig `
  -Name Private `
  -AddressPrefix 10.0.1.0/24 `
  -VirtualNetwork $virtualNetwork

$subnetConfigDmz = Add-AzVirtualNetworkSubnetConfig `
  -Name DMZ `
  -AddressPrefix 10.0.2.0/24 `
  -VirtualNetwork $virtualNetwork

Scrivere le configurazioni della subnet nella rete virtuale con Set-AzVirtualNetwork, che crea le subnet nella rete virtuale:

$virtualNetwork | Set-AzVirtualNetwork

Associare la tabella di route myRouteTablePublic alla subnet Public con Set-AzVirtualNetworkSubnetConfig e quindi scrivere la configurazione della subnet nella rete virtuale con Set-AzVirtualNetwork.

Set-AzVirtualNetworkSubnetConfig `
  -VirtualNetwork $virtualNetwork `
  -Name 'Public' `
  -AddressPrefix 10.0.0.0/24 `
  -RouteTable $myRouteTablePublic | `
Set-AzVirtualNetwork

Creare un'appliance virtuale di rete

Un'appliance virtuale di rete è una macchina virtuale che svolge una funzione di rete, ad esempio il routing, la protezione tramite firewall o l'ottimizzazione della WAN.

Prima di creare una macchina virtuale occorre creare un'interfaccia di rete.

Creare un'interfaccia di rete

Prima di creare un'interfaccia di rete, è necessario recuperare l'ID della rete virtuale con Get-AzVirtualNetwork, quindi l'ID subnet con Get-AzVirtualNetworkSubnetConfig. Creare un'interfaccia di rete con New-AzNetworkInterface nella subnet della rete perimetrale con inoltro IP abilitato:

# Retrieve the virtual network object into a variable.
$virtualNetwork=Get-AzVirtualNetwork `
  -Name myVirtualNetwork `
  -ResourceGroupName myResourceGroup

# Retrieve the subnet configuration into a variable.
$subnetConfigDmz = Get-AzVirtualNetworkSubnetConfig `
  -Name DMZ `
  -VirtualNetwork $virtualNetwork

# Create the network interface.
$nic = New-AzNetworkInterface `
  -ResourceGroupName myResourceGroup `
  -Location EastUS `
  -Name 'myVmNva' `
  -SubnetId $subnetConfigDmz.Id `
  -EnableIPForwarding

Creazione di una macchina virtuale

Per creare una macchina virtuale e collegarvi un'interfaccia di rete esistente, è prima necessario creare una configurazione di macchina virtuale con New-AzVMConfig. La configurazione include l'interfaccia di rete creata nel passaggio precedente. Quando richiesto, selezionare il nome utente e la password con cui si vuole accedere alla macchina virtuale.

# Create a credential object.
$cred = Get-Credential -Message "Enter a username and password for the VM."

# Create a VM configuration.
$vmConfig = New-AzVMConfig `
  -VMName 'myVmNva' `
  -VMSize Standard_DS2 | `
  Set-AzVMOperatingSystem -Windows `
    -ComputerName 'myVmNva' `
    -Credential $cred | `
  Set-AzVMSourceImage `
    -PublisherName MicrosoftWindowsServer `
    -Offer WindowsServer `
    -Skus 2016-Datacenter `
    -Version latest | `
  Add-AzVMNetworkInterface -Id $nic.Id

Creare la macchina virtuale usando la configurazione della macchina virtuale con New-AzVM. L'esempio seguente crea una macchina virtuale denominata myVmNva.

$vmNva = New-AzVM `
  -ResourceGroupName myResourceGroup `
  -Location EastUS `
  -VM $vmConfig `
  -AsJob

L'opzione -AsJob crea la macchina virtuale in background, pertanto è possibile continuare con il passaggio successivo.

Creare macchine virtuali

Creare due macchine virtuali nella rete virtuale per poter verificare che il traffico dalla subnet Public venga indirizzato alla subnet Private attraverso l'appliance virtuale di rete in un passaggio successivo.

Creare una macchina virtuale nella subnet Pubblica con New-AzVM. L'esempio seguente crea una macchina virtuale denominata myVmPublic nella subnet Public della rete virtuale myVirtualNetwork.

New-AzVm `
  -ResourceGroupName "myResourceGroup" `
  -Location "East US" `
  -VirtualNetworkName "myVirtualNetwork" `
  -SubnetName "Public" `
  -ImageName "Win2016Datacenter" `
  -Name "myVmPublic" `
  -AsJob

Creare una macchina virtuale nella subnet Private.

New-AzVm `
  -ResourceGroupName "myResourceGroup" `
  -Location "East US" `
  -VirtualNetworkName "myVirtualNetwork" `
  -SubnetName "Private" `
  -ImageName "Win2016Datacenter" `
  -Name "myVmPrivate"

La creazione della VM richiede alcuni minuti. Non proseguire con il passaggio successivo fino a quando non viene creata la macchina virtuale e Azure non restituisce l'output a PowerShell.

Indirizzare il traffico attraverso un'appliance virtuale di rete

Usare Get-AzPublicIpAddress per restituire l'indirizzo IP pubblico della macchina virtuale myVmPrivate . L'esempio seguente restituisce l'indirizzo IP pubblico della macchina virtuale myVmPrivate:

Get-AzPublicIpAddress `
  -Name myVmPrivate `
  -ResourceGroupName myResourceGroup `
  | Select IpAddress

Usare il comando seguente per creare una sessione Desktop remoto con la macchina virtuale myVmPrivate dal computer locale. Sostituire <publicIpAddress> con l'indirizzo IP restituito dal comando precedente.

mstsc /v:<publicIpAddress>

Aprire il file RDP scaricato. Quando richiesto, selezionare Connetti.

Immettere il nome utente e la password specificati durante la creazione della macchina virtuale (potrebbe essere necessario selezionare Altre opzioni, quindi Usa un account diverso per specificare le credenziali immesse quando è stata creata la macchina virtuale), quindi scegliere OK. Durante il processo di accesso, è possibile che venga visualizzato un avviso relativo al certificato. Selezionare per procedere con la connessione.

In un passaggio successivo, il comando viene usato per testare il tracert.exe routing. Tracert usa il protocollo ICMP (Internet Control Message Protocol), che viene rifiutato tramite Windows Firewall. Abilitare il protocollo ICMP tramite Windows Firewall immettendo il comando seguente da PowerShell nella VM myVmPrivate:

New-NetFirewallRule -DisplayName "Allow ICMPv4-In" -Protocol ICMPv4

Anche se in questo articolo viene usato il tracciamento delle route per testare il routing, non è consigliabile consentire il protocollo ICMP tramite Windows Firewall per le distribuzioni di produzione.

In Enable IP forwarding (Abilitare l'inoltro IP) è stato abilitato l'inoltro IP all'interno di Azure per l'interfaccia di rete della macchina virtuale. All'interno della macchina virtuale è necessario che il sistema operativo o un'applicazione in esecuzione nella macchina virtuale sia anche in grado di inoltrare il traffico di rete. Abilitare l'inoltro IP all'interno del sistema operativo della macchina virtuale myVmNva.

Da un prompt dei comandi nella macchina virtuale myVmPrivate, avviare una sessione Desktop remoto con myVmNva:

mstsc /v:myvmnva

Per abilitare l'inoltro IP nel sistema operativo, immettere il comando seguente in PowerShell dalla macchina virtuale myVmNva:

Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters -Name IpEnableRouter -Value 1

Riavviare la macchina virtuale myVmNva. Con questa operazione verrà anche disconnessa la sessione Desktop remoto.

Mentre si è ancora connessi alla macchina virtuale myVmPrivate, creare una sessione Desktop remoto alla macchina virtuale myVmPublic dopo il riavvio della macchina virtuale myVmNva:

mstsc /v:myVmPublic

Abilitare il protocollo ICMP tramite Windows Firewall immettendo il comando seguente da PowerShell nella VM myVmPublic:

New-NetFirewallRule –DisplayName "Allow ICMPv4-In" –Protocol ICMPv4

Per testare il routing del traffico di rete alla macchina virtuale myVmPrivate dalla macchina virtuale myVmPublic, immettere il comando seguente da PowerShell nella macchina virtuale myVmPublic:

tracert myVmPrivate

La risposta restituita è simile all'esempio seguente:

Tracing route to myVmPrivate.vpgub4nqnocezhjgurw44dnxrc.bx.internal.cloudapp.net [10.0.1.4]
over a maximum of 30 hops:

1    <1 ms     *        1 ms  10.0.2.4
2     1 ms     1 ms     1 ms  10.0.1.4

Trace complete.

Come si può notare, il primo hop è 10.0.2.4, cioè l'indirizzo IP privato dell'appliance virtuale di rete. Il secondo hop è 10.0.1.4, ossia l'indirizzo IP privato della macchina virtuale myVmPrivate. A causa della route aggiunta alla tabella di route myRouteTablePublic e associata alla subnet Public, Azure ha indirizzato il traffico di Azure attraverso l'appliance virtuale di rete, invece che direttamente alla subnet Private.

Chiudere la sessione Desktop remoto alla macchina virtuale myVmPublic. Si rimarrà tuttavia connessi alla macchina virtuale myVmPrivate.

Per testare il routing del traffico di rete alla macchina virtuale myVmPublic dalla macchina virtuale myVmPrivate, immettere il comando seguente da un prompt dei comandi nella macchina virtuale myVmPrivate:

tracert myVmPublic

La risposta restituita è simile all'esempio seguente:

Tracing route to myVmPublic.vpgub4nqnocezhjgurw44dnxrc.bx.internal.cloudapp.net [10.0.0.4]
over a maximum of 30 hops:

1     1 ms     1 ms     1 ms  10.0.0.4

Trace complete.

Come si può osservare, il traffico viene indirizzato direttamente dalla macchina virtuale myVmPrivate alla macchina virtuale myVmPublic. Per impostazione predefinita, Azure instrada il traffico direttamente tra subnet.

Chiudere la sessione Desktop remoto alla macchina virtuale myVmPrivate.

Pulire le risorse

Quando non è più necessario, usare Remove-AzResourcegroup per rimuovere il gruppo di risorse e tutte le risorse in esso contenute.

Remove-AzResourceGroup -Name myResourceGroup -Force

Passaggi successivi

In questo articolo è stata creata una tabella di route per poi associarla a una subnet. È stata creata una semplice appliance virtuale di rete che ha indirizzato il traffico da una subnet pubblica a una subnet privata. Distribuire una varietà di appliance virtuali di rete preconfigurate che svolgono funzioni di rete come la protezione tramite firewall e l'ottimizzazione della WAN da Azure Marketplace. Per altre informazioni sul routing, vedere Panoramica del routing e Gestire una tabella di route.

Benché sia possibile distribuire molte risorse di Azure all'interno di una rete virtuale, non è possibile distribuire le risorse per alcuni servizi PaaS di Azure in una rete virtuale. È comunque possibile limitare l'accesso alle risorse di alcuni servizi PaaS di Azure al traffico da una sola subnet della rete virtuale. Per informazioni su come fare, vedere Limitare l'accesso alla rete alle risorse PaaS.