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 ネットワークの設定について説明します。
管理者として PowerShell コンソールを開きます。
内部スイッチを作成します。
New-VMSwitch -SwitchName "SwitchName" -SwitchType Internal先ほど作成した仮想スイッチのインターフェイス インデックスを見つけます。
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をメモしておきます。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 である必要はありませんが、通常は (プレフィックスの長さに基づいて) です。 この 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 を 1 つだけ許可します。 一般的な値の範囲は、NAT にアタッチする必要がある IP の数に応じて 24 から 12 です。
一般的な PrefixLength は 24 です。これは 255.255.255.0 のサブネット マスクです
InterfaceIndex -- ifIndex は、前の手順で決定した仮想スイッチのインターフェイス インデックスです。
NAT ゲートウェイを作成するには、次のコマンドを実行します。
New-NetIPAddress -IPAddress 192.168.0.1 -PrefixLength 24 -InterfaceIndex 24New-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 とコンテナーのアタッチ
複数の VM とコンテナーを 1 つの NAT にアタッチする必要がある場合は、NAT 内部サブネット プレフィックスが、さまざまなアプリケーションまたはサービスによって割り当てられている IP 範囲 (Docker for Windows や Windows コンテナー – HNS など) を含めるのに十分な大きさであることを確認する必要があります。 これには、アプリケーション レベルの 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 について詳しく説明します。このワークフローは変更される可能性があります
-
net stop docker -
Stop Docker4Windows MobyLinux VM -
Get-ContainerNetwork | Remove-ContainerNetwork -force 以前に既存のコンテナー ネットワークを削除します (つまり、vSwitch を削除し、NetNat を削除し、クリーンアップします)。
Get-NetNat | Remove-NetNatnat という名前の内部 vSwitch と、IP プレフィックス 10.0.76.0/24 の NAT ネットワークを作成します。
New-ContainerNetwork -Name nat -Mode NAT –subnetprefix 10.0.76.0/24DockerNAT ネットワークと NAT NAT ネットワークの両方を削除します (内部 vSwitch を保持します)。
Remove-NetNATD4W とコンテナーの両方が共有できるように、より大きなプレフィックス 10.0.0.0/17 を持つ DockerNAT という名前の NAT ネットワークを作成します。
New-NetNat -Name DockerNAT -InternalIPInterfaceAddressPrefix 10.0.0.0/17Docker4Windows を実行する (MobyLinux.ps1)
Windows コンテナーを接続するには、既定としてユーザー定義 NAT ネットワークを使用します。
Net start docker
最終的には、2 つの内部 vSwitch があります。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
プライベート 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 ネットワーク 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