Configurar uma rede NAT

O Hyper-V do Windows 10 permite o NAT (conversão de endereços de rede) nativo para uma rede virtual.

Este guia o orientará pela:

  • criação de uma rede NAT
  • conexão a uma máquina virtual existente para sua nova rede
  • confirmação de que a máquina virtual está conectada corretamente

Requisitos:

  • Atualização de Aniversário do Windows 10 ou posterior
  • O Hyper-V deve estar habilitado (instruções aqui)

Observação: atualmente, há um limite de uma rede NAT por host. Para obter mais detalhes sobre a implementação, recursos e limitações do Windows NAT (WinNAT), consulte o blog de limitações e recursos do WinNAT

Visão geral do NAT

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

O NAT (Conversão de Endereços de Rede) é um modo de rede projetado para conservar o endereço IP mapeando uma porta e um endereço IP externo 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 número da porta e endereço IP externos (host) 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 aplicativo que exigem portas de comunicação (internas) idênticas mapeando-as para portas externas únicas.

Por todos esses motivos, as redes NAT são muito comuns 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. Encontre o índice de interface do comutador virtual que você criou.

    Você pode encontrar o índice de interface executando Get-NetAdapter

    A saída deve ter uma aparência semelhante a essa:

    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
    
    

    O comutador interno terá um nome como vEthernet (SwitchName) e uma Descrição de interface Hyper-V Virtual Ethernet Adapter. Anote seu ifIndex para usá-lo 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ções sobre a sua rede:

    • IPAddress – NAT Gateway IP especifica o endereço IPv4 ou IPv6 a ser usado como o IP do gateway NAT. O formato genérico será a.b.c.1 (por exemplo, 172.16.0.1). Embora a posição final não precise ser .1, geralmente ela é assim (com base no tamanho 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 da NAT.

      Um IP de gateway comum é 192.168.0.1

    • PrefixLength – Comprimento do prefixo da sub-rede NAT define o tamanho da sub-rede local NAT (máscara de sub-rede). O tamanho do prefixo de sub-rede será um valor inteiro entre 0 e 32.

      O valor 0 mapeará toda a Internet e 32 permitirá somente um IP mapeado. Os valores comuns variam de 24 a 12, dependendo de quantos IPs precisam ser anexados ao NAT.

      Um PrefixLength comum é 24, isso é 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 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 NAT:

    • Name – 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 de IP do gateway NAT acima, bem como o NAT Subnet Prefix Length acima.

    O formato genérico será a.b.c.0/NAT Subnet Prefix Length

    Com base no indicado acima, para este exemplo, usaremos 192.168.0.0/24

    Para nosso exemplo, 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! Para adicionar uma máquina virtual à rede NAT, siga estas instruções.

Conectar uma máquina virtual

Para conectar uma máquina virtual à sua nova rede NAT, conecte o comutador interno criado na primeira etapa da seção Configurar uma rede NAT à sua máquina virtual usando o menu VM Settings (Configurações de VM).

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

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

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

Docker para Windows (VM Linux) e Contêineres do Windows

A solução a seguir permitirá que o Docker para Windows (VM do 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 Windows funcionará.

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

O Docker/HNS atribuirá IPs a contêineres do Windows e o Administrador atribuirá IPs a VMs com base no conjunto de diferenças dos dois.

O usuário instalou o recurso Contêiner do Windows com o motor de 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 atribuirá IPs a contêineres do Windows e o Administrador atribuirá IPs a VMs com base no conjunto de diferenças dos dois.

No final, você deverá ter duas opções de VM internos e um NetNat compartilhado entre elas.

Vários aplicativos utilizando 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

Detalharemos o Docker 4 Windows – Docker Beta – VM do Linux coexistindo com o recurso de Contêiner do Windows no mesmo host como um exemplo. Este fluxo de trabalho está sujeito a alterações

  1. C:> net stop docker

  2. Stop Docker4Windows MobyLinux VM

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

  4. PS C:> Get-NetNat | Remove-NetNat
    Remove quaisquer redes de contêiner preexistente (ou seja, exclui o vSwitch, exclui o NetNat, limpa)

  5. New-ContainerNetwork -Name nat -Mode NAT –subnetprefix 10.0.76.0/24 (essa sub-rede será usada para o recurso de contêiner do Windows) Cria um vSwitch interno chamado nat
    Cria a rede NAT chamada "nat" com o prefixo de IP 10.0.76.0/24

  6. Remove-NetNAT
    Remove as redes NAT DockerNAT e nat (mantém os vSwitches internos)

  7. New-NetNat -Name DockerNAT -InternalIPInterfaceAddressPrefix 10.0.0.0/17 (isso criará uma rede NAT maior para o D4W e os contêineres compartilharem)
    Cria uma rede NAT chamada DockerNAT com o prefixo maior 10.0.0.0/17

  8. Run Docker4Windows (MobyLinux.ps1)
    Cria o vSwitch interno DockerNAT
    Cria uma rede NAT chamada “DockerNAT” com o prefixo IP 10.0.75.0/24

  9. Net start docker
    O Docker usará a rede NAT definida pelo usuário como a padrão para conectar contêineres do Windows

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

Solução de problemas

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

Esse guia pressupõe que não haja nenhum outro NAT no host. No entanto, os 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 colocará o sistema em um estado desconhecido.

Para ver se esse é o problema, certifique-se de que você tem apenas um NAT:

Get-NetNat

Se já existir um NAT, exclua-o

Get-NetNat | Remove-NetNat

Certifique-se de ter 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, o endereço IP do Gateway padrão, normalmente x.y.z.1) do NAT antigo ainda atribuídos 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. Isso acontece devido a um bug nos builds recentes (incluindo os builds do Windows Server 2016 Technical Preview 5 e Windows 10 Insider Preview). Se você vir várias redes NAT, após a execução da rede do docker ls ou Get-ContainerNetwork, realize o seguinte de um PowerShell elevado:

$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 posteriores (Restart-Computer)

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

Consulte este guia de instalação para vários aplicativos que utilizam o mesmo NAT para recriar seu ambiente de NAT, se necessário.

Referências

Leia mais sobre redes NAT