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:

  • Creare una rete NAT
  • Connettere una macchina virtuale esistente alla nuova rete
  • Verificare che la macchina virtuale sia 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 altre informazioni sull'implementazione, le funzionalità e le limitazioni di NAT (WinNAT) di Windows, fare riferimento al blog funzionalità e 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 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.

    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 ...                    21 Disconnected 98-5F-D3-34-0C-D4       3 Mbps
    
    

    Il commutatore interno ha un nome come vEthernet (SwitchName) e una descrizione dell'interfaccia come 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 è 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.

    • Prefisso dell'interfaccia IP Interna — il prefisso della subnet NAT descrive sia il prefisso IP del gateway NAT che la lunghezza del prefisso della subnet NAT.

    Il formato generico è a.b.c.0/NAT Subnet Prefix Length

    Per questo esempio si userà 192.168.0.0/24

    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.

Connettere una macchina virtuale

Per connettere una macchina virtuale alla nuova rete NAT, connettere il commutatore interno creato nel primo passaggio di questo articolo 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). Ciò richiede l'assegnazione a livello di applicazione di indirizzi IP e configurazione di rete o la configurazione manuale che deve essere eseguita da un amministratore e garantisce di non riutilizzare le assegnazioni IP esistenti nello stesso host.

Docker per windows (VM Linux) e contenitori Windows

Segui questa sezione per consentire a Docker per Windows, (VM Linux che eseguono contenitori Linux) e contenitori Windows di condividere la stessa istanza WinNAT usando vSwitch interne separate. La connettività tra contenitori Linux e Windows funziona.

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 removes 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 removes the NAT but keep the internal vSwitch)
PS C:\> New-NetNat -Name SharedNAT -InternalIPInterfaceAddressPrefix <shared prefix>
PS C:\> Start-Service docker

Docker/HNS assegna indirizzi IP ai contenitori di Windows e Admin assegna indirizzi IP alle macchine virtuali dal set di differenze 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 assegna indirizzi IP ai contenitori di Windows e Admin assegna indirizzi IP alle macchine virtuali dal set di differenze dei due.

Alla fine, si avranno 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

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

  1.  net stop docker
    
  2.  Stop Docker4Windows MobyLinux VM
    
  3.  Get-ContainerNetwork | Remove-ContainerNetwork -force
    
  4. Rimuovere tutte le reti di contenitori esistenti in precedenza( ad esempio, elimina vSwitch, elimina NetNat, pulisce).

     Get-NetNat | Remove-NetNat
    
  5. Creare un vSwitch interno denominato nat e una rete NAT con prefisso IP 10.0.76.0/24.

     New-ContainerNetwork -Name nat -Mode NAT –subnetprefix 10.0.76.0/24
    
  6. Rimuovere sia le reti DockerNAT che le reti NAT (mantiene i vSwitches interni).

     Remove-NetNAT
    
  7. Creare una rete NAT denominata DockerNAT con prefisso più grande 10.0.0.0/17 sia per D4W che per i contenitori da condividere.

     New-NetNat -Name DockerNAT -InternalIPInterfaceAddressPrefix 10.0.0.0/17
    
  8. Eseguire Docker4Windows (MobyLinux.ps1)

  9. Usare la rete NAT definita dall'utente come impostazione predefinita per connettere i contenitori di Windows.

     Net start docker
    

Alla fine sono disponibili due vSwitches interne, una denominata DockerNAT e l'altra denominata nat . È disponibile una sola rete NAT (10.0.0.0/17) confermata eseguendo Get-NetNat. Gli indirizzi IP per i contenitori di Windows vengono assegnati dal servizio di rete host Windows (HNS) dalla subnet 10.0.76.0/24. In base allo script di MobyLinux.ps1 esistente, gli indirizzi IP per Windows Docker 4 vengono 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 posiziona 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 Abbiamo ricevuto report di più reti NAT create inavvertitamente. Se vengono visualizzate più reti NAT, dopo l'esecuzione di 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