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とは、IPアドレスやTCP/UDPなどで使用しているポート番号を変換して通信する機能のことだ。一般的には、組織内や家庭内にある多数のネットワーク機器をインターネットに接続する時に使われていることが多いだろう(ブロードバンドルーターや無線LANが持つ標準的な機能)。
一般的にローカルのLAN上ではプライベートIPアドレスを使ってネットワークを構築する。そこから外部(インターネット)へ接続するときは、グローバルIPアドレスだけで通信できる必要がある。その際、パケット中の送信元IPアドレスやポート番号のフィールドを適宜書き換える機能をNATという。
NATを使えば、多数の機器をインターネットに接続できるようになるだけでなく、多くのネットワーク機器の「生の」IPアドレスを隠蔽(いんぺい)できるので、セキュリティ的にも少し安全になる。
Hyper-Vなどの仮想化システムを使って環境を構築する場合、仮想マシンをグループ分けするために、仮想的なネットワークも同時に使うことが多い。
だが従来のHyper-VにはNATの機能がなかった。そのため、例えば「内部ネットワーク」(Hyper-V内部で閉じているネットワーク)を作ると、そこに接続したシステムから外部へアクセスするために、ルーターやDHCPサーバなどの機能も(何らかの方法で)用意せねばならず、面倒であった(以下のTIPS参照)。
Hyper-V以外のシステムでは既にNATをサポートしているものも多く、内部ネットワークを使いながらもインターネットと通信するといったことが簡単にできた。
それと同じことがWindows Server 2016とWindows 10(Anniversary Update)のHyper-Vでも可能になった。それがWinNATである。
WinNATは、主にWindowsコンテナ機能をサポートするために用意された機能である(Windowsコンテナについては次のTIPS参照)。Windows 10やWindows Server 2016で導入されたHyper-Vコンテナでは、Hyper-V上にコンテナ用の仮想マシンを作成してIPアドレスを割り当てている。DockerをインストールするとWinNATが自動的に設定されるものの、WinNAT自体はDockerとは関係なく使うことができる。
WinNATはまだ導入されたばかりで、現在の実装には次のような制約がある。
WinNATを使い始めるための手順は次のようになる。
Windowsコンテナ機能をインストールしていると、既に仮想スイッチが作成されていることがある。その場合は、定義済みの仮想スイッチを使って4から作業すればよい。もしくは、より広いIPアドレス範囲をカバーする、新しいWinNATを設定し直して利用してもよい。
では実際にWinNATを設定してみよう。以下の操作は、管理者権限のあるPowerShellを起動して実行すること。
最初に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の設定である。といっても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で確認できる。
以上でWinNATの設定は終わりである。この他には特に何も必要ない。
後は仮想マシンを作成して最初に作成した内部仮想スイッチをネットワークインタフェースとしてアタッチして起動する。起動後は、ゲストOSからネットワークアダプターが見えるはずなので、それに対してIPアドレスを手動で割り当てる。
IPアドレスやネットマスクは、内部仮想スイッチに割り当てた範囲内で、他と衝突しないものを指定する。デフォルトゲートウェイは、内部仮想スイッチに割り当てたIPアドレスを指定する。上の例なら例えば「IPアドレス=10.100.10.11/16、デフォルトゲートウェイ=10.100.1.1」のように指定する。DNSサーバは、いつも利用しているDNSサーバのアドレスを指定しておけばよいだろう(DNSパケットもNAT経由でアクセスできる)。
以上の設定が完了すれば、仮想マシンから外部(インターネットなど)へアクセスできるようになっているだろう。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で紹介する。
■この記事と関連性の高い別の記事
Copyright© Digital Advantage Corp. All Rights Reserved.