Condividi tramite


Configurare una rete NAT

Windows 10 e Windows 11 Hyper-V consentono nat (Network Address Translation) nativo per una rete virtuale.

Questa guida illustra le procedure seguenti:

  • creazione di una rete NAT
  • connessione di una macchina virtuale esistente alla nuova rete
  • confermare che la macchina virtuale è connessa correttamente

Requisiti:

  • Aggiornamento dell'anniversario di Windows 10 o versione successiva
  • Hyper-V è abilitato. Seguire le istruzioni per abilitare Hyper-V

Nota

Attualmente, si è limitati a una rete NAT per ogni host. Per altri dettagli sull'implementazione, le funzionalità e le limitazioni di NAT Windows (WinNAT), fare riferimento al blog sulle funzionalità e sulle limitazioni di WinNAT

Panoramica di NAT

NAT consente a una macchina virtuale di accedere alle risorse di rete usando l'indirizzo IP del computer host e una porta tramite un commutatore virtuale Hyper-V interno.

Network Address Translation (NAT) è una modalità di rete progettata per risparmiare indirizzi IP eseguendo il mapping di un indirizzo IP esterno e di una porta a un set molto più ampio di indirizzi IP interni. Fondamentalmente, un NAT usa una tabella di flusso per instradare il traffico da un indirizzo IP esterno (host) e un numero di porta all'indirizzo IP interno corretto associato a un endpoint nella rete (macchina virtuale, computer, contenitore e così via)

NAT consente inoltre a più macchine virtuali di ospitare applicazioni che richiedono porte di comunicazione identiche (interne) eseguendo il mapping di queste a porte esterne univoche.

Per tutti questi motivi, la rete NAT è molto comune per la tecnologia dei contenitori (vedere Rete dei contenitori).

Creare una rete virtuale NAT

Verrà ora illustrata la configurazione di una nuova rete NAT.

  1. Aprire una console di PowerShell come amministratore.

  2. Creare un commutatore interno.

    New-VMSwitch -SwitchName "SwitchName" -SwitchType Internal
    
  3. Trovare l'indice dell'interfaccia del commutatore virtuale appena creato.

    È possibile trovare l'indice di interfaccia eseguendo Get-NetAdapter

    L'output dovrebbe essere simile al seguente:

    PS C:\> Get-NetAdapter
    
    Name                  InterfaceDescription               ifIndex Status       MacAddress           LinkSpeed
    ----                  --------------------               ------- ------       ----------           ---------
    vEthernet (intSwitch) Hyper-V Virtual Ethernet Adapter        24 Up           00-15-5D-00-6A-01      10 Gbps
    Wi-Fi                 Marvell AVASTAR Wireless-AC Net...      18 Up           98-5F-D3-34-0C-D3     300 Mbps
    Bluetooth Network ... Bluetooth Device (Personal Area...      21 Disconnected 98-5F-D3-34-0C-D4       3 Mbps
    
    

    L'opzione interna avrà un nome come vEthernet (SwitchName) e una descrizione dell'interfaccia di Hyper-V Virtual Ethernet Adapter. Prendere nota della proprietà ifIndex da usare nel passaggio successivo.

  4. Configurare il gateway NAT usando New-NetIPAddress.

    Ecco il comando generico:

    New-NetIPAddress -IPAddress <NAT Gateway IP> -PrefixLength <NAT Subnet Prefix Length> -InterfaceIndex <ifIndex>
    

    Per configurare il gateway, sono necessarie alcune informazioni sulla rete:

    • IPAddress - IP del gateway NAT specifica l'indirizzo IPv4 o IPv6 da usare come IP del gateway NAT. Il formato generico sarà a.b.c.1 (ad esempio 172.16.0.1). Anche se la posizione finale non deve essere .1, in genere lo è (sulla base della lunghezza del prefisso). Questo indirizzo IP è compreso nell'intervallo di indirizzi usati dalle macchine virtuali guest. Ad esempio, se le macchine virtuali guest usano l'intervallo IP 172.16.0.0, è possibile usare un indirizzo IP 172.16.0.100 come gateway NAT.

      Un indirizzo IP del gateway comune è 192.168.0.1

    • PrefixLength: la lunghezza di prefisso della subnet definisce le dimensioni della subnet locale NAT (subnet mask). La lunghezza del prefisso della subnet è un valore intero compreso tra 0 e 32.

      Con 0 viene eseguito il mapping all'intera rete Internet, mentre con 32 si consente il mapping di un solo IP. I valori comuni sono compresi tra 24 e 12 a seconda del numero di IP che è necessario collegare al NAT.

      Un prefisso comune è 24. Si tratta di una subnet mask 255.255.255.255.0

    • InterfaceIndex : ifIndex è l'indice dell'interfaccia del commutatore virtuale, determinato nel passaggio precedente.

    Eseguire quanto segue per creare il gateway NAT:

    New-NetIPAddress -IPAddress 192.168.0.1 -PrefixLength 24 -InterfaceIndex 24
    
  5. Configurare la rete NAT usando New-NetNat.

    Ecco il comando generico:

    New-NetNat -Name <NATOutsideName> -InternalIPInterfaceAddressPrefix <NAT subnet prefix>
    

    Per configurare il gateway, è necessario fornire informazioni sulla rete e sul gateway NAT:

    • Name - NATOutsideName descrive il nome della rete NAT. Verrà usato per rimuovere la rete NAT.

    • InternalIPInterfaceAddressPrefix - Il prefisso della subnet NAT descrive sia il prefisso IP del gateway NAT precedente che la lunghezza del prefisso della subnet NAT precedente.

    Il formato generico sarà a.b.c.0/Lunghezza prefisso subnet NAT

    Nell'esempio precedente si userà 192.168.0.0/24

    Per questo esempio, eseguire quanto segue per configurare la rete NAT:

    New-NetNat -Name MyNATnetwork -InternalIPInterfaceAddressPrefix 192.168.0.0/24
    

Complimenti. È ora disponibile una rete NAT virtuale. Per aggiungere una macchina virtuale, alla rete NAT seguire queste istruzioni.

Connettere una macchina virtuale

Per connettere una macchina virtuale alla nuova rete NAT, connettere il commutatore interno creato nel primo passaggio della sezione Installazione rete NAT alla macchina virtuale usando il menu Impostazioni macchina virtuale.

Poiché WinNAT per sé non alloca e assegna indirizzi IP a un endpoint (ad esempio, macchina virtuale), è necessario eseguire questa operazione manualmente dall'interno della macchina virtuale stessa, ovvero impostare l'indirizzo IP all'interno dell'intervallo di prefisso interno NAT, impostare l'indirizzo IP del gateway predefinito, impostare le informazioni sul server DNS. L'unico avviso è quando l'endpoint è collegato a un contenitore. In questo caso, il servizio di rete host (HNS) alloca e usa il servizio di calcolo host (HCS) per assegnare direttamente l'indirizzo IP, l'IP del gateway e le informazioni DNS al contenitore.

Esempio di configurazione: Collegamento di macchine virtuali e contenitori a una rete NAT

Se più macchine virtuali e contenitori devono essere collegati a una singola rete NAT, è necessario verificare che il prefisso della subnet interna NAT sia sufficientemente ampio da contenere gli intervalli IP assegnati da diversi servizi o applicazioni (ad esempio, Docker per Windows e Contenitore di Windows - HNS). Questo richiederà l'assegnazione di indirizzi IP e la configurazione di rete a livello di applicazione o la configurazione manuale, che deve essere eseguita da un amministratore e deve garantire che non vengano riutilizzate assegnazioni di IP esistenti sullo stesso host.

Docker per windows (VM Linux) e contenitori Windows

La soluzione seguente consentirà a Docker per Windows (vm Linux che eseguono contenitori Linux) e ai contenitori Windows di condividere la stessa istanza WinNAT usando vSwitches interne separate. La connettività tra contenitori Linux e Windows funzionerà.

L'utente ha connesso macchine virtuali a una rete NAT tramite un vSwitch interno denominato "VMNAT" e ora vuole installare la funzionalità Contenitore Windows con il motore Docker:

PS C:\> Get-NetNat “VMNAT”| Remove-NetNat (this will remove the NAT but keep the internal vSwitch).
Install Windows Container Feature
DO NOT START Docker Service (daemon)
Edit the arguments passed to the docker daemon (dockerd) by adding –fixed-cidr=<container prefix> parameter. This tells docker to create a default nat network with the IP subnet <container prefix> (e.g. 192.168.1.0/24) so that HNS can allocate IPs from this prefix.
PS C:\> Start-Service Docker; Stop-Service Docker
PS C:\> Get-NetNat | Remove-NetNAT (again, this will remove the NAT but keep the internal vSwitch)
PS C:\> New-NetNat -Name SharedNAT -InternalIPInterfaceAddressPrefix <shared prefix>
PS C:\> Start-Service docker

Docker/HNS assegnerà gli indirizzi IP ai contenitori di Windows e l'amministratore li assegnerà alle VM dal set di confronto dei due.

L'utente ha installato la funzionalità Contenitore Windows con il motore Docker in esecuzione e ora vuole connettere le macchine virtuali alla rete NAT:

PS C:\> Stop-Service docker
PS C:\> Get-ContainerNetwork | Remove-ContainerNetwork -force
PS C:\> Get-NetNat | Remove-NetNat (this will remove the NAT but keep the internal vSwitch)
Edit the arguments passed to the docker daemon (dockerd) by adding -b “none” option to the end of docker daemon (dockerd) command to tell docker not to create a default NAT network.
PS C:\> New-ContainerNetwork –name nat –Mode NAT –subnetprefix <container prefix> (create a new NAT and internal vSwitch – HNS will allocate IPs to container endpoints attached to this network from the <container prefix>)
PS C:\> Get-Netnat | Remove-NetNAT (again, this will remove the NAT but keep the internal vSwitch)
PS C:\> New-NetNat -Name SharedNAT -InternalIPInterfaceAddressPrefix <shared prefix>
PS C:\> New-VirtualSwitch -Type internal (attach VMs to this new vSwitch)
PS C:\> Start-Service docker

Docker/HNS assegnerà gli indirizzi IP ai contenitori di Windows e l'amministratore li assegnerà alle VM dal set di confronto dei due.

Alla fine, è necessario avere due commutatori di macchina virtuale interni e uno NetNat condiviso tra di essi.

Più applicazioni che usano lo stesso NAT

Alcuni scenari richiedono che più applicazioni o servizi usino lo stesso NAT. In questo caso, è necessario seguire il flusso di lavoro seguente in modo che più applicazioni/servizi possano usare un prefisso di subnet interno NAT più grande

Verranno descritti in dettaglio la macchina virtuale Docker 4 Windows - Docker Beta - Linux co-esistente con la funzionalità Contenitore di Windows nello stesso host di un esempio. Questo flusso di lavoro è soggetto a modifiche

  1. C:> net stop docker

  2. Arrestare Docker4Windows MobyLinux VM

  3. PS C:> Get-ContainerNetwork | Remove-ContainerNetwork -force

  4. PS C:> Get-NetNat | Remove-NetNat
    Rimuove qualsiasi rete contenitore già esistente (ad esempio elimina lo switch virtuale e NetNat, esegue la pulizia)

  5. New-ContainerNetwork -Name nat -Mode NAT –subnetprefix 10.0.76.0/24 (questa subnet verrà usata per la funzionalità contenitori windows) Crea vSwitch interno denominato nat
    Crea una rete NAT denominata "nat" con il prefisso IP 10.0.76.0/24

  6. Remove-NetNAT
    Rimuove entrambe le reti NAT DockerNAT e NAT (mantiene gli switch virtuali interni)

  7. New-NetNat -Name DockerNAT -InternalIPInterfaceAddressPrefix 10.0.0.0/17 (verrà creata una rete NAT più grande sia per D4W che per i contenitori da condividere)
    Crea una rete NAT denominata DockerNAT con il prefisso più grande 10.0.0.0/17

  8. Eseguire Docker4Windows (MobyLinux.ps1)
    Crea lo switch virtuale interno DockerNAT
    Crea una rete NAT denominata "DockerNAT" con prefisso IP 10.0.75.0/24

  9. Net start docker
    Docker userà la rete NAT definita dall'utente come rete predefinita per la connessione dei contenitori di Windows

Alla fine, è necessario avere due vSwitches interni, uno denominato DockerNAT e l'altro nat denominato. Si avrà una sola rete NAT (10.0.0.0/17) confermata eseguendo Get-NetNat. Gli indirizzi IP per i contenitori windows verranno assegnati dal servizio di rete host Windows (HNS) dalla subnet 10.0.76.0/24. In base allo script MobyLinux.ps1 esistente, gli indirizzi IP per Windows Docker 4 verranno assegnati dalla subnet 10.0.75.0/24.

Risoluzione dei problemi

Più reti NAT non sono supportate

Questa guida presuppone che nell'host non siano presenti altre nat. Tuttavia, le applicazioni o i servizi richiedono l'uso di un NAT e possono crearne uno come parte della configurazione. Poiché Windows (WinNAT) supporta solo un prefisso di subnet NAT interno, il tentativo di creare più NAT inserisce il sistema in uno stato sconosciuto.

Per verificare se questo può essere il problema, assicurarsi di avere un solo NAT:

Get-NetNat

Se esiste già un NAT, eliminarlo:

Get-NetNat | Remove-NetNat

Assicurarsi di avere un solo vmSwitch "interno" per l'applicazione o la funzionalità ,ad esempio i contenitori di Windows. Registrare il nome del vSwitch:

Get-VMSwitch

Controllare se sono presenti indirizzi IP privati ,ad esempio indirizzo IP predefinito NAT, in genere x.y.z.1) dal vecchio NAT ancora assegnato a una scheda:

Get-NetIPAddress -InterfaceAlias "vEthernet (<name of vSwitch>)"

Se è in uso un indirizzo IP privato precedente, eliminarlo:

Remove-NetIPAddress -InterfaceAlias "vEthernet (<name of vSwitch>)" -IPAddress <IPAddress>

Rimozione di più NAT
Sono stati rilevati report di più reti NAT create inavvertitamente. Ciò è dovuto a un bug nelle build recenti (incluse le build di Windows Server 2016 Technical Preview 5 e Windows 10 Insider Preview). Se vengono visualizzate più reti NAT, dopo aver eseguito docker network ls o Get-ContainerNetwork, eseguire le operazioni seguenti da powerShell con privilegi elevati:

$keys = Get-ChildItem "HKLM:\SYSTEM\CurrentControlSet\Services\vmsmp\parameters\SwitchList"
foreach($key in $keys)
{
   if ($key.GetValue("FriendlyName") -eq 'nat')
   {
      $newKeyPath = $KeyPath+"\"+$key.PSChildName
      Remove-Item -Path $newKeyPath -Recurse
   }
}
Remove-NetNat -Confirm:$false
Get-ContainerNetwork | Remove-ContainerNetwork
Get-VmSwitch -Name nat | Remove-VmSwitch # failure is expected
Stop-Service docker
Set-Service docker -StartupType Disabled

Riavviare il sistema operativo prima di eseguire i comandi successivi (Restart-Computer)

Get-NetNat | Remove-NetNat
Set-Service docker -StartupType Automatic
Start-Service docker 

Vedere questa guida alla configurazione per più applicazioni che usano lo stesso NAT per ricompilare l'ambiente NAT , se necessario.

Riferimenti

Altre informazioni sulle reti NAT