次の方法で共有


NAT ネットワークの設定

Windows 10 および Windows 11 Hyper-V では、仮想ネットワークに対して、ネットワーク アドレス変換 (NAT) をネイティブに実行できます。

このガイドでは、次の操作方法について説明します。

  • NAT ネットワークを作成する
  • 既存の仮想マシンを新しいネットワークに接続する
  • 仮想マシンが正しく接続されていることを確認する

要件:

  • Windows 10 Anniversary Update 以降
  • Hyper-V が有効になっています。 指示に従って Hyper-V を有効化します

現時点では、ホストごとに 1 つの 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. New-NetIPAddress を使用して NAT ゲートウェイを構成します。

    汎用コマンドを次に示します。

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

    ゲートウェイを構成するには、ネットワークに関する情報が少し必要です。

    • IPAddress -- NAT Gateway 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 Subnet Prefix Length により、NAT ローカル サブネット サイズが定義されます (サブネット マスク)。 サブネット プレフィックスの長さは、0 ~ 32 の整数値です。

      0 は、インターネット全体をマップし、32 は、マップされた IP を 1 つのみ許可します。 一般的な値は 24 ~ 12 で、NAT に接続する必要がある IP 数によって異なります。

      一般的な PrefixLength は 24 です。これは 255.255.255.0 のサブネット マスクです

    • InterfaceIndex -- ifIndex は、前の手順で決定した仮想スイッチのインターフェイス インデックスです。

    次のコマンドを実行して、NAT Gateway を作成します。

    New-NetIPAddress -IPAddress 192.168.0.1 -PrefixLength 24 -InterfaceIndex 24
    
  5. New-NetNat を使用して NAT ネットワークを構成します。

    汎用コマンドを次に示します。

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

    ゲートウェイを構成するには、ネットワークと NAT Gateway に関する情報を提供する必要があります。

    • Name -- 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 とコンテナーのアタッチ

複数の VM とコンテナーを 1 つの NAT にアタッチする場合は、NAT 内部サブネットのプレフィックスが別のアプリケーションまたはサービス (例: Docker for Windows や Windows コンテナー – HNS) によって割り当てられている IP の範囲を網羅するのに十分な大きさになっている必要があります。 これには、アプリケーション レベルの IP とネットワーク構成の割り当て、または管理者が行う必要があり、同じホスト上の既存の IP 割り当てを再利用しないことを保証する手動構成が必要です。

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

このセクションに従って、Docker for Windows と (Linux コンテナーを実行している Linux VM) と Windows コンテナーの両方が、個別の内部 vSwitch を使用して同じ WinNAT インスタンスを共有できるようにします。 Linux コンテナーと Windows コンテナーの両方の間の接続が機能します。

ユーザーは、"VMNAT" という名前の内部 vSwitch を介して VM を NAT ネットワークに接続しており、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 を割り当て、管理者は 2 つの差分セットから IP を VM に割り当てます。

ユーザーは 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 を割り当て、管理者は 2 つの差分セットから IP を VM に割り当てます。

最後に、2 つの内部 VM スイッチと 1 つの NetNat がそれらの間で共有されます。

同じ NAT を使用する複数のアプリケーション

一部のシナリオでは、複数のアプリケーションまたはサービスで同じ NAT を使用する必要があります。 この場合、複数のアプリケーション/サービスがより大きな NAT 内部サブネット プレフィックスを使用できるように、次のワークフローに従う必要があります

例と同じホスト上の Windows コンテナー機能と共に、Docker 4 Windows - Docker Beta - 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 ネットワークの両方を削除します (内部 vSwitch を保持します)。

     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
    

最終的には、内部 vSwitch が 2 つあります。1 つの名前は DockerNAT で、もう 1 つの名前は natです。 Get-NetNat を実行して確認できる NAT ネットワーク (10.0.0.0/17) は 1 つだけです。 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) は 1 つの内部 NAT サブネット プレフィックスのみをサポートするため、複数の NAT を作成しようとすると、システムは不明な状態になります。

これが問題になる可能性があるかどうかを確認するには、NAT が 1 つだけであることを確認します。

Get-NetNat

NAT が既に存在する場合は、削除します。

Get-NetNat | Remove-NetNat

アプリケーションまたは機能 (例: Windows コンテナー) ごとに「内部」vmSwitch が 1 つだけ設定されていることを確認します。 vSwitch の名前を記録します。

Get-VMSwitch

以前の NAT のプライベート IP アドレス (例: 既定の NAT Gateway IP アドレス - 通常 x.y.z.1) がアダプターに割り当てられていないか確認します。

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

古いプライベート IP アドレスが使用中の場合は、削除してください。

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

複数の NAT の削除 複数の NAT ネットワークのレポートが誤って作成されているのを確認しました。 複数の NAT ネットワークが表示される場合は、Docker ネットワーク 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