다음을 통해 공유


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. 방금 만든 가상 스위치의 인터페이스 인덱스 찾기

    인터페이스 색인은 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. 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 네트워크에 다음 지침을 따릅니다.

가상 머신 연결

새 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 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에서는 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 Beta - Linux VM에 대해 자세히 설명합니다. 이 워크플로는 변경될 수 있습니다.

  1. C:> net stop docker

  2. Docker4Windows MobyLinux VM 중지

  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 컨테이너 기능에 사용됨) nat라는 내부 vSwitch를 만듭니다.
    IP 접두사가 10.0.76.0/24인 “nat”라는 NAT 네트워크를 만듭니다.

  6. Remove-NetNAT
    DockerNAT와 nat NAT 네트워크를 둘 다 제거합니다(내부 vSwitch는 유지).

  7. New-NetNat -Name DockerNAT -InternalIPInterfaceAddressPrefix 10.0.0.0/17(공유할 D4W 및 컨테이너 모두에 대해 더 큰 NAT 네트워크를 만듭니다.)
    더 큰 접두사 10.0.0.0/17을 사용하는 DockerNAT라는 NAT 네트워크를 만듭니다.

  8. Docker4Windows 실행(MobyLinux.ps1)
    내부 vSwitch DockerNAT를 만듭니다.
    IP 접두사가 10.0.75.0/24인 “DockerNAT”라는 NAT 네트워크를 만듭니다.

  9. Net start docker
    Docker는 사용자 정의 NAT 네트워크를 기본값으로 사용하여 Windows 컨테이너를 연결합니다.

결국 두 개의 내부 vSwitche가 있어야 합니다. 하나는 DockerNAT이고 다른 하나는 nat입니다. Get-NetNat을 실행하여 하나의 NAT 네트워크(10.0.0.0/17)만 확인합니다. Windows 컨테이너의 IP 주소는 10.0.76.0/24 서브넷의 HNS(Windows 호스트 네트워크 서비스)에서 할당됩니다. 기존 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 네트워크에 대한 보고서를 보았습니다. 이는 최근 빌드(Windows Server 2016 Technical Preview 5 및 Windows 10 Insider Preview 빌드 포함)의 버그 때문입니다. Docker 네트워크 ls 또는 Get-ContainerNetwork를 실행한 후 여러 NAT 네트워크가 표시되는 경우 관리자 권한 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 네트워크에 대해 자세히 알아보기