Configurar uma rede NAT
O Hyper-V do Windows 10 e do Windows 11 permite a tradução de endereços de rede (NAT) nativa para uma rede virtual.
Este guia orientará você:
- criando uma rede NAT
- conectar uma máquina virtual existente à sua nova rede
- confirmando se a máquina virtual está conectada corretamente
Requisitos:
- Atualização de Aniversário do Windows 10 ou posterior
- O 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 mais detalhes sobre a implementação, as funcionalidades e as limitações do Windows NAT (WinNAT), consulte o blog Funcionalidades e limitações do WinNAT
Visão geral da NAT
A NAT permite que uma máquina virtual acesse os recursos de rede usando o endereço IP do computador host e uma porta por meio de um comutador virtual interno do Hyper-V.
A Conversão de Endereços de Rede (NAT) é 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, uma NAT usa uma tabela de fluxo para rotear o tráfego de um endereço IP externo (host) e número de porta para o endereço IP interno correto associado a um ponto final na rede (máquina virtual, computador, contêiner etc.)
Além disso, a NAT permite que várias máquinas virtuais hospedem aplicativos que exigem portas de comunicação (internas) idênticas, mapeando-as para portas externas exclusivas.
Por todos esses motivos, a rede NAT é muito comum na tecnologia de contêineres (consulte Rede de Contêineres).
Criar uma rede virtual NAT
Vamos ver como configurar uma nova rede NAT.
Abra um console do PowerShell como Administrador.
Crie um comutador interno.
New-VMSwitch -SwitchName "SwitchName" -SwitchType Internal
Localize o índice da interface do comutador virtual que você acabou de criar.
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 deHyper-V Virtual Ethernet Adapter
. Anote seuifIndex
para usá-lo na próxima etapa.Configure o gateway da 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 algumas informações sobre sua rede:
IPAddress -- IP do Gateway da NAT especifica o endereço IPv4 ou IPv6 a ser usado como IP do gateway da NAT. A forma genérica 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 corresponde a uma máscara de sub-rede de 255.255.255.0
InterfaceIndex -- ifIndex é o índice da interface do comutador virtual, que você determinou na etapa anterior.
Execute o seguinte para criar o Gateway da NAT:
New-NetIPAddress -IPAddress 192.168.0.1 -PrefixLength 24 -InterfaceIndex 24
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 da NAT:
Name -- NATOutsideName descreve o nome da rede NAT. Você usará isso para remover a rede NAT.
InternalIPInterfaceAddressPrefix -- O prefixo da sub-rede NAT descreve tanto o prefixo IP do Gateway da NAT mencionado acima quanto o comprimento do prefixo da sub-rede NAT mencionado acima.
A forma genérica será a.b.c.0/Tamanho do Prefixo de Sub-rede NAT
Com base no acima, para este exemplo, usaremos 192.168.0.0/24
Para o 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 que você criou na primeira etapa da seção Configuração de rede NAT à 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 dentro da própria VM — ou seja, definir o endereço IP dentro do intervalo do prefixo interno da NAT, definir o endereço IP do gateway padrão e configurar as informações do servidor DNS. A única ressalva para isso é quando o ponto de extremidade está anexado 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, o IP do gateway e as informações de DNS diretamente ao contêiner.
Exemplo de configuração: Como anexar VMs e contêineres a uma rede NAT
Se 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 de IP que estão sendo atribuídos por diferentes aplicativos ou serviços (por exemplo, Docker for 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 a configuração manual, que deverá ser feita por um administrador com a garantia de não reutilizar atribuições de IP existentes no mesmo host.
Docker CE for Windows (VM Linux) e contêineres do Windows
A solução abaixo permitirá que tanto o Docker CE for Windows (VM Linux executando contêineres Linux) quanto os contêineres Windows compartilhem a mesma instância WinNAT usando vSwitches internos separados. A conectividade entre os contêineres Linux e Windows funcionará.
O usuário conectou as 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 mecanismo do 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 mecanismo docker em execução e agora deseja conectar as 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ê deve ter dois comutadores internos de VM e um NetNat compartilhado entre eles.
Vários aplicativos usando a mesma NAT
Alguns cenários exigem que vários aplicativos ou serviços usem a mesma 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 NAT interno 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
C:> net stop docker
Parar a VM Docker4Windows MobyLinux
PS C:> Get-ContainerNetwork | Remove-ContainerNetwork -force
PS C:> Get-NetNat | Remove-NetNat
Remove as redes de contêiner preexistente (ou seja, exclui o vSwitch, exclui o NetNat, limpa)New-ContainerNetwork -Name nat -Mode NAT –subnetprefix 10.0.76.0/24 (essa sub-rede será usada para o recurso de contêineres do Windows) Cria um vSwitch interno chamado nat
Cria a rede NAT chamada "nat" com o prefixo de IP 10.0.76.0/24Remove-NetNAT
Remove as redes NAT DockerNAT e nat (mantém os vSwitches internos)New-NetNat -Name DockerNAT -InternalIPInterfaceAddressPrefix 10.0.0.0/17 (isso criará uma rede NAT maior para que tanto o D4W quanto os contêineres compartilhem)
Cria uma rede NAT chamada DockerNAT com o prefixo maior 10.0.0.0/17Execute o Docker4Windows (MobyLinux.ps1)
Cria o vSwitch interno DockerNAT
Cria uma rede NAT chamada “DockerNAT” com o prefixo IP 10.0.75.0/24Docker do Net start
O Docker usará a rede NAT definida pelo usuário como a padrão para conectar contêineres do Windows
No final, você deverá ter dois vSwitches internos – um chamado DockerNAT e o outro chamado nat. Você terá apenas uma rede NAT (10.0.0.0/17) confirmada pela execução de Get-NetNat. Os endereços IP dos contêineres do Windows serão atribuídos pelo Serviço de Rede de Host do Windows (HNS) 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 a partir da sub-rede 10.0.75.0/24.
Solução de problemas
Não há suporte para várias redes NAT
Este guia pressupõe que não há outros NATs no host. No entanto, os aplicativos ou serviços exigirão o uso de um NAT e poderão criar um como parte da configuração. Como o Windows (WinNAT) dá suporte para apenas um prefixo de sub-rede NAT interno, a tentativa de criar várias NATs colocará o sistema em um estado desconhecido.
Para verificar se esse pode ser o problema, certifique-se de que você tenha apenas uma NAT:
Get-NetNat
Se já existir uma NAT, exclua-a:
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, endereço IP do gateway padrão da NAT - geralmente x.y.z.1) da NAT antiga 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
Temos visto relatos de várias redes NAT criadas inadvertidamente. Isso se deve a um bug em compilações recentes (incluindo as compilações do Windows Server 2016 Technical Preview 5 e do Windows 10 Insider Preview). Se você visualizar várias redes NAT após executar docker network ls ou Get-ContainerNetwork, por favor, execute o seguinte a partir 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 configuração para vários aplicativos usando a mesma NAT para reconstruir seu ambiente NAT, se necessário.
Referências
Leia mais sobre Redes NAT