Windows 10/Windows Server 2016のHyper-VでNAT(ネットワークアドレス変換)機能を利用する:Tech TIPS
Windows Server 2016やWindows 10のHyper-Vでは、内部仮想スイッチを使ったネットワークでNAT(ネットワークアドレス変換)機能がサポートされている。その概要を紹介する。
対象OS:Windows 10 Anniversary Updte/Windows Server 2016
Windows OSに標準搭載されている仮想化システムHyper-Vは、これまでOSのバージョンアップとともに幾つかの機能が追加されてきた。
Windows 10(Anniversary Update以降)やWindows Server 2016では、新たに「Windows NAT(以下WinNATと呼ぶ)」というNAT(ネットワークアドレス変換)機能が搭載されているので、本TIPSではそれを紹介する。
ネットワークアドレス変換を行うNATとは?
NATとは、IPアドレスやTCP/UDPなどで使用しているポート番号を変換して通信する機能のことだ。一般的には、組織内や家庭内にある多数のネットワーク機器をインターネットに接続する時に使われていることが多いだろう(ブロードバンドルーターや無線LANが持つ標準的な機能)。
一般的にローカルのLAN上ではプライベートIPアドレスを使ってネットワークを構築する。そこから外部(インターネット)へ接続するときは、グローバルIPアドレスだけで通信できる必要がある。その際、パケット中の送信元IPアドレスやポート番号のフィールドを適宜書き換える機能をNATという。
NATを使えば、多数の機器をインターネットに接続できるようになるだけでなく、多くのネットワーク機器の「生の」IPアドレスを隠蔽(いんぺい)できるので、セキュリティ的にも少し安全になる。
NATが使えなかった従来のHyper-V
Hyper-Vなどの仮想化システムを使って環境を構築する場合、仮想マシンをグループ分けするために、仮想的なネットワークも同時に使うことが多い。
だが従来のHyper-VにはNATの機能がなかった。そのため、例えば「内部ネットワーク」(Hyper-V内部で閉じているネットワーク)を作ると、そこに接続したシステムから外部へアクセスするために、ルーターやDHCPサーバなどの機能も(何らかの方法で)用意せねばならず、面倒であった(以下のTIPS参照)。
Hyper-V以外のシステムでは既にNATをサポートしているものも多く、内部ネットワークを使いながらもインターネットと通信するといったことが簡単にできた。
WinNATとは?
それと同じことがWindows Server 2016とWindows 10(Anniversary Update)のHyper-Vでも可能になった。それがWinNATである。
- 「Hyper-V ホストの管理」−「NAT ネットワークの設定」(マイクロソフトMSDNサイト)
- 「Windows NAT (WinNAT) - Capabilities and limitations」[英語](Virtualization Blog)
WinNATは、主にWindowsコンテナ機能をサポートするために用意された機能である(Windowsコンテナについては次のTIPS参照)。Windows 10やWindows Server 2016で導入されたHyper-Vコンテナでは、Hyper-V上にコンテナ用の仮想マシンを作成してIPアドレスを割り当てている。DockerをインストールするとWinNATが自動的に設定されるものの、WinNAT自体はDockerとは関係なく使うことができる。
現在のWinNATには制約がある
WinNATはまだ導入されたばかりで、現在の実装には次のような制約がある。
- WinNATを使うためには、Windows 10 Anniversary Update以降かWindows Server 2016(以降)のHyper-Vが必要
- Hyper-V上の仮想マシンでのみWinNAT機能を利用可能。Hyper-V上のWindows Hyper-Vコンテナ(Docker)でも利用可能
- WinNATネットワークの管理にはPowerShellが必要。GUIの管理ツールはない
- NATの対象にできるIPアドレスは1セットのみ定義可能。複数のWinNATネットワークを作ることはできない。複数の内部ネットワークをNATの対象にしたければ、それらを全部含むような大きなIPアドレス範囲をWinNATのIPアドレス変換の対象として定義すること
- NATの内側と外側でIPアドレス(の範囲)が重複するような設定は不可
- IPアドレスやデフォルトゲートウェイ、ドメイン名、DNSサーバアドレスなどを仮想マシンに自動配布する機能(DHCPなど)はない。手動でIPアドレスなどを設定すること
- ただしWindowsコンテナ(Docker)を使う場合は、コンテナに対してDockerのエンジンが自動的にIPアドレスを割り当ててくれるため、ユーザーが管理する必要はない
WinNATの導入手順
WinNATを使い始めるための手順は次のようになる。
- Hyper-Vの「内部ネットワーク」仮想スイッチを作成する。Hyper-Vの管理ツールにある仮想スイッチマネージャで作成してもよいし、後述のPowerShellで操作してもよい
- 作成した仮想スイッチに対して、静的にIPアドレスとサブネットマスクを割り当てる。これも、仮想ネットワークアダプターにあるTCP/IPv4プロパティ画面で操作してもよいし、PowerShellでもよい
- 2.で作成した仮想スイッチに対して、Set-NetNatコマンドレットで、WinNATとして利用するIPアドレスの範囲とネットマスクを定義する
- 作成した仮想スイッチを仮想マシンにアタッチして起動する
- 仮想マシン内でネットワークインタフェースにIPアドレスやゲートウェイ、DNSサーバのアドレスなどを設定する
Windowsコンテナ機能をインストールしていると、既に仮想スイッチが作成されていることがある。その場合は、定義済みの仮想スイッチを使って4から作業すればよい。もしくは、より広いIPアドレス範囲をカバーする、新しいWinNATを設定し直して利用してもよい。
WinNATを使ってみる
では実際にWinNATを設定してみよう。以下の操作は、管理者権限のあるPowerShellを起動して実行すること。
●既存のWinNATの確認
最初にGet-NetNatを実行して、何も表示されないことを確認しておく。何か表示されたら、既にWinNATのインタフェースが定義されているということである。その場合は「Get-NetNat | Remove-NetNat」などとして削除するか、そのまま使うか検討する。
PS C:\> Get-NetNat ……既にWinNATが設定されていないかどうか調べる
PS C:\> ……何も表示されなければWinNATは未設定
●内部仮想スイッチの作成
次にPowerShellのNew-VMSwitchでHyper-Vの「内部仮想スイッチ」を1つ作成する。以下では「WinNAT」という名前を付けて作成しているが、既存のものと重複しなければ何でもよい。
PS C:\> New-VMSwitch -SwitchName WinNAT -SwitchType Internal ……内部仮想スイッチを1つ作成する
Name SwitchType NetAdapterInterfaceDescription
---- ---------- ------------------------------
WinNAT Internal ……作成された仮想スイッチ
PS C:\>
●内部仮想スイッチの作成
次は作成した仮想スイッチにNew-NetIPAddressでIPアドレスを1つ付ける。ここで付けたIPv4アドレスが、仮想マシンから見た場合のデフォルトゲートウェイになる。PowerShellで操作するなら次のようになる。最初にGet-NetAdapterを実行しているのは、上で作成したネットワークインタフェースの番号(ifIndex)を調べるためである。得られたインタフェース番号を使ってNew-NetIPAddressを実行する。TCP/IPのプロパティ画面でIPアドレスを設定してもよいだろう。例えば「10.100.1.1/16」とするなら、次のようになる。
PS C:\> Get-NetAdapter ……ネットワークインタフェース一覧を確認する
Name InterfaceDescription ifIndex Statu
s
---- -------------------- ------- -----
vEthernet (WinNAT) Hyper-V Virtual Ethernet Adapter 32 Up ……作成した仮想スイッチ。「32」という数字に注目
Wi-Fi Qualcomm Atheros QCA61x4A Wireless N... 9 No...
vEthernet (外部仮想ス... Hyper-V Virtual Ethernet Adapter #2 19 Up
イーサネット Intel(R) Ethernet Connection (2) I219-V 20 Up
↑↑……上のifIndexに表示されている「32」という数字を後で使う
PS C:\>
PS C:\> New-NetIPAddress -IPAddress 10.100.1.1 -PrefixLength 16 -ifIndex 32 ……IPアドレスとネットマスク長(この場合は16bit)を指定する
IPAddress : 10.100.1.1 ……割り当てられたIPv4アドレス
InterfaceIndex : 32 ……インタフェースの番号
InterfaceAlias : vEthernet (WinNAT) ……インタフェース名
AddressFamily : IPv4
Type : Unicast
PrefixLength : 16 ……ネットマスク長
PrefixOrigin : Manual
SuffixOrigin : Manual
AddressState : Tentative
……(以下省略)……
PS C:\>
IPアドレスとネットマスク(の長さ)だけ指定しておけばよい。デフォルトゲートウェイやDNSのフィールドは空欄のままにしておく。
内部仮想スイッチは幾つ作ってもよい。必要なら、例えば「10.100.1.1/24」「10.100.2.1/24」「10.100.3.1/24」……のように複数作成して、VMをグループ分けして使ってもよい。WinNATでは、それらを全部まとめてNATの変換対象にできるからだ。後述のコマンドでは、例えば「10.100.0.0/16」のように指定すればよい(これから分かるように、内部仮想スイッチに割り当てるIPアドレス範囲は、連続するように計画しておかないと面倒になるので注意)。
●WinNATの設定
次はいよいよWinNATの設定である。といってもNew-NetNatコマンドレットで、WinNATの対象となるIPアドレスの範囲(とネットマスク)を指定するだけだ。複数の内部仮想スイッチを変換対象にしたい場合は、それらを全部含むようなアドレスマスクを指定すること。
PS C:\> New-NetNat -Name WinNAT -InternalIPInterfaceAddressPrefix 10.100.0.0/16 ……WinNATを定義する
Name : WinNAT
ExternalIPInterfaceAddressPrefix :
InternalIPInterfaceAddressPrefix : 10.100.0.0/16 ……NATの内側のIPアドレス範囲
IcmpQueryTimeout : 30 ……NATのタイムアウト値などはデフォルト値が割り当てられている。必要なら変更することも可
TcpEstablishedConnectionTimeout : 1800
TcpTransientConnectionTimeout : 120
TcpFilteringBehavior : AddressDependentFiltering
UdpFilteringBehavior : AddressDependentFiltering
UdpIdleSessionTimeout : 120
UdpInboundRefresh : False
Store : Local
Active : True
PS C:\>
PS C:\> Get-NetNat | fl * ……作成したWinNATの定義を確認する
Store : Local
TcpFilteringBehavior : AddressDependentFiltering
UdpFilteringBehavior : AddressDependentFiltering
UdpInboundRefresh : False
Active : True
Caption :
Description :
ElementName :
InstanceID : WinNAT;0
ExternalIPInterfaceAddressPrefix :
IcmpQueryTimeout : 30
InternalIPInterfaceAddressPrefix : 10.100.0.0/16
InternalRoutingDomainId : {00000000-0000-0000-0000-000000000000}
Name : WinNAT
TcpEstablishedConnectionTimeout : 1800
TcpTransientConnectionTimeout : 120
UdpIdleSessionTimeout : 120
PSComputerName :
CimClass : root/StandardCimv2:MSFT_NetNat
CimInstanceProperties : {Caption, Description, ElementName, Instance
ID...}
CimSystemProperties : Microsoft.Management.Infrastructure.CimSyste
mProperties
PS C:\>
作成したWinNATの設定はGet-NetNatで確認できる。
●仮想マシンの作成と内部仮想スイッチのアタッチ、起動、IPアドレスの割り当て
以上でWinNATの設定は終わりである。この他には特に何も必要ない。
後は仮想マシンを作成して最初に作成した内部仮想スイッチをネットワークインタフェースとしてアタッチして起動する。起動後は、ゲストOSからネットワークアダプターが見えるはずなので、それに対してIPアドレスを手動で割り当てる。
IPアドレスやネットマスクは、内部仮想スイッチに割り当てた範囲内で、他と衝突しないものを指定する。デフォルトゲートウェイは、内部仮想スイッチに割り当てたIPアドレスを指定する。上の例なら例えば「IPアドレス=10.100.10.11/16、デフォルトゲートウェイ=10.100.1.1」のように指定する。DNSサーバは、いつも利用しているDNSサーバのアドレスを指定しておけばよいだろう(DNSパケットもNAT経由でアクセスできる)。
WinNATの状態確認
以上の設定が完了すれば、仮想マシンから外部(インターネットなど)へアクセスできるようになっているだろう。Webブラウザを立ち上げたり、アプリケーションを起動したりして動作を確認する。
WinNATの動作状態は、Get-NetNatSessionやGet-NetNatGlobalなどのコマンドレットで確認できる。詳細はNetNatのヘルプなどを参照していただきたい。
PS C:\> Get-NetNatSession ……WinNATのアドレス変換の状態を見てみる
NatName : WinNAT
InternalRoutingDomainId : {b1062982-2b18-4b4f-b3d5-a78ddb9cdd49}
CreationTime : 2016/12/13 17:57:16
Protocol : 17
InternalSourceAddress : 10.100.10.11
InternalSourcePort : 49221
InternalDestinationAddress : 172.16.90.54
InternalDestinationPort : 53
ExternalSourceAddress : 172.16.90.166
ExternalSourcePort : 34759
ExternalDestinationAddress : 172.16.90.54
ExternalDestinationPort : 53
NatName : WinNAT
InternalRoutingDomainId : {b1062982-2b18-4b4f-b3d5-a78ddb9cdd49}
CreationTime : 2016/12/13 17:57:38
Protocol : 17
InternalSourceAddress : 10.100.10.11
InternalSourcePort : 49264
InternalDestinationAddress : 172.16.90.54
InternalDestinationPort : 53
ExternalSourceAddress : 172.16.90.166
ExternalSourcePort : 42442
ExternalDestinationAddress : 172.16.90.54
ExternalDestinationPort : 53
……(以下省略)……
ポートフォワードの設定方法などについては、今後別TIPSで紹介する。
■この記事と関連性の高い別の記事
- Hyper-Vの内部ネットワークでDHCPを利用する(TIPS)
- Virtual PC 2007の共有NATネットワークで利用可能なアドレス範囲に注意(TIPS)
- Windows Server 2008/R2のRRASでNAT機能を有効にする(TIPS)
- Windows 2000/Windows XPのICSを活用する(NATを利用する方法)(1)(TIPS)
- Hyper-Vの仮想マシンへのショートカットを作成する(TIPS)
Copyright© Digital Advantage Corp. All Rights Reserved.