Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Windows 10 и Windows 11 Hyper-V позволяет переводить собственные сетевые адреса (NAT) для виртуальной сети.
В этом руководстве описано, как:
- Создание сети NAT
- Подключение существующей виртуальной машины к новой сети
- Убедитесь, что виртуальная машина подключена правильно
Требования:
- Юбилейное обновление Windows 10 или более поздней версии
- Hyper-V включен. Следуйте инструкциям по включению Hyper-V
Замечание
В настоящее время на узел ограничено одной сетью NAT. Дополнительные сведения о реализации, возможностях и ограничениях Windows NAT см. в блоге о возможностях и ограничениях WinNAT.
Обзор NAT
NAT предоставляет виртуальным машинам доступ к сетевым ресурсам с помощью IP-адреса хост-компьютера и порта через внутренний Hyper-V виртуальный коммутатор.
Преобразование сетевых адресов (NAT) — это сетевой режим, предназначенный для экономии IP-адресов путем сопоставления внешнего IP-адреса и порта с гораздо большим набором внутренних IP-адресов. В основном NAT использует таблицу потоков для маршрутизации трафика из внешнего (узла) IP-адреса и номера порта на правильный внутренний IP-адрес, связанный с конечной точкой в сети (виртуальная машина, компьютер, контейнер и т. д.).
Кроме того, NAT позволяет нескольким виртуальным машинам размещать приложения, требующие идентичных (внутренних) портов связи, сопоставляя их с уникальными внешними портами.
По всем этим причинам сеть NAT очень распространена для технологии контейнеров (см. раздел "Сеть контейнеров").
Создание виртуальной сети NAT
Давайте рассмотрим настройку новой сети NAT.
Откройте консоль PowerShell от имени администратора.
Создайте внутренний коммутатор.
New-VMSwitch -SwitchName "SwitchName" -SwitchType InternalНайдите индекс интерфейса только что созданного виртуального коммутатора.
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Внутренний коммутатор имеет имя, например
vEthernet (SwitchName)и описаниеHyper-V Virtual Ethernet Adapterинтерфейса. Запишите егоifIndexиспользование на следующем шаге.Настройте шлюз NAT с помощью New-NetIPAddress.
Ниже приведена универсальная команда:
New-NetIPAddress -IPAddress <NAT Gateway IP> -PrefixLength <NAT Subnet Prefix Length> -InterfaceIndex <ifIndex>Чтобы настроить шлюз, вам потребуется немного сведений о сети:
- IPAddress — IP-адрес шлюза NAT указывает ip-адрес IPv4 или IPv6, используемый в качестве IP-адреса шлюза NAT.
Универсальная форма — a.b.c.1 (например, 172.16.0.1). Хотя окончательная позиция не должна быть .1, обычно это (на основе длины префикса). Этот IP-адрес находится в диапазоне адресов, используемых гостевыми виртуальными машинами. Например, если гостевые виртуальные машины используют диапазон IP 172.16.0.0, можно использовать IP-адрес 172.16.0.100 в качестве шлюза NAT. Общий IP-адрес шлюза — 192.168.0.1
ПрефиксLength - Длина префикса подсети NAT определяет размер локальной подсети NAT (маска подсети). Длина префикса подсети — целочисленное значение от 0 до 32.
0 сопоставит весь Интернет, 32 разрешают только один сопоставленный IP-адрес. Общие значения варьируются от 24 до 12 в зависимости от количества IP-адресов, которые необходимо подключить к NAT.
Стандартный префиксLength — 24- это маска подсети 255.255.255.0
InterfaceIndex - ifIndex — это индекс интерфейса виртуального коммутатора, который вы определили на предыдущем шаге.
Выполните следующую команду, чтобы создать шлюз NAT:
New-NetIPAddress -IPAddress 192.168.0.1 -PrefixLength 24 -InterfaceIndex 24Настройте сеть NAT с помощью New-NetNat.
Ниже приведена универсальная команда:
New-NetNat -Name <NATOutsideName> -InternalIPInterfaceAddressPrefix <NAT subnet prefix>Чтобы настроить шлюз, необходимо предоставить сведения о сети и шлюзе NAT:
Имя -- NATOutsideName описывает имя сети NAT. Это будет использоваться для удаления сети NAT.
InternalIPInterfaceAddressPrefix - префикс подсети NAT описывает префикс IP-адреса шлюза NAT и длину префикса подсети NAT.
Универсальная форма — a.b.c.0/NAT Subnet Prefix Length
В этом примере мы будем использовать 192.168.0.0/24
Выполните следующую команду, чтобы настроить сеть NAT:
New-NetNat -Name MyNATnetwork -InternalIPInterfaceAddressPrefix 192.168.0.0/24
Поздравляю! Теперь у вас есть виртуальная сеть NAT!
Подключение виртуальной машины
Чтобы подключить виртуальную машину к новой сети NAT, подключите внутренний коммутатор, созданный на первом шаге этой статьи, к виртуальной машине с помощью меню "Параметры виртуальной машины".
Так как WinNAT сам по себе не выделяет и не назначает IP-адреса конечной точке (например, виртуальной машине), это необходимо сделать вручную из самой виртуальной машины, то есть задать IP-адрес в диапазоне внутренних префиксов NAT, задать IP-адрес шлюза по умолчанию, задать сведения о DNS-сервере. Единственное предупреждение заключается в том, что конечная точка подключена к контейнеру. В этом случае служба сети узла (HNS) выделяет и использует службу вычислений узла (HCS) для назначения IP-адреса, IP-адреса шлюза и DNS-данных контейнеру напрямую.
Пример конфигурации. Присоединение виртуальных машин и контейнеров к сети NAT
Если необходимо подключить несколько виртуальных машин и контейнеров к одному NAT, необходимо убедиться, что префикс внутренней подсети NAT достаточно велик, чтобы охватывать диапазоны IP-адресов, назначенные различными приложениями или службами (например, Docker для Контейнеров Windows и Windows — HNS). Для этого требуется назначение IP-адресов на уровне приложения и конфигурации сети или ручной настройки, которая должна выполняться администратором и гарантированно не повторно использовать существующие НАЗНАЧЕНИЯ IP-адресов на одном узле.
Docker для Windows (виртуальная машина Linux) и контейнеры Windows
Следуйте инструкциям в этом разделе, чтобы разрешить Docker для Windows (виртуальная машина Linux под управлением контейнеров Linux) и Контейнеры Windows совместно использовать один и тот же экземпляр WinNAT с помощью отдельных внутренних vSwitches. Подключение между контейнерами Linux и Windows работает.
Пользователь подключил виртуальные машины к сети NAT через внутренний vSwitch с именем VMNAT и теперь хочет установить компонент контейнера Windows с подсистемой 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 назначает IP-адреса контейнерам Windows, а администратор назначает IP-адреса виртуальным машинам из разного набора двух.
Пользователь установил компонент контейнера Windows с запущенным подсистемой Docker, и теперь хочет подключить виртуальные машины к сети 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 назначает IP-адреса контейнерам Windows, а администратор назначает IP-адреса виртуальным машинам из разного набора двух.
В конце концов у вас будут два внутренних коммутатора виртуальной машины и один общий доступ к NetNat.
Несколько приложений с использованием одного и того же NAT
Для некоторых сценариев требуется несколько приложений или служб для использования одного и того же NAT. В этом случае необходимо следовать следующему рабочему процессу, чтобы несколько приложений и служб могли использовать префикс внутренней подсети NAT большего размера.
Мы подробно рассмотрим docker 4 Windows — бета-версию Docker — виртуальную машину Linux с функцией контейнера Windows на том же узле, что и пример. Этот рабочий процесс подлежит изменению
-
net stop docker -
Stop Docker4Windows MobyLinux VM -
Get-ContainerNetwork | Remove-ContainerNetwork -force Удалите все ранее существующие сети контейнеров (т. е. удаляет vSwitch, удаляет NetNat, очищает).
Get-NetNat | Remove-NetNatСоздайте внутренний vSwitch с именем NAT и сеть NAT с префиксом IP-адреса 10.0.76.0/24.
New-ContainerNetwork -Name nat -Mode NAT –subnetprefix 10.0.76.0/24Удалите сети DockerNAT и NAT NAT (сохраняет внутренние виртуальные машины).
Remove-NetNATСоздайте сеть NAT с именем DockerNAT с большим префиксом 10.0.0.0/17 для совместного использования D4W и контейнеров.
New-NetNat -Name DockerNAT -InternalIPInterfaceAddressPrefix 10.0.0.0/17Запуск Docker4Windows (MobyLinux.ps1)
Используйте определяемую пользователем сеть NAT в качестве стандартного подключения контейнеров Windows.
Net start docker
В конце концов у вас есть две внутренние виртуальные машины — один с именем DockerNAT и другой именованный NAT. У вас есть только одна сеть NAT (10.0.0.0/17), подтвержденная запуском Get-NetNat. IP-адреса для контейнеров Windows назначаются службой сети узлов Windows (HNS) из подсети 10.0.76.0/24. На основе существующего скрипта MobyLinux.ps1 IP-адреса для Windows Docker 4 назначаются из подсети 10.0.0.75.0/24.
Устранение неполадок
Несколько сетей NAT не поддерживаются
В этом руководстве предполагается, что на узле нет других nats. Однако приложения или службы требуют использования NAT и могут создавать их как часть установки. Так как Windows (WinNAT) поддерживает только один префикс внутренней подсети NAT, пытаясь создать несколько NAT помещает систему в неизвестное состояние.
Чтобы узнать, может ли это быть проблема, убедитесь, что у вас есть только один NAT:
Get-NetNat
Если NAT уже существует, удалите его:
Get-NetNat | Remove-NetNat
Убедитесь, что у вас есть только один "внутренний" vmSwitch для приложения или компонента (например, контейнеры Windows). Запишите имя vSwitch:
Get-VMSwitch
Проверьте наличие частных IP-адресов (например, IP-адреса шлюза NAT по умолчанию — обычно x).y. z.1) из старого NAT по-прежнему назначен адаптеру:
Get-NetIPAddress -InterfaceAlias "vEthernet (<name of vSwitch>)"
Если используется старый частный IP-адрес, удалите его:
Remove-NetIPAddress -InterfaceAlias "vEthernet (<name of vSwitch>)" -IPAddress <IPAddress>
Удаление нескольких NAT Мы видели отчеты о нескольких сетях NAT, созданных непреднамеренно. Если вы видите несколько NAT-сетей, после запуска docker network ls или Get-ContainerNetwork выполните следующие действия из PowerShell с повышенными привилегиями:
$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
Перезагрузите операционную систему перед выполнением последующих команд (Restart-Computer)
Get-NetNat | Remove-NetNat
Set-Service docker -StartupType Automatic
Start-Service docker