Поделиться через


Настройка сети NAT

Windows 10 и Windows 11 Hyper-V позволяют переводить собственные сетевые адреса (NAT) для виртуальной сети.

В этом руководстве описано, как:

  • Создание сети NAT
  • Подключение существующей виртуальной машины к новой сети
  • Убедитесь, что виртуальная машина подключена правильно

Требования:

  • Юбилейное обновление Windows 10 или более поздняя версия
  • Hyper-V включен. Следуйте инструкциям по включению Hyper-V

Примечание.

В настоящее время на узел ограничено одной сетью NAT. Дополнительные сведения о реализации, возможностях и ограничениях Windows NAT (WinNAT) см. в блоге о возможностях и ограничениях WinNAT.

Обзор NAT

NAT предоставляет виртуальным машинам доступ к сетевым ресурсам с помощью IP-адреса хост-компьютера и порта через внутренний виртуальный коммутатор Hyper-V.

Преобразование сетевых адресов (NAT) — это сетевой режим, предназначенный для экономии IP-адресов путем сопоставления внешнего IP-адреса и порта с гораздо большим набором внутренних IP-адресов. В основном NAT использует таблицу потоков для маршрутизации трафика из внешнего (узла) IP-адреса и номера порта на правильный внутренний IP-адрес, связанный с конечной точкой в сети (виртуальная машина, компьютер, контейнер и т. д.).

Кроме того, NAT позволяет нескольким виртуальным машинам размещать приложения, требующие идентичных (внутренних) портов связи, сопоставляя их с уникальными внешними портами.

По всем этим причинам сеть NAT очень распространена для технологии контейнеров (см. раздел "Сеть контейнеров").

Создание виртуальной сети NAT

Давайте рассмотрим настройку новой сети NAT.

  1. Откройте консоль PowerShell от имени администратора.

  2. Создайте внутренний переключатель.

    New-VMSwitch -SwitchName "SwitchName" -SwitchType Internal
    
  3. Найдите индекс интерфейса только что созданного виртуального коммутатора.

    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 использование на следующем шаге.

  4. Настройте шлюз 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

    • PrefixLength — "NAT Subnet Prefix Length" определяет размер локальной подсети 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
    
  5. Настройте сеть 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

    В этом примере мы будем использовать 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 для Windows - Бета-версия Docker - виртуальная машина Linux сосуществует с функцией контейнера Windows на одном и том же хосте. Этот рабочий процесс подлежит изменению

  1.  net stop docker
    
  2.  Stop Docker4Windows MobyLinux VM
    
  3.  Get-ContainerNetwork | Remove-ContainerNetwork -force
    
  4. Удалите все ранее существующие сети контейнеров (то есть удалите vSwitch, NetNat и выполните очистку).

     Get-NetNat | Remove-NetNat
    
  5. Создайте внутренний vSwitch с именем NAT и сеть NAT с префиксом IP-адреса 10.0.76.0/24.

     New-ContainerNetwork -Name nat -Mode NAT –subnetprefix 10.0.76.0/24
    
  6. Удалите сети DockerNAT и NAT (оставляя внутренние виртуальные коммутаторы).

     Remove-NetNAT
    
  7. Создайте сеть NAT с именем DockerNAT с большим префиксом 10.0.0.0/17 для совместного использования D4W и контейнеров.

     New-NetNat -Name DockerNAT -InternalIPInterfaceAddressPrefix 10.0.0.0/17
    
  8. Запуск Docker4Windows (MobyLinux.ps1)

  9. Используйте определяемую пользователем сеть 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