Compartilhar via


Configurar uma rede NAT

O Windows 10 e o Windows 11 Hyper-V permite a NAT (conversão de endereços de rede) nativa para uma rede virtual.

Este guia explica como fazer isso:

  • Criar uma rede NAT
  • Conectar uma máquina virtual existente à sua nova rede
  • Confirme se a máquina virtual está conectada corretamente

Requisitos:

  • Atualização de Aniversário do Windows 10 ou posterior
  • Hyper-V está habilitado. Siga as instruções para habilitar o Hyper-V

Observação

Atualmente, você está limitado a uma rede NAT por host. Para obter detalhes adicionais sobre a implementação, funcionalidades e limitações do Windows NAT (WinNAT), consulte o blog de funcionalidades e limitações do WinNAT

Visão geral do NAT

O NAT fornece a uma máquina virtual acesso aos recursos de rede usando o endereço IP do computador host e uma porta por meio de um Comutador Virtual Hyper-V interno.

A NAT (Conversão de Endereços de Rede) é um modo de rede projetado para conservar endereços IP mapeando um endereço IP externo e uma porta para um conjunto muito maior de endereços IP internos. Basicamente, um NAT usa uma tabela de fluxo para rotear o tráfego de um endereço IP externo (host) e o número da porta para o endereço IP interno correto associado a um ponto de extremidade na rede (máquina virtual, computador, contêiner etc.).

Além disso, o NAT permite que várias máquinas virtuais hospedem aplicativos que exigem portas de comunicação idênticas (internas) mapeando-as para portas externas exclusivas.

Por todos esses motivos, a rede NAT é muito comum para a tecnologia de contêiner (consulte Rede de Contêiner).

Criar uma rede virtual NAT

Vamos percorrer a configuração de uma nova rede NAT.

  1. Abra um console do PowerShell como Administrador.

  2. Crie um comutador interno.

    New-VMSwitch -SwitchName "SwitchName" -SwitchType Internal
    
  3. Localize o índice de interface do comutador virtual que você acabou de criar.

    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
    
    

    O comutador interno tem um nome semelhante vEthernet (SwitchName) e uma descrição de interface de Hyper-V Virtual Ethernet Adapter. Anote sua ifIndex ação para usar na próxima etapa.

  4. Configure o gateway NAT usando New-NetIPAddress.

    Aqui está o comando genérico:

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

    Para configurar o gateway, você precisará de um pouco de informação sobre sua rede:

    • IPAddress -- O IP do Gateway nat especifica o endereço IPv4 ou IPv6 a ser usado como o IP do gateway nat.

    O formulário genérico é a.b.c.1 (por exemplo, 172,16,0,1). Embora a posição final não precise ser .1, geralmente é (com base no comprimento do prefixo). Esse endereço IP está no intervalo de endereços usados pelas máquinas virtuais convidadas. Por exemplo, se as VMs convidadas usarem o intervalo de IP 172.16.0.0, você poderá usar um endereço IP 172.16.0.100 como o Gateway nat. Um IP de gateway comum é 192.168.0.1

    • PrefixLength -- Nat Subnet Prefix Length define o tamanho da sub-rede local NAT (máscara de sub-rede). O comprimento do prefixo da sub-rede é um valor inteiro entre 0 e 32.

      0 mapearia toda a Internet, 32 só permitiria um IP mapeado. Os valores comuns variam de 24 a 12, dependendo de quantos IPs precisam ser anexados ao NAT.

      Um PrefixLength comum é 24 - esta é uma máscara de sub-rede de 255.255.255.0

    • InterfaceIndex – ifIndex é o índice de interface do comutador virtual, que você determinou na etapa anterior.

    Execute o seguinte para criar o Gateway de NAT:

    New-NetIPAddress -IPAddress 192.168.0.1 -PrefixLength 24 -InterfaceIndex 24
    
  5. Configure a rede NAT usando New-NetNat.

    Aqui está o comando genérico:

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

    Para configurar o gateway, você precisará fornecer informações sobre a rede e o Gateway de NAT:

    • Nome – NATOutsideName descreve o nome da rede NAT. Você usará isso para remover a rede NAT.

    • InternalIPInterfaceAddressPrefix -- o prefixo de sub-rede NAT descreve o prefixo IP do Gateway nat e o comprimento do prefixo de sub-rede NAT.

    O formulário genérico é a.b.c.0/Tamanho do prefixo de sub-rede NAT

    Para este exemplo, usaremos 192.168.0.0/24

    Execute o seguinte para configurar a rede NAT:

    New-NetNat -Name MyNATnetwork -InternalIPInterfaceAddressPrefix 192.168.0.0/24
    

Parabéns! Agora você tem uma rede NAT virtual!

Conectar uma máquina virtual

Para conectar uma máquina virtual à sua nova rede NAT, conecte o comutador interno que você criou na primeira etapa deste artigo à sua máquina virtual usando o menu Configurações da VM.

Como o WinNAT por si só não aloca e atribui endereços IP a um ponto de extremidade (por exemplo, VM), você precisará fazer isso manualmente de dentro da própria VM – ou seja, definir o endereço IP dentro do intervalo de prefixo interno nat, definir o endereço IP do gateway padrão, definir informações do servidor DNS. A única ressalva a isso é quando o ponto de extremidade é anexado a um contêiner. Nesse caso, o HNS (Serviço de Rede de Host) aloca e usa o HCS (Serviço de Computação de Host) para atribuir o endereço IP, o IP do gateway e as informações de DNS diretamente ao contêiner.

Exemplo de configuração: anexando VMs e contêineres a uma rede NAT

Se você precisar anexar várias VMs e contêineres a um único NAT, será necessário garantir que o prefixo de sub-rede interna nat seja grande o suficiente para abranger os intervalos de IP atribuídos por diferentes aplicativos ou serviços (por exemplo, Docker para Windows e Contêiner do Windows – HNS). Isso requer a atribuição no nível do aplicativo de IPs e configuração de rede ou configuração manual, que deve ser feita por um administrador e garantida para não reutilização de atribuições de IP existentes no mesmo host.

Docker para Windows (VM linux) e contêineres do Windows

Acompanhe esta seção para permitir que o Docker para Windows (VM linux executando contêineres linux) e contêineres do Windows compartilhem a mesma instância do WinNAT usando vSwitches internos separados. A conectividade entre contêineres do Linux e do Windows funciona.

O usuário conectou VMs a uma rede NAT por meio de um vSwitch interno chamado "VMNAT" e agora deseja instalar o recurso contêiner do Windows com o mecanismo do 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

O Docker/HNS atribui IPs a contêineres do Windows e o Administrador atribui IPs a VMs do conjunto de diferenças dos dois.

O usuário instalou o recurso contêiner do Windows com o mecanismo docker em execução e agora deseja conectar VMs à rede 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

O Docker/HNS atribui IPs a contêineres do Windows e o Administrador atribui IPs a VMs do conjunto de diferenças dos dois.

No final, você terá dois comutadores de VM internos e um NetNat compartilhado entre eles.

Vários aplicativos usando o mesmo NAT

Alguns cenários exigem que vários aplicativos ou serviços usem o mesmo NAT. Nesse caso, o fluxo de trabalho a seguir deve ser seguido para que vários aplicativos/serviços possam usar um prefixo de sub-rede interno nat maior

Vamos detalhar a VM do Docker 4 Windows – Docker Beta – Linux co-existente com o recurso contêiner do Windows no mesmo host que um exemplo. Este fluxo de trabalho está sujeito a alterações

  1.  net stop docker
    
  2.  Stop Docker4Windows MobyLinux VM
    
  3.  Get-ContainerNetwork | Remove-ContainerNetwork -force
    
  4. Remova todas as redes de contêiner existentes anteriormente (ou seja, exclui o vSwitch, exclui o NetNat e limpa).

     Get-NetNat | Remove-NetNat
    
  5. Crie um vSwitch interno chamado nat e uma rede NAT com o prefixo IP 10.0.76.0/24.

     New-ContainerNetwork -Name nat -Mode NAT –subnetprefix 10.0.76.0/24
    
  6. Remova as redes DockerNAT e nat NAT (mantém vSwitches internos).

     Remove-NetNAT
    
  7. Crie uma rede NAT chamada DockerNAT com o prefixo maior 10.0.0.0/17 para que d4W e contêineres compartilhem.

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

  9. Use a rede NAT definida pelo usuário como o padrão para conectar contêineres do Windows.

     Net start docker
    

No final, você tem dois vSwitches internos : um chamado DockerNAT e outro chamado nat. Você tem apenas uma rede NAT (10.0.0.0/17) confirmada executando Get-NetNat. Os endereços IP para contêineres do Windows são atribuídos pelo HNS (Serviço de Rede de Host do Windows) da sub-rede 10.0.76.0/24. Com base no script MobyLinux.ps1 existente, os endereços IP do Docker 4 Windows são atribuídos da sub-rede 10.0.75.0/24.

Resolução de problemas

Não há suporte para várias redes NAT

Este guia pressupõe que não haja outros NATs no host. No entanto, aplicativos ou serviços exigem o uso de um NAT e podem criar um como parte da instalação. Como o Windows (WinNAT) dá suporte apenas a um prefixo de sub-rede NAT interno, tentar criar vários NATs coloca o sistema em um estado desconhecido.

Para ver se esse pode ser o problema, verifique se você tem apenas um NAT:

Get-NetNat

Se um NAT já existir, exclua-o:

Get-NetNat | Remove-NetNat

Verifique se você tem apenas um vmSwitch "interno" para o aplicativo ou recurso (por exemplo, contêineres do Windows). Registre o nome do vSwitch:

Get-VMSwitch

Verifique se há endereços IP privados (por exemplo, endereço IP do Gateway padrão nat – geralmente x.y. z.1) do NAT antigo ainda atribuído a um adaptador:

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

Se um endereço IP privado antigo estiver em uso, exclua-o:

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

Removendo vários NATs Vimos relatórios de várias redes NAT criadas inadvertidamente. Se você vir várias redes NAT, depois de executar a rede do Docker ls ou Get-ContainerNetwork, execute o seguinte em um PowerShell com privilégios elevados:

$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

Reinicialize o sistema operacional antes de executar os comandos subsequentes (Restart-Computer)

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