Konfigurowanie sieci NAT
Systemy Windows 10 i Windows 11 Hyper-V umożliwiają natywne tłumaczenie adresów sieciowych (NAT) dla sieci wirtualnej.
Ten przewodnik przeprowadzi Cię przez instrukcje:
- Utwórz sieć NAT
- Łączenie istniejącej maszyny wirtualnej z nową siecią
- Upewnij się, że maszyna wirtualna jest poprawnie połączona
Wymagania:
- Rocznicowa aktualizacja systemu Windows 10 lub nowsza
- Hyper-V jest włączona. Postępuj zgodnie z instrukcjami, aby włączyć Hyper-V
Notatka
Obecnie jesteś ograniczony do jednej sieci NAT na hosta. Aby uzyskać dodatkowe informacje na temat implementacji, możliwości i ograniczeń systemu WinNAT (Network Address Translation systemu Windows), zapoznaj się z blogiem o możliwościach i ograniczeniach WinNAT .
Omówienie NAT (translacji adresów sieciowych)
NAT zapewnia maszynie wirtualnej dostęp do zasobów sieciowych przy użyciu adresu IP komputera hosta i portu za pośrednictwem wewnętrznego wirtualnego przełącznika Hyper-V.
Translacją adresów sieciowych (NAT) jest tryb sieciowy zaprojektowany do oszczędzania adresów IP poprzez mapowanie zewnętrznego adresu IP i portu na znacznie większy zestaw wewnętrznych adresów IP. Zasadniczo NAT wykorzystuje tabelę przepływu do kierowania ruchu z zewnętrznego adresu IP i numeru portu hosta do odpowiedniego wewnętrznego adresu IP związanego z punktem końcowym w sieci, takim jak maszyna wirtualna, komputer, kontener itp.
Ponadto translator adresów sieciowych umożliwia wielu maszynom wirtualnym hostowanie aplikacji, które wymagają identycznych (wewnętrznych) portów komunikacyjnych, mapując je na unikatowe porty zewnętrzne.
Ze wszystkich tych powodów sieć NAT jest bardzo powszechna w przypadku technologii kontenerów (zobacz Container Networking).
Utwórz wirtualną sieć NAT
Omówmy konfigurację nowej sieci NAT.
Otwórz konsolę programu PowerShell jako administrator.
Utwórz przełącznik wewnętrzny.
New-VMSwitch -SwitchName "SwitchName" -SwitchType Internal
Znajdź indeks interfejsu właśnie utworzonego przełącznika wirtualnego.
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
Przełącznik wewnętrzny ma nazwę taką jak
vEthernet (SwitchName)
i opis interfejsuHyper-V Virtual Ethernet Adapter
. Zanotuj jegoifIndex
do użycia w następnym kroku.Skonfiguruj bramę translatora adresów sieciowych przy użyciu New-NetIPAddress.
Oto ogólne polecenie:
New-NetIPAddress -IPAddress <NAT Gateway IP> -PrefixLength <NAT Subnet Prefix Length> -InterfaceIndex <ifIndex>
Aby skonfigurować bramę, potrzebujesz trochę informacji o sieci:
- adres IPAddress — adres IP bramy translatora adresów sieciowych określa adres IPv4 lub IPv6 do użycia jako adres IP bramy translatora adresów sieciowych.
Format ogólny to a.b.c.1 (np. 172.16.0.1). Chociaż pozycja końcowa nie musi mieć wartości .1, zwykle jest to (na podstawie długości prefiksu). Ten adres IP znajduje się w zakresie adresów używanych przez maszyny wirtualne dla gości. Jeśli na przykład maszyny wirtualne gościa używają zakresu adresów IP 172.16.0.0, możesz użyć adresu IP 172.16.0.100 jako bramy NAT. Wspólny adres IP bramy sieciowej to 192.168.0.1
Długość Prefiksu — długość prefiksu NAT definiuje rozmiar lokalnej podsieci NAT (maska podsieci). Długość prefiksu podsieci jest wartością całkowitą z zakresu od 0 do 32.
0 będzie mapować cały Internet, 32 zezwala tylko na jeden mapowany adres IP. Typowe wartości wahają się od 24 do 12 w zależności od liczby adresów IP, które muszą być dołączone do translatora adresów sieciowych.
Typowa długość prefiksu to 24 — jest to maska podsieci 255.255.255.0
InterfaceIndex — ifIndex jest indeksem interfejsu przełącznika wirtualnego, który został określony w poprzednim kroku.
Uruchom następujące polecenie, aby utworzyć bramę NAT:
New-NetIPAddress -IPAddress 192.168.0.1 -PrefixLength 24 -InterfaceIndex 24
Skonfiguruj sieć NAT przy użyciu New-NetNat.
Oto ogólne polecenie:
New-NetNat -Name <NATOutsideName> -InternalIPInterfaceAddressPrefix <NAT subnet prefix>
Aby skonfigurować bramę, należy podać informacje o sieci i bramie NAT:
Nazwa — NATOutsideName opisuje nazwę sieci NAT. Użyjesz tego, aby usunąć sieć NAT.
pl-PL: InternalIPInterfaceAddressPrefix — prefiks podsieci NAT obejmuje zarówno prefiks IP bramy NAT, jak i długość prefiksu podsieci NAT.
Formularz ogólny to długość prefiksu podsieci a.b.c.0/NAT
W tym przykładzie użyjemy adresu 192.168.0.0/24
Uruchom następujące polecenie, aby skonfigurować sieć NAT:
New-NetNat -Name MyNATnetwork -InternalIPInterfaceAddressPrefix 192.168.0.0/24
Gratulacje! Masz teraz wirtualną sieć NAT!
Łączenie maszyny wirtualnej
Aby połączyć maszynę wirtualną z nową siecią NAT, użyj menu Ustawienia maszyny wirtualnej, aby połączyć przełącznik wewnętrzny utworzony w pierwszym kroku tego artykułu z maszyną wirtualną.
Ponieważ winNAT nie przydziela i przypisuje adresy IP do punktu końcowego (np. maszyny wirtualnej), należy to zrobić ręcznie z poziomu samej maszyny wirtualnej — tj. ustaw adres IP w zakresie wewnętrznego prefiksu translatora adresów sieciowych, ustaw domyślny adres IP bramy, ustaw informacje o serwerze DNS. Jedynym zastrzeżeniem jest to, że punkt końcowy jest dołączony do kontenera. W takim przypadku usługa sieci hosta (HNS) przydziela i korzysta z usługi obliczeniowej hosta (HCS) do przypisywania adresu IP, adresu IP bramy i informacji DNS bezpośrednio do kontenera.
Przykład konfiguracji: podłączanie maszyn wirtualnych i kontenerów do sieci NAT
Jeśli musisz dołączyć wiele maszyn wirtualnych i kontenerów do pojedynczego translatora adresów sieciowych, musisz upewnić się, że wewnętrzny prefiks podsieci translatora adresów sieciowych jest wystarczająco duży, aby obejmować zakresy adresów IP przypisywane przez różne aplikacje lub usługi (np. Docker dla systemu Windows i kontenera systemu Windows — HNS). Wymaga to przypisania na poziomie aplikacji adresów IP i konfiguracji sieci lub konfiguracji ręcznej, które muszą być wykonywane przez administratora i gwarantowane, aby nie używać ponownie istniejących przypisań adresów IP na tym samym hoście.
Platforma Docker dla systemu Windows (maszyna wirtualna z systemem Linux) i kontenery systemu Windows
Postępuj zgodnie z instrukcjami w tej sekcji, aby umożliwić zarówno Docker for Windows (maszyna wirtualna z systemem Linux uruchamiająca kontenery systemu Linux), jak i kontenery systemu Windows współdzielenie tego samego wystąpienia WinNAT przy użyciu oddzielnych wewnętrznych przełączników wirtualnych. Łączność między kontenerami systemu Linux i Windows działa.
Użytkownik połączył maszyny wirtualne z siecią NAT poprzez wewnętrzny przełącznik wirtualny o nazwie "VMNAT" i teraz chce zainstalować funkcję kontenerów Windows z silnikiem 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
Usługa Docker/HNS przypisuje adresy IP do kontenerów systemu Windows, a administrator przypisuje adresy IP do maszyn wirtualnych z różnicowego zestawu.
Użytkownik zainstalował funkcję kontenerów systemu Windows z działającym silnikiem Docker i teraz chce połączyć maszyny wirtualne z siecią 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
Usługa Docker/HNS przypisuje adresy IP do kontenerów systemu Windows, a administrator przypisuje adresy IP do maszyn wirtualnych z pozostałego zestawu dostępnych adresów IP.
W końcu będziesz mieć dwa wewnętrzne przełączniki maszyn wirtualnych i jeden NetNat udostępniony między nimi.
Wiele aplikacji korzystających z tego samego NAT
Niektóre scenariusze wymagają wielu aplikacji lub usług do korzystania z tego samego translatora adresów sieciowych. W takim przypadku należy postępować zgodnie z następującą procedurą, aby wiele aplikacji/usług mogło używać większego wewnętrznego zakresu adresów NAT.
Szczegółowo omówimy współistnienie maszyny wirtualnej platformy Docker 4 — Docker Beta — Linux z funkcją kontenera systemu Windows na tym samym hoście co na przykład. Ten przepływ pracy może ulec zmianie
-
net stop docker
-
Stop Docker4Windows MobyLinux VM
-
Get-ContainerNetwork | Remove-ContainerNetwork -force
Usuń wszystkie wcześniej istniejące sieci kontenerów (tj. usuwa przełącznik wirtualny, usuwa netNat, czyści).
Get-NetNat | Remove-NetNat
Utwórz wewnętrzny przełącznik vSwitch o nazwie nat i sieć NAT z prefiksem IP 10.0.76.0/24.
New-ContainerNetwork -Name nat -Mode NAT –subnetprefix 10.0.76.0/24
Usuń zarówno sieci DockerNAT, jak i nat (utrzymuje wewnętrzne przełączniki wirtualne).
Remove-NetNAT
Utwórz sieć NAT o nazwie DockerNAT z większym prefiksem 10.0.0.0/17 dla zarówno D4W, jak i kontenerów do wspólnego użytku.
New-NetNat -Name DockerNAT -InternalIPInterfaceAddressPrefix 10.0.0.0/17
Uruchamianie platformy Docker4Windows (MobyLinux.ps1)
Użyj sieci translatora adresów sieciowych zdefiniowanej przez użytkownika jako domyślnej do łączenia kontenerów systemu Windows.
Net start docker
W końcu masz dwa wewnętrzne przełączniki wirtualne — jeden o nazwie DockerNAT i drugi o nazwie nat. Masz tylko jedną sieć NAT (10.0.0.0/17) potwierdzoną przez uruchomienie polecenia Get-NetNat. Adresy IP kontenerów systemu Windows są przypisywane przez usługę sieciową hosta systemu Windows (HNS) z podsieci 10.0.76.0/24. Na podstawie istniejącego skryptu MobyLinux.ps1 adresy IP platformy Docker 4 systemu Windows są przypisywane z podsieci 10.0.75.0/24.
Rozwiązywanie problemów
Wiele sieci NAT nie jest obsługiwanych
W tym przewodniku założono, że na hoście nie ma żadnych innych NAT. Jednak aplikacje lub usługi wymagają użycia translatora adresów sieciowych i mogą utworzyć jeden w ramach konfiguracji. Ponieważ system Windows (WinNAT) obsługuje tylko jeden wewnętrzny prefiks podsieci NAT, próba utworzenia wielu NAT-ów wprowadza system w nieznany stan.
Aby sprawdzić, czy może to być problem, upewnij się, że masz tylko jeden NAT:
Get-NetNat
Jeśli NAT już istnieje, usuń go.
Get-NetNat | Remove-NetNat
Upewnij się, że masz tylko jeden „wewnętrzny” vmSwitch dla aplikacji lub funkcji (np. kontenerów Windows). Zarejestruj nazwę przełącznika wirtualnego:
Get-VMSwitch
Sprawdź, czy istnieją prywatne adresy IP (np. domyślny adres IP bramy NAT — zazwyczaj x.y.z.1) ze starego NAT nadal przypisane do karty sieciowej:
Get-NetIPAddress -InterfaceAlias "vEthernet (<name of vSwitch>)"
Jeśli jest używany stary prywatny adres IP, usuń go:
Remove-NetIPAddress -InterfaceAlias "vEthernet (<name of vSwitch>)" -IPAddress <IPAddress>
pl-PL: Usuwanie wielu NAT-ów Widzieliśmy raporty o wielu sieciach NAT utworzonych przypadkowo. Jeśli widzisz wiele sieci NAT, po uruchomieniu komendy docker network ls lub Get-ContainerNetwork wykonaj następujące czynności w PowerShell z podwyższonymi uprawnieniami.
$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
Uruchom ponownie system operacyjny przed wykonaniem kolejnych poleceń (Restart-Computer
)
Get-NetNat | Remove-NetNat
Set-Service docker -StartupType Automatic
Start-Service docker