====== Windows 10/11 Hyper-VでNAT接続 ======
{{tag>hyperv}}
Windows 10/11 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''」に変更
* Windows 11は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接続を利用できるようになった。
* [[https://blogs.technet.microsoft.com/virtualization/2017/07/26/hyper-v-virtual-machine-gallery-and-networking-improvements/|Hyper-V virtual machine gallery and networking improvements]]
このバージョンからLCOW(Linux Container on Windows)を使用するDocker for Windowsが利用可能になったが、
仮想ネットワーク周りは注意が必要。
* [[https://github.com/docker/for-win/issues/1166|Docker windows mode breaks Hyper-V vEthernet (Default Switch)]]
* [[https://docs.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/user-guide/setup-nat-network#configuration-example-attaching-vms-and-containers-to-a-nat-network|Dockerと共存させるための設定]]
* [[https://docs.microsoft.com/ja-jp/virtualization/windowscontainers/manage-containers/container-networking|Windows コンテナーのネットワーク]]
VagrantのproviderにHyper-Vを使用している場合、''vagrant up''で接続する仮想スイッチに「''既定のスイッチ''」を選択すると、
エラーが発生して失敗する。恐らく文字コードの問題。以前のようにNATの仮想スイッチを作成する必要がある。
現在は「''Default Switch''」に名前が変わったので問題ないはず。
===== Windows 10 Anniversary Update/バージョン 1607以降、Windows 11も同様 =====
* マイクロソフト公式 [[https://docs.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/user-guide/setup-nat-network|NAT ネットワークの設定]]
* [[https://blogs.technet.microsoft.com/virtualization/2016/05/25/windows-nat-winnat-capabilities-and-limitations/|Windows NAT (WinNAT) — Capabilities and limitations]]
ここでは、''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 =====
参考: [[https://4sysops.com/archives/native-nat-in-windows-10-hyper-v-using-a-nat-virtual-switch/|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は残っている。
ネットワークアダプタを削除して、同じ名前で仮想スイッチを再作成する。
=== 残骸の削除と再作成 ===
- デバイスマネージャから''Hyper-V Virtual Ethernet Adapter''をアンインストール
- New-VMSwitch
- Get-NetAdapter
- New-NetIPAddress
==== バージョン 1607からCreators Update/バージョン 1703 ====
=== アップデート後の状態 ===
仮想スイッチは残っていて仮想マシンも起動するがネットワークが機能しない。
仮想スイッチを削除して同じ名前で再作成する。
=== 残骸の削除と再作成 ===
- Get-NetNat
- Remove-NetNat -Name vNat
- Get-NetIPAddress -InterfaceAlias *vNAT*
- Remove-NetIPAddress -ifIndex 3 -IPAddress 172.16.0.1
- Get-VMSwitch
- Remove-VMSwitch -Name vNAT
- デバイスマネージャから''Hyper-V Virtual Ethernet Adapter''を削除
- New-VMSwitch
- Get-NetAdapter
- New-NetIPAddress
- New-NetNat
==== バージョン 1511からAnniversary Update/バージョン 1607 ====
=== アップデート後の状態 ===
NATを使用していた場合は復旧方法無し、仮想マシンの作り直しが必要。
ネットワークアダプタの接続先を変更してもエラーが発生して仮想マシンを起動できない。
不完全に残ったNATを削除して、バージョン 1607の方法で再作成する。
=== 不完全なNATの削除方法 ===
NetNatを削除して、デバイスマネージャからネットワークアダプタを削除する。
- Get-NetAdapter
- Get-NetIPAddress
- Get-NetNat
- Remove-NetNat -Name vNAT
- デバイスマネージャから、''adapter'' と ''switch 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