Windows10をホストとするHyper-V 仮想マシンをNAT出来るようにする
はじめに
これまでHyper-Vは仮想化基盤として本気で仮想マシンを稼働させる環境しか触ってきませんでした。
このようなHyper-Vを本気で使っている環境ではNICを稼働させる仮想マシンに必要な数だけ用意するのが通常なので、仮想マシンで使う仮想スイッチ(ちょっと引っかかる表現ですよね)は外部ネットワークとして物理NICを割り当てて、ほとんど問題無くネットワークとして接続できていた訳です。
で、今更ですがこの度Windows 10 でHyper-Vを使ってみようと思いいろいろと参考にさせてもらって見たのですが、思うように仮想マシンから外部ネットワークに出ていく事ができず、結果的にWinNATを設定しましたというお話しです。
思うように外部へ接続できないというのはDHCPを使っていないことが大きな要因だと思いますが、個人宅のPC環境で主に検証・開発するためにNICを複数用意するのもアレだし、外部ネットワークをホストと共有するのもなんか違う気がするので、出来るだけホストに影響のない形で仮想マシン達を外部ネットワークに出したいと思った次第です。
※タイトルではWindows10がホストなのかゲストなのかわかりにくかったので修正しました。それでもわかりにくいですが。(2020/11/26)
構成
- ホストマシン:Windows 10 Pro バージョン 20H2
- ネットワーク:デスクトップですが、無線LANでルータに接続。有線NICもありますが、場所の都合で無線で接続。(どうでもいい情報)
○環境の概要図
ホストとルーターはいわゆる普通の環境だと思います。
設定する手順は次の通り。
- 内部ネットワークの仮想スイッチを作成
- 仮想スイッチ名:WinNAT
- その仮想スイッチのIPアドレスを設定(これがNATゲートウェイとして、仮想マシンのゲートウェイになります)
- IPアドレス:10.0.0.1/255.255.0.0
- NATネットワークを作成する
- NATネットワーク名:WinNAT(同じにしたのでややこしいですが、仮想スイッチ名との関連はありません)
- NATサブネットプレフィクス:10.0.0.0/16
- 仮想マシンのネットワークを設定する(これは今回触れませんが以下のように設定します)
- IPアドレス:NATサブネットプレフィクスの範囲内で。
- ゲートウェイ:10.0.0.1
- DNS:192.168.1.1 ルータのアドレスを指定しました。(他のDNSサーバでも大丈夫です)
参考:以下のリンク(MS本家)を参考にしました。上の説明でなるほどと思った方はこのリンク先で十分かとw


仮想スイッチの設定
設定作業は以下全て、管理者権限のPowerShellで行います。
○仮想スイッチの作成
New-VMSwitch -SwitchName "WinNAT" -SwitchType Internal
○作成したスイッチのインデックスを確認する。
> Get-NetAdapter
Name InterfaceDescription ifIndex Status MacAddress LinkSpeed
---- -------------------- ------- ------ ---------- ---------
Wi-Fi BUFFALO WI-U3-866D Wireless LAN Ad...#3 30 Up XX-XX-XX-XX-XX-XX 866.7 Mbps
vEthernet (Default Swi... Hyper-V Virtual Ethernet Adapter 67 Up 00-15-5D-A4-72-7D 10 Gbps
vEthernet (WinNAT) Hyper-V Virtual Ethernet Adapter #3 18 Up 00-15-5D-47-B1-07 10 Gbps
これは、次にIPアドレスを指定するために確認します。上記結果では、18がインデックスとなります。
○仮想スイッチにIPアドレスを割り当てる
> New-NetIPAddress -IPAddress 10.0.0.1 -PrefixLength 16 -ifIndex 18
IPAddress : 10.0.0.1
InterfaceIndex : 18
InterfaceAlias : vEthernet (WinNAT)
AddressFamily : IPv4
(以下略)
NATネットワークを設定する
○すでにNATネットワークが無いか確認する
サポートされるNATネットワークは1つだけなので、一応確認します。
バグのため、複数作成される事があるようなので確認しておきましょう。
Get-NetNat
NATネットワークが存在していたら削除します。
Get-NetNat | Remove-NetNat
○NATネットワークを設定する
> New-NetNat -Name WinNAT -InternalIPInterfaceAddressPrefix 10.0.0.0/16
Name : WinNAT
ExternalIPInterfaceAddressPrefix :
InternalIPInterfaceAddressPrefix : 10.0.0.0/16
IcmpQueryTimeout : 30
TcpEstablishedConnectionTimeout : 1800
(以下略)
設定する際、すでに他の内部スイッチでNATサブネットの範囲のIPアドレスが使われている場合などは設定時にエラーが発生するので、NATサブネットを変更するか、該当する内部スイッチを変更・削除するなどして対処してください。
これで、設定はおわりです。
あとは仮想マシンのネットワーク設定を前述の通り設定してあげれば外部接続が出来ると思います。
ちなみにNATセッションが発生していたら、Get-NetNatSession
コマンドで確認できます。
以下はDNSサーバにnslookupを実行したときのセッション情報。
> Get-NetNatSession
NatName : WinNAT
InternalRoutingDomainId : {省略}
CreationTime : 2020/11/24 23:19:24
Protocol : 17
InternalSourceAddress : 10.0.2.11
InternalSourcePort : 60370
InternalDestinationAddress : 192.168.1.1
InternalDestinationPort : 53
ExternalSourceAddress : 192.168.1.13
ExternalSourcePort : 57852
ExternalDestinationAddress : 192.168.1.1
ExternalDestinationPort : 53
おわりに
このWinNATを使えるようになってHyper-Vを使った仮想マシンの構築はすっきりしましたが、このWinNATは遅い、もっさりしているなど、いろいろと気になる点は多いようです。ま、ネットワーク系をいろいろ検証する時はもっと環境を整えるでしょうからあまり気にしなくてもいいと思いますが。
ではでは。