articles:hyperv_nat

Windows 10 Hyper-VでNAT接続

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

  • 無印のWindows 10(ビルド10240)ではNAT接続を使用できない。
  • Windows 10 November Update(バージョン1511)では裏技的な方法でNAT接続可能。
  • Windows 10 Anniversary Update(バージョン1607)以降は正式にNAT接続をサポート。
  • Windows 10 Fall Creators Update(バージョン1709)では、仮想ネットワークにNAT接続可能な「既定のスイッチ」(英語版ではDefault Switch)が追加。
  • Windows 10(バージョン1909)までのどこかで「既定のスイッチ」が言語に関係なく「Default Switch」に変更

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

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

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

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

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

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

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

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

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サーバはホストと同じ設定にする。

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等)の数が、仮想スイッチの数と一致する事を確認する。

以下を実行すると、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

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

アップデート後の状態

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

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

残骸の削除と再作成

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

アップデート後の状態

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

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

残骸の削除と再作成

  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

アップデート後の状態

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

不完全なNATの削除方法

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

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

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

PS C:\WINDOWS\system32> Get-NetIPAddress -InterfaceAlias *vNAT*
PS C:\WINDOWS\system32> Remove-NetIPAddress -ifIndex 3 -IPAddress 172.16.0.1
  • 最終更新: 2020-07-04 11:42
  • by nabium