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

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.

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

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

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

    Этот индекс интерфейса можно определить, выполнив команду Get-NetAdapter

    Выходные данные должны выглядеть примерно так:

    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
    
    

    Внутренний коммутатор будет иметь имя, например 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.

    • Префикс внутренней подсети NATInterfaceAddressPrefix — префикс подсети 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 выполните следующие инструкции.

Подключение виртуальной машины

Чтобы подключить виртуальную машину к новой сети 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 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

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 Beta — Linux VM и компонента контейнеров Windows на одном узле. Эта процедура может быть изменена.

  1. C:> net stop docker

  2. Остановка виртуальной машины Docker4Windows MobyLinux

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

  4. PS C:> Get-NetNat | Remove-NetNat
    Позволяет удалить все ранее существовавшие сети контейнера (т. е. удаляется vSwitch, NetNat и выполняется очистка).

  5. New-ContainerNetwork -Name nat -Mode NAT –subnetprefix 10.0.76.0/24 (эта подсеть будет использоваться для компонента контейнеров Windows) Создает внутренний vSwitch с именем NAT
    Позволяет создать сеть NAT с именем "nat" и префиксом IP-адреса 10.0.76.0/24.

  6. Remove-NetNAT
    Позволяет удалить сети NAT с именами nat и DockerNAT (сохраняя внутренние коммутаторы Vswitch).

  7. New-NetNat -Name DockerNAT -InternalIPInterfaceAddressPrefix 10.0.0.0/17 (это создаст большую сеть NAT для общих ресурсов D4W и контейнеров)
    Позволяет создать сеть NAT с именем DockerNAT и увеличенным префиксом 10.0.0.0/17.

  8. Запуск Docker4Windows (MobyLinux.ps1)
    Позволяет создать внутренний vSwitch DockerNAT.
    Позволяет создать сеть NAT с именем DockerNAT и префиксом 10.0.75.0/24.

  9. Net start docker
    Docker использует пользовательскую сеть NAT по умолчанию для подключения к контейнерам Windows.

В конце концов, у вас должны быть две внутренние vSwitches — одна с именем DockerNAT и другая именованной NAT. У вас будет только одна сеть NAT (10.0.0.0/17), подтвержденная запуском Get-NetNat. IP-адреса для контейнеров Windows будут назначены службой сети узлов Windows (HNS) из подсети 10.0.76.0/24. На основе существующего скрипта MobyLinux.ps1 IP-адреса для Docker 4 Windows будут назначены из подсети 10.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, созданных непреднамеренно. Это связано с ошибкой в последних сборках (включая сборки Windows Server 2016 Technical Preview 5 и Windows 10 Insider Preview). Если вы видите несколько 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 

См. это руководство по настройке для нескольких приложений, использующих один и тот же NAT для перестроения среды NAT при необходимости.

Ссылки

Дополнительные сведения о сетях NAT