目次

Windows 10/11 Hyper-VでNAT接続

Windows 10/11 Hyper-Vの仮想ネットワークでNAT接続する方法。

問題点/注意点

正式にサポートされてからもGUIがないためPowerShellを使用してコマンドラインで設定する。

既定のスイッチではない場合、DHCPやDNSの提供はなく純粋にNAT変換のみの機能。 VMのネットワーク設定は固定にするか、ホスト等にDHCPサーバを用意する必要がある。

Windows 10/11のバージョンが上がる大型アップデートを行うと、NATの設定を行った仮想ネットワークが消える。 完全に消えるのではなく残骸が残った状態になるため、残骸を消した後に再作成する必要がある。 NAT接続の方法が変わったバージョン1607だけでなく、少なくともバージョン1709までは毎回発生している。

Windows 11 22H2では既存の仮想スイッチが全て不通になったため、NATの設定を含めて再作成が必要になった。

ホストにNATは一つだけという制限のせいか、独自にNATを作成するDocker等を使用する場合は注意が必要。

Windows 10 Fall Creators Update/バージョン 1709以降

仮想ネットワークに既定のスイッチがされ、NAT、DHCP、DNSが有効になっている。 特に設定しなくてもNAT接続を利用できるようになった。

このバージョンからLCOW(Linux Container on Windows)を使用するDocker for Windowsが利用可能になったが、 仮想ネットワーク周りは注意が必要。

VagrantのproviderにHyper-Vを使用している場合、vagrant upで接続する仮想スイッチに「既定のスイッチ」を選択すると、 エラーが発生して失敗する。恐らく文字コードの問題。以前のようにNATの仮想スイッチを作成する必要がある。 現在は「Default Switch」に名前が変わったので問題ないはず。

Windows 10 Anniversary Update/バージョン 1607以降、Windows 11も同様

ここでは、vNATという名称で、172.16.0.1をゲートウェイとする172.16.0.0/24の仮想スイッチを想定。

NATの作成 バージョン 1607以降

1) 仮想スイッチの作成

管理者権限で起動したPowerShellで仮想SWを作成する。

PS C:\WINDOWS\system32> New-VMSwitch -SwitchName vNAT -SwitchType Internal

2) 仮想ネットワークアダプタのIP設定

管理者権限で起動したPowerShellで実行する。 まずはGet-NetAdapterで作成した仮想スイッチに対応するifIndexを検索し、そのifIndexに対してIPアドレスを設定する。 設定するIPアドレスはホストのIPアドレス、VMから見ればゲートウェイとなる。

PS C:\WINDOWS\system32> Get-NetAdapter -Name *vNAT*

Name                      InterfaceDescription                    ifIndex Status       MacAddress             LinkSpeed
----                      --------------------                    ------- ------       ----------             ---------
vEthernet (vNAT)          Hyper-V Virtual Ethernet Adapter              3 Up           00-15-5D-00-xx-xx        10 Gbps

PS C:\WINDOWS\system32> New-NetIPAddress -IPAddress 172.16.0.1 -PrefixLength 24 -ifIndex 3

3) NetNatの作成

管理者権限で起動したPowerShellで実行する。

PS C:\WINDOWS\system32> New-NetNat -Name vNAT -InternalIPInterfaceAddressPrefix 172.16.0.0/24

4) 仮想マシンの設定

仮想マシンのネットワークアダプタが接続する仮想スイッチを、作成したvNATにする。

仮想マシンのIPアドレスは172.16.0.0/24の範囲から付与。 ゲートウェイアドレスは172.16.0.1に、DNSサーバはホストと同じ設定にする。

NATの削除 バージョン 1607以降

1) 仮想マシンの確認

削除する仮想スイッチを仮想マシンが使用していないか確認する。 同じ名前で再作成すれば問題ない場合もあるが、ダメな場合もある。

2) NetNatの削除

管理者権限で起動したPowerShellで実行する。

PS C:\WINDOWS\system32> Get-NetNat
PS C:\WINDOWS\system32> Remove-NetNat -Name vNAT

3) 仮想スイッチの削除

管理者権限で起動したPowerShellで実行する。

PS C:\WINDOWS\system32> Get-VMSwitch
PS C:\WINDOWS\system32> Remove-VMSwitch -Name vNAT

4) 確認

デバイスマネージャのネットワークアダプターで、Hyper-V Virtual Ethernet Adapter (またはHyper-V Virtual Ethernet Adapter #2等)の数が、仮想スイッチの数と一致する事を確認する。

Windows 10 November Update/バージョン 1511

参考: Native NAT in Windows 10 Hyper-V using a NAT virtual switch

NATの作成 バージョン 1511

以下を実行すると、vNATという仮想スイッチと、IPアドレスが172.31.0.1の仮想ネットワークアダプタが作成される。 仮想マシンの設定方法はWindows 10 Anniversary Update/バージョン 1607以降と同じ。

1) NAT用仮想スイッチの作成

管理者権限で起動したPowerShellで実行する。

PS C:\WINDOWS\system32> New-VMSwitch -Name vNAT -SwitchType NAT -NATSubnetAddress 172.16.0.0/24

2) NetNatの作成

管理者権限で起動したPowerShellで実行する。

PS C:\WINDOWS\system32> New-NetNat -Name vNAT -InternalIPInterfaceAddressPrefix 172.16.0.0/24

NATの削除 バージョン 1511

1) 仮想マシンの確認

仮想マシンが削除する仮想スイッチを使用していないことを確認する。

2) NetNatの削除

管理者権限で起動したPowerShellで実行する。 名称が分からない場合は、Get-NetNatで確認する。

PS C:\WINDOWS\system32> Get-NetNat
PS C:\WINDOWS\system32> Remove-NetNat -Name vNAT

3) 仮想スイッチの削除

管理者権限で起動したPowerShellで実行する。 名称が分からない場合は、Get-VMSwitchで確認する。

PS C:\WINDOWS\system32> Get-VMSwitch
PS C:\WINDOWS\system32> Remove-VMSwitch -Name vNAT

4) IPアドレスの削除

管理者権限で起動したコマンドプロンプトで実行する。 Remove-VMSwtichするとネットワークアダプタの名称がethernet_数字に変わるため、 netsh interface ipv4 dumpで確認してから削除する。

C:\WINDOWS\system32> netsh interface ipv4 dump
C:\WINDOWS\system32> netsh interface ipv4 delete address name="ethernet_32778" address=172.16.0.1

参考: 仮想スイッチ削除前

add address name="vEthernet (vNAT)" address=172.16.0.1 mask=255.255.255.0

参考: 仮想スイッチ削除後

add address name="ethernet_32778" address=172.16.0.1 mask=255.255.255.0

大型アップデートによるNAT削除からの復旧

バージョン 1703からFall Creators Update/バージョン 1709

アップデート後の状態

仮想スイッチが消えている。 仮想ネットワークアダプタは残っているが機能していない。 NetNatは残っている。

ネットワークアダプタを削除して、同じ名前で仮想スイッチを再作成する。

残骸の削除と再作成

  1. デバイスマネージャからHyper-V Virtual Ethernet Adapterをアンインストール
  2. New-VMSwitch
  3. Get-NetAdapter
  4. New-NetIPAddress

バージョン 1607からCreators Update/バージョン 1703

アップデート後の状態

仮想スイッチは残っていて仮想マシンも起動するがネットワークが機能しない。

仮想スイッチを削除して同じ名前で再作成する。

残骸の削除と再作成

  1. Get-NetNat
  2. Remove-NetNat -Name vNat
  3. Get-NetIPAddress -InterfaceAlias *vNAT*
  4. Remove-NetIPAddress -ifIndex 3 -IPAddress 172.16.0.1
  5. Get-VMSwitch
  6. Remove-VMSwitch -Name vNAT
  7. デバイスマネージャからHyper-V Virtual Ethernet Adapterを削除
  8. New-VMSwitch
  9. Get-NetAdapter
  10. New-NetIPAddress
  11. New-NetNat

バージョン 1511からAnniversary Update/バージョン 1607

アップデート後の状態

NATを使用していた場合は復旧方法無し、仮想マシンの作り直しが必要。 ネットワークアダプタの接続先を変更してもエラーが発生して仮想マシンを起動できない。 不完全に残ったNATを削除して、バージョン 1607の方法で再作成する。

不完全なNATの削除方法

NetNatを削除して、デバイスマネージャからネットワークアダプタを削除する。

  1. Get-NetAdapter
  2. Get-NetIPAddress
  3. Get-NetNat
  4. Remove-NetNat -Name vNAT
  5. デバイスマネージャから、adapterswitch extension の二つを削除

参考

PowerShellで仮想ネットワークアダプタのIPアドレスを削除

管理者権限で起動したPowerShellで実行する。

PS C:\WINDOWS\system32> Get-NetIPAddress -InterfaceAlias *vNAT*
PS C:\WINDOWS\system32> Remove-NetIPAddress -ifIndex 3 -IPAddress 172.16.0.1