NAT ネットワークのセットアップSet up a NAT network

Windows 10 Hyper-V では、仮想ネットワークのネイティブ ネットワーク アドレス変換 (NAT) を可能です。Windows 10 Hyper-V allows native network address translation (NAT) for a virtual network.

このガイドでは、以下について説明します。This guide will walk you through:

  • NAT ネットワークを作成するcreating a NAT network
  • 既存の仮想マシンを新しいネットワークに接続するconnecting an existing virtual machine to your new network
  • 仮想マシンが正しく接続されていることを確認するconfirming that the virtual machine is connected correctly

要件:Requirements:

  • Windows 10 Anniversary Update 以降Windows 10 Anniversary Update or later
  • Hyper-V が有効になっている (詳しくはこちらをご覧ください)Hyper-V is enabled (instructions here)

注: 現時点では、ホストごとに 1 つの NAT ネットワークのみを作成できます。Note: Currently, you are limited to one NAT network per host. Windows NAT (WinNAT) の実装、機能、制限事項のについて詳しくは、「WinNAT 機能と制限事項のブログ (ブログの投稿)」をご覧くださいFor additional details on the Windows NAT (WinNAT) implementation, capabilities, and limitations, please reference the WinNAT capabilities and limitations blog

NAT 概要NAT Overview

NAT は、ホスト コンピューターの IP アドレスと内部 Hyper-V 仮想スイッチを通じてポートを利用することで、ネットワーク リソースへのアクセスを仮想マシンに与えます。NAT gives a virtual machine access to network resources using the host computer's IP address and a port through an internal Hyper-V Virtual Switch.

ネットワーク アドレス変換 (NAT) は IP アドレスを節約するように設計されているネットワーキング モードです。外部の IP アドレスとポートをより大きな内部 IP アドレス セットにマッピングします。Network Address Translation (NAT) is a networking mode designed to conserve IP addresses by mapping an external IP address and port to a much larger set of internal IP addresses. 基本的に、NAT はフロー テーブルを利用し、外部 (ホスト) IP アドレスとポート番号からネットワーク上のエンドポイント (仮想マシン、コンピューター、コンテナーなど) に関連付けられている正しい内部 IP アドレスにトラフィックを送りますBasically, a NAT uses a flow table to route traffic from an external (host) IP Address and port number to the correct internal IP address associated with an endpoint on the network (virtual machine, computer, container, etc.)

また、NAT を利用すれば、同じ (内部) 通信ポートを必要とするアプリケーションを複数の仮想マシンがホストできます。アプリケーションを一意の外部ポートにマッピングします。Additionally, NAT allows multiple virtual machines to host applications that require identical (internal) communication ports by mapping these to unique external ports.

以上の理由から、NAT ネットワーキングはコンテナー技術として一般的になっています (「コンテナーのネットワーク」参照)。For all of these reasons, NAT networking is very common for container technology (see Container Networking).

NAT 仮想ネットワークを作成するCreate a NAT virtual network

新しい NAT ネットワークの設定方法を段階的に確認しましょう。Let's walk through setting up a new NAT network.

  1. 管理者として PowerShell コンソールを開きます。Open a PowerShell console as Administrator.

  2. 内部スイッチを作成するCreate an internal switch.

New-VMSwitch -SwitchName "SwitchName" -SwitchType Internal
  1. 作成した仮想スイッチのインターフェイス インデックスを検索します。Find the interface index of the virtual switch you just created.

    を実行すると、インターフェイスインデックスを見つけることができ Get-NetAdapterYou can find the interface index by running Get-NetAdapter

    出力は以下のようになります。Your output should look something like this:

    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 のインターフェイスの説明が付きます。The internal switch will have a name like vEthernet (SwitchName) and an Interface Description of Hyper-V Virtual Ethernet Adapter. 次の手順で使用できるように、ifIndex を書き留めます。Take note of its ifIndex to use in the next step.

  2. New-NetIPAddress を利用して NAT ゲートウェイを構成します。Configure the NAT gateway using New-NetIPAddress.

汎用コマンドを次に示します。Here is the generic command:

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

ゲートウェイを構成するためには、ネットワークについていくつかの情報が必要です。In order to configure the gateway, you'll need a bit of information about your network:

  • IPAddress -- NAT ゲートウェイ IP は、NAT ゲートウェイ IP として使用する IPv4 または IPv6 アドレスを指定するものです。IPAddress -- NAT Gateway IP specifies the IPv4 or IPv6 address to use as the NAT gateway IP.
    一般的な形式は a.b.c.1 です (例: 172.16.0.1)。The generic form will be a.b.c.1 (e.g. 172.16.0.1). 最後の位置を 1 にする必要はありませんが、通常はそうなっています (プレフィックスの長さに基づきます)。While the final position doesn’t have to be .1, it usually is (based on prefix length)

    一般的なゲートウェイ IP は 192.168.0.1 です。A common gateway IP is 192.168.0.1

  • PrefixLength -- NAT Subnet Prefix Length により、NAT ローカル サブネット サイズが定義されます (サブネット マスク)。PrefixLength -- NAT Subnet Prefix Length defines the NAT local subnet size (subnet mask). サブネット プレフィックスの長さは、0 ~ 32 の整数値になります。The subnet prefix length will be an integer value between 0 and 32.

    0 の場合、インターネット全体がマッピングされます。32 の場合、IP を 1 つだけマッピングできます。0 would map the entire internet, 32 would only allow one mapped IP. 一般的な値は 24 ~ 12 であり、NAT に接続する IP の数により決まります。Common values range from 24 to 12 depending on how many IPs need to be attached to the NAT.

    一般的な PrefixLength は 24 です。これは 255.255.255.0 のサブネット マスクです。A common PrefixLength is 24 -- this is a subnet mask of 255.255.255.0

  • InterfaceIndex: ifIndex は、前の手順で指定した、仮想スイッチのインターフェイス インデックスです。InterfaceIndex -- ifIndex is the interface index of the virtual switch, which you determined in the previous step.

次を実行して、NAT ゲートウェイを作成します。Run the following to create the NAT Gateway:

New-NetIPAddress -IPAddress 192.168.0.1 -PrefixLength 24 -InterfaceIndex 24
  1. New-NetNat を使用し、NAT ネットワークを構成します。Configure the NAT network using New-NetNat.

汎用コマンドを次に示します。Here is the generic command:

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

ゲートウェイを構成するには、ネットワークと NAT ゲートウェイに関する情報を提供する必要があります。In order to configure the gateway, you'll need to provide information about the network and NAT Gateway:

  • Name -- NATOutsideName は NAT ネットワークの名前です。Name -- NATOutsideName describes the name of the NAT network. NAT ネットワークを削除するとき、これを使用します。You'll use this to remove the NAT network.

  • InternalIPInterfaceAddressPrefix -- NAT サブネット プレフィックスは、上記の NAT ゲートウェイ IP プレフィックスと上記の NAT Subnet Prefix Length の両方を表すものです。InternalIPInterfaceAddressPrefix -- NAT subnet prefix describes both the NAT Gateway IP prefix from above as well as the NAT Subnet Prefix Length from above.

    一般的な形式は a.b.c.0/NAT Subnet Prefix Length ですThe generic form will be a.b.c.0/NAT Subnet Prefix Length

    上記から、この例では、192.168.0.0/24 を使用します。From the above, for this example, we'll use 192.168.0.0/24

この例では、次を実行して NAT ネットワークを設定します。For our example, run the following to setup the NAT network:

New-NetNat -Name MyNATnetwork -InternalIPInterfaceAddressPrefix 192.168.0.0/24

これで終了です。Congratulations! これで仮想 NAT ネットワークができました。You now have a virtual NAT network! NAT ネットワークに仮想マシンを追加するには、ここの指示に従ってください。To add a virtual machine, to the NAT network follow these instructions.

仮想マシンを接続するConnect a virtual machine

仮想マシンを新しい NAT ネットワークに接続するには、VM 設定メニューを利用し、NAT ネットワークの設定の最初の手順で作成した内部スイッチを仮想マシンに接続します。To connect a virtual machine to your new NAT network, connect the internal switch you created in the first step of the NAT Network Setup section to your virtual machine using the VM Settings menu.

WinNAT は単独でエンドポイント (例: VM) に IP アドレスを割り当てることがないため、VM 自体から手動でこの作業を行う必要があります。つまり、NAT 内部プレフィックスの範囲内で IP アドレスを設定し、既定のゲートウェイ IP アドレスを設定し、DNS サーバー情報を設定します。Since WinNAT by itself does not allocate and assign IP addresses to an endpoint (e.g. VM), you will need to do this manually from within the VM itself - i.e. set IP address within range of NAT internal prefix, set default gateway IP address, set DNS server information. ただし、エンドポイントがコンテナーにアタッチされる場合には、注意が必要です。The only caveat to this is when the endpoint is attached to a container. この場合、ホスト ネットワーク サービス (HNS) はホスト コンピューティング サービス (HCS) を割り当てて使用し、IP アドレス、ゲートウェイ IP、DNS 情報をコンテナーに直接割り当てます。In this case, the Host Network Service (HNS) allocates and uses the Host Compute Service (HCS) to assign the IP address, gateway IP, and DNS info to the container directly.

構成の例: NAT ネットワークへの VM とコンテナーのアタッチConfiguration Example: Attaching VMs and Containers to a NAT network

複数の Vm とコンテナーを1つの NAT にアタッチする必要がある場合は、NAT 内部サブネットプレフィックスが、さまざまなアプリケーションまたはサービス (Docker for Windows や Windows コンテナーなど) によって割り当てられている IP 範囲を網羅するのに十分な大きさであることを確認する必要があります。HNS)。これには、Ip とネットワーク構成のアプリケーションレベルの割り当て、または管理者によって実行される必要があり、同じホスト上で既存の IP 割り当てを再利用しないことが保証される手動構成のいずれかが必要です。If you need to attach multiple VMs and containers to a single NAT, you will need to ensure that the NAT internal subnet prefix is large enough to encompass the IP ranges being assigned by different applications or services (e.g. Docker for Windows and Windows Container – HNS). This will require either application-level assignment of IPs and network configuration or manual configuration which must be done by an admin and guaranteed not to re-use existing IP assignments on the same host.

Docker for Windows (Linux VM) と Windows コンテナーDocker for Windows (Linux VM) and Windows Containers

次のソリューションでは、Docker for Windows (Linux コンテナーを実行する Linux VM) と Windows コンテナーの両方が、別の内部 vSwitch が使用する同じ WinNAT インスタンスを共有できます。The solution below will allow both Docker for Windows (Linux VM running Linux containers) and Windows Containers to share the same WinNAT instance using separate internal vSwitches. 接続は Linux コンテナーと Windows コンテナーの両方で機能します。Connectivity between both Linux and Windows containers will work.

ユーザーは “VMNAT” という名前の内部 vSwitch を通じて VM を NAT ネットワークにしており、次に Docker エンジンを使用して Windows コンテナー機能をインストールしようと考えていますUser has connected VMs to a NAT network through an internal vSwitch named “VMNAT” and now wants to install Windows Container feature with docker engine

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 が割り当てられ、管理者は2つの異なるセットから Vm に Ip を割り当てます。Docker/HNS will assign IPs to Windows containers and Admin will assign IPs to VMs from the difference set of the two.

ユーザーは実行中の docker エンジンを使用して Windows コンテナー機能をインストールしました。次に、NAT ネットワークに VM を接続しようと考えていますUser has installed Windows Container feature with docker engine running and now wants to connect VMs to the NAT network

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 が割り当てられ、管理者は2つの異なるセットから Vm に Ip を割り当てます。Docker/HNS will assign IPs to Windows containers and Admin will assign IPs to VMs from the difference set of the two.

最後に、2 つの内部 VM スイッチを設定し、そのスイッチ間で共有する NetNat を 1 つ設定する必要があります。In the end, you should have two internal VM switches and one NetNat shared between them.

複数のアプリケーションで同じ NAT を使用するMultiple Applications using the same NAT

複数のアプリケーションまたはサービスで同じ NAT を使用することが必要になる場合もあります。Some scenarios require multiple applications or services to use the same NAT. そのような場合、複数のアプリケーションまたはサービスでより大きな NAT 内部サブネット プレフィックスを使えるように、次のワークフローに従う必要があります。In this case, the following workflow must be followed so that multiple applications / services can use a larger NAT internal subnet prefix

例として、同じホスト上の Windows コンテナー機能を使用した Docker 4 Windows Docker Beta-Linux VM の共存について説明します。このワークフローは変更される可能性がありますWe will detail the Docker 4 Windows - Docker Beta - Linux VM co-existing with the Windows Container feature on the same host as an example. This workflow is subject to change

  1. C:> net stop dockerC:> net stop docker

  2. Stop Docker4Windows MobyLinux VMStop Docker4Windows MobyLinux VM

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

  4. PS C:> Get-NetNat | Remove-NetNatPS C:> Get-NetNat | Remove-NetNat
    以前に存在していたコンテナーネットワークを削除します (つまり、vSwitch を削除し、NetNat を削除し、クリーンアップします)Removes any previously existing container networks (i.e. deletes vSwitch, deletes NetNat, cleans up)

  5. New-ContainerNetwork -Name nat -Mode NAT –subnetprefix 10.0.76.0/24 (このサブネットは Windows コンテナー機能で使用されます) 内部 vSwitch が「nat」という名前で作成されますNew-ContainerNetwork -Name nat -Mode NAT –subnetprefix 10.0.76.0/24 (this subnet will be used for Windows containers feature) Creates internal vSwitch named nat
    "Nat" という名前の NAT ネットワークを、IP プレフィックス 10.0.76.0/24 と共に作成します。Creates NAT network named “nat” with IP prefix 10.0.76.0/24

  6. Remove-NetNATRemove-NetNAT
    DockerNAT ネットワークと nat NAT ネットワークの両方を削除します (内部の vSwitches を保持します)。Removes both DockerNAT and nat NAT networks (keeps internal vSwitches)

  7. New-NetNat -Name DockerNAT -InternalIPInterfaceAddressPrefix 10.0.0.0/17 (これは D4W とコンテナーが共有するためのより大きな NAT ネットワークを作成します)New-NetNat -Name DockerNAT -InternalIPInterfaceAddressPrefix 10.0.0.0/17 (this will create a larger NAT network for both D4W and containers to share)
    より大きいプレフィックス 10.0.0.0/17 を使用して、DockerNAT という名前の NAT ネットワークを作成しますCreates NAT network named DockerNAT with larger prefix 10.0.0.0/17

  8. Run Docker4Windows (MobyLinux.ps1)Run Docker4Windows (MobyLinux.ps1)
    内部 vSwitch DockerNAT を作成しますCreates internal vSwitch DockerNAT
    "DockerNAT" という名前の NAT ネットワークを IP プレフィックス 10.0.75.0/24 で作成します。Creates NAT network named “DockerNAT” with IP prefix 10.0.75.0/24

  9. Net start dockerNet start docker
    Docker は、Windows コンテナーを接続するための既定値としてユーザー定義の NAT ネットワークを使用します。Docker will use the user-defined NAT network as the default to connect Windows containers

最終的に、2 つの内部 vSwitches が与えられるはずです。1 つは「DockerNAT」という名前で、もう 1 つは「nat」という名前です。In the end, you should have two internal vSwitches – one named DockerNAT and the other named nat. Get-NetNat を実行すると、NAT ネットワークが 1 つだけ確定します (10.0.0.0/17)。You will only have one NAT network (10.0.0.0/17) confirmed by running Get-NetNat. Windows コンテナーの IP アドレスが Windows Host Network Service (HNS) により 10.0.76.0/24 サブネットから割り当てられます。IP addresses for Windows containers will be assigned by the Windows Host Network Service (HNS) from the 10.0.76.0/24 subnet. 既存の MobyLinux.ps1 スクリプトに基づき、Docker 4 Windows の IP アドレスが 10.0.75.0/24 サブネットから割り当てられます。Based on the existing MobyLinux.ps1 script, IP addresses for Docker 4 Windows will be assigned from the 10.0.75.0/24 subnet.

トラブルシューティングTroubleshooting

サポートされない複数の NAT ネットワークMultiple NAT networks are not supported

このガイドでは、ホストに他に NAT がないものと想定しています。This guide assumes that there are no other NATs on the host. ただし、アプリケーションまたはサービスで NAT の使用が必要であり、設定の一環として作成される場合があります。However, applications or services will require the use of a NAT and may create one as part of setup. Windows (WinNAT) でサポートされる内部 NAT サブネット プレフィックスは 1 つだけです。複数の NAT を作成しようとすると、システムが不明状態になります。Since Windows (WinNAT) only supports one internal NAT subnet prefix, trying to create multiple NATs will place the system into an unknown state.

この問題があるかを確認するには、NAT が 1 つだけであることを確認します。To see if this may be the problem, make sure you only have one NAT:

Get-NetNat

NAT が既に存在する場合はそれを削除します。If a NAT already exists, delete it

Get-NetNat | Remove-NetNat

アプリケーションまたは機能 (例: Windows コンテナー) ごとに「内部」vmSwitch が 1 つだけ設定されていることを確認します。Make sure you only have one “internal” vmSwitch for the application or feature (e.g. Windows containers). vSwitch の名前を記録しますRecord the name of the vSwitch

Get-VMSwitch

以前の NAT のプライベート IP アドレス (例: NAT の既定のゲートウェイ IP Address - 通常 *.1) がアダプターに割り当てられていないか確認しますCheck to see if there are private IP addresses (e.g. NAT default Gateway IP Address – usually *.1) from the old NAT still assigned to an adapter

Get-NetIPAddress -InterfaceAlias "vEthernet (<name of vSwitch>)"

古いプライベート IP アドレスが使用されている場合、それを削除してください。If an old private IP address is in use, please delete it

Remove-NetIPAddress -InterfaceAlias "vEthernet (<name of vSwitch>)" -IPAddress <IPAddress>

複数の Nat の削除Removing Multiple NATs
複数の NAT ネットワークが誤って作成されてしまうと報告されています。We have seen reports of multiple NAT networks created inadvertently. これは、最新のビルド (Windows Server 2016 Technical Preview 5 や Windows 10 Insider Preview ビルドなど) のバグが原因です。This is due to a bug in recent builds (including Windows Server 2016 Technical Preview 5 and Windows 10 Insider Preview builds). 複数の NAT ネットワークがある場合は、docker ネットワーク ls や Get-ContainerNetwork を実行した後に、管理者特権の PowerShell から次を実行してください。If you see multiple NAT networks, after running docker network ls or Get-ContainerNetwork, please perform the following from an elevated PowerShell:

PS> $KeyPath = "HKLM:\SYSTEM\CurrentControlSet\Services\vmsmp\parameters\SwitchList"
PS> $keys = get-childitem $KeyPath
PS> foreach($key in $keys)
PS> {
PS>    if ($key.GetValue("FriendlyName") -eq 'nat')
PS>    {
PS>       $newKeyPath = $KeyPath+"\"+$key.PSChildName
PS>       Remove-Item -Path $newKeyPath -Recurse
PS>    }
PS> }
PS> remove-netnat -Confirm:$false
PS> Get-ContainerNetwork | Remove-ContainerNetwork
PS> Get-VmSwitch -Name nat | Remove-VmSwitch (_failure is expected_)
PS> Stop-Service docker
PS> Set-Service docker -StartupType Disabled
Reboot Host
PS> Get-NetNat | Remove-NetNat
PS> Set-Service docker -StartupType automaticac
PS> Start-Service docker 

NAT 環境を必要に応じて再構築するには、セットアップ ガイド「複数のアプリケーションで同じ NAT を使用する」をご覧ください。See this setup guide for multiple applications using the same NAT to rebuild your NAT environment, if necessary.

参考資料References

NAT ネットワークの詳細はここを参照してください。Read more about NAT networks