다음을 통해 공유


NAT 네트워크 설정

Windows 10 및 Windows 11 Hyper-V는 가상 네트워크에 대한 네이티브 NAT(네트워크 주소 변환)를 허용합니다.

이 가이드에서는 다음 방법을 안내합니다.

  • NAT 네트워크 만들기
  • 기존 가상 머신을 새 네트워크에 연결
  • 가상 머신이 올바르게 연결되어 있는지 확인

요구 사항:

  • Windows 10 1주년 업데이트 상
  • Hyper-V를 사용할 수 있습니다. 지침에 따라 Hyper-V 사용

참고 항목

현재 호스트당 하나의 NAT 네트워크로 제한됩니다. WinNAT(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. 방금 만든 가상 스위치의 인터페이스 인덱스 찾기

    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. New-NetIPAddress를 사용하여 NAT 게이트웨이를 구성합니다.

    제네릭 명령은 다음과 같습니다.

    New-NetIPAddress -IPAddress <NAT Gateway IP> -PrefixLength <NAT Subnet Prefix Length> -InterfaceIndex <ifIndex>
    

    게이트웨이를 구성하려면 네트워크에 대한 약간의 정보가 필요합니다.

    • IPAddress -- NAT 게이트웨이 IP는 NAT 게이트웨이 IP로 사용할 IPv4 또는 IPv6 주소를 지정합니다.

    제네릭 형식은 a.b.c.1(예: 172.16.0.1)입니다. 최종 위치가 반드시 .1일 필요는 없지만 일반적으로(접두사 길이에 따라) .1입니다. 이 IP 주소는 게스트 가상 머신에서 사용하는 주소 범위에 있습니다. 예를 들어 게스트 VM이 IP 범위 172.16.0.0을 사용하는 경우 NAT 게이트웨이로 IP 주소 172.16.0.100을 사용할 수 있습니다. 일반적인 게이트웨이 IP는 192.168.0.1입니다.

    • PrefixLength -- NAT 서브넷 접두사 길이는 NAT 로컬 서브넷 크기(서브넷 마스크)를 정의합니다. 서브넷 접두사 길이는 0에서 32 사이의 정수 값입니다.

      0은 전체 인터넷을 매핑하고, 32는 하나의 매핑된 IP만 허용합니다. 일반적인 값의 범위는 NAT에 몇 개의 IP를 연결해야 하는지에 따라 24에서 12까지입니다.

      일반적인 PrefixLength는 24입니다. 255.255.255.0의 서브넷 마스크입니다.

    • InterfaceIndex -- ifIndex는 이전 단계에서 결정한 가상 스위치의 인터페이스 인덱스입니다.

    다음을 실행하여 NAT 게이트웨이를 만듭니다.

    New-NetIPAddress -IPAddress 192.168.0.1 -PrefixLength 24 -InterfaceIndex 24
    
  5. New-NetNat을 사용하여 NAT 네트워크를 구성합니다.

    제네릭 명령은 다음과 같습니다.

    New-NetNat -Name <NATOutsideName> -InternalIPInterfaceAddressPrefix <NAT subnet prefix>
    

    게이트웨이를 구성하려면 네트워크 및 NAT 게이트웨이에 대한 정보를 제공해야 합니다.

    • 이름 -- NATOutsideName은 NAT 네트워크의 이름을 설명합니다. NAT 네트워크를 제거하는 데 사용합니다.

    • InternalIPInterfaceAddressPrefix - NAT 서브넷 접두사는 NAT 게이트웨이 IP 접두사와 NAT 서브넷 접두사 길이를 모두 설명합니다.

    제네릭 양식은 a.b.c.0/NAT 서브넷 접두사 길이입니다.

    이 예제에서는 192.168.0.0/24를 사용합니다.

    NAT 네트워크를 설정하려면 다음을 실행합니다.

    New-NetNat -Name MyNATnetwork -InternalIPInterfaceAddressPrefix 192.168.0.0/24
    

축하합니다! 이제 가상 NAT 네트워크가 있습니다!

가상 머신 연결

가상 머신을 새 NAT 네트워크에 연결하려면 이 문서의 첫 번째 단계에서 만든 내부 스위치를 VM 설정 메뉴를 사용하여 가상 머신에 연결합니다.

WinNAT 자체는 엔드포인트(예: VM)에 IP 주소를 할당하고 할당하지 않으므로 VM 자체 내에서 수동으로 이 작업을 수행해야 합니다. 즉, NAT 내부 접두사 범위 내에서 IP 주소를 설정하고, 기본 게이트웨이 IP 주소를 설정하고, DNS 서버 정보를 설정합니다. 유일한 주의 사항은 엔드포인트가 컨테이너에 연결된 경우입니다. 이 경우 HNS(호스트 네트워크 서비스)는 HCS(호스트 컴퓨팅 서비스)를 할당하고 사용하여 IP 주소, 게이트웨이 IP 및 DNS 정보를 컨테이너에 직접 할당합니다.

구성 예제: NAT 네트워크에 VM 및 컨테이너 연결

단일 NAT에 여러 VM 및 컨테이너를 연결해야 하는 경우 NAT 내부 서브넷 접두사가 다른 애플리케이션 또는 서비스(예: Windows용 Docker 및 Windows 컨테이너 – HNS)에 의해 할당되는 IP 범위를 포괄할 만큼 충분히 큰지 확인해야 합니다. 이렇게 하려면 IP 및 네트워크 구성의 애플리케이션 수준 할당 또는 관리자가 수행해야 하고 동일한 호스트에서 기존 IP 할당을 다시 사용하지 않도록 보장하는 수동 구성이 필요합니다.

Windows용 Docker(Linux VM) 및 Windows 컨테이너

이 섹션에 따라 Windows용 Docker(Linux 컨테이너를 실행하는 Linux VM) 및 Windows 컨테이너가 별도의 내부 vSwitches를 사용하여 동일한 WinNAT 인스턴스를 공유할 수 있도록 허용합니다. Linux 컨테이너와 Windows 컨테이너 간의 연결이 모두 작동합니다.

사용자가 "VMNAT"라는 내부 vSwitch를 통해 NAT 네트워크에 VM을 연결했으며 이제 Docker 엔진을 사용하여 Windows 컨테이너 기능을 설치하려고 합니다.

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는 Windows 컨테이너에 IP를 할당하고 관리자는 두 가지 차이점 집합에서 VM에 IP를 할당합니다.

사용자가 Docker 엔진이 실행되는 Windows 컨테이너 기능을 설치했으며 이제 VM을 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는 Windows 컨테이너에 IP를 할당하고 관리자는 두 가지 차이점 집합에서 VM에 IP를 할당합니다.

결국 두 개의 내부 VM 스위치와 하나의 NetNat이 공유됩니다.

동일한 NAT를 사용하는 여러 애플리케이션

일부 시나리오에서는 동일한 NAT를 사용하려면 여러 애플리케이션 또는 서비스가 필요합니다. 이 경우 여러 애플리케이션/서비스에서 더 큰 NAT 내부 서브넷 접두사를 사용할 수 있도록 다음 워크플로를 따라야 합니다.

예제와 동일한 호스트에서 Windows 컨테이너 기능과 함께 존재하는 Docker 4 Windows - Docker 베타 - Linux VM에 대해 자세히 설명합니다. 이 워크플로는 변경될 수 있습니다.

  1.  net stop docker
    
  2.  Stop Docker4Windows MobyLinux VM
    
  3.  Get-ContainerNetwork | Remove-ContainerNetwork -force
    
  4. 기존 컨테이너 네트워크를 제거합니다(즉, vSwitch 삭제, NetNat 삭제, 정리).

     Get-NetNat | Remove-NetNat
    
  5. nat라는 내부 vSwitch 및 IP 접두사 10.0.76.0/24를 사용하여 NAT 네트워크를 만듭니다.

     New-ContainerNetwork -Name nat -Mode NAT –subnetprefix 10.0.76.0/24
    
  6. DockerNAT 및 nat NAT 네트워크를 모두 제거합니다(내부 vSwitche 유지).

     Remove-NetNAT
    
  7. 공유할 D4W 및 컨테이너 둘 다에 대해 더 큰 접두사 10.0.0.0/17을 사용하여 DockerNAT라는 NAT 네트워크를 만듭니다.

     New-NetNat -Name DockerNAT -InternalIPInterfaceAddressPrefix 10.0.0.0/17
    
  8. Docker4Windows 실행(MobyLinux.ps1)

  9. Windows 컨테이너를 연결하려면 사용자 정의 NAT 네트워크를 기본값으로 사용합니다.

     Net start docker
    

결국 두 개의 내부 vSwitches가 있습니다. 하나는 DockerNAT이라고 하고 다른 하나는 nat이라고 합니다. Get-NetNat을 실행하여 하나의 NAT 네트워크(10.0.0.0/17)만 확인합니다. Windows 컨테이너의 IP 주소는 10.0.76.0/24 서브넷에서 Windows 호스트 네트워크 서비스(HNS)에 의해 할당됩니다. 기존 MobyLinux.ps1 스크립트에 따라 Docker 4 Windows의 IP 주소는 10.0.75.0/24 서브넷에서 할당됩니다.

문제 해결

여러 NAT 네트워크가 지원되지 않음

이 가이드에서는 호스트에 다른 NAT가 없다고 가정합니다. 그러나 애플리케이션 또는 서비스는 NAT를 사용해야 하며 설치의 일부로 만들 수 있습니다. Windows(WinNAT)는 하나의 내부 NAT 서브넷 접두사만 지원하므로 여러 NAT를 만들려고 하면 시스템을 알 수 없는 상태가 됩니다.

문제가 될 수 있는지 확인하려면 NAT가 하나만 있는지 확인합니다.

Get-NetNat

NAT가 이미 있는 경우 삭제합니다.

Get-NetNat | Remove-NetNat

애플리케이션 또는 기능(예: Windows 컨테이너)에 대한 "내부" vmSwitch가 하나만 있는지 확인합니다. vSwitch의 이름을 기록합니다.

Get-VMSwitch

개인 IP 주소(예: NAT 기본 게이트웨이 IP 주소 – 일반적으로 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