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サーバなどの機能も(何らかの方法で)用意せねばならず、面倒であった。

Hyper-V以外のシステムでは既にNATをサポートしているものも多く、内部ネットワークを使いながらもインターネットと通信するといったことが簡単にできた。

●WinNATとは?

それと同じことが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はまだ導入されたばかりで、現在の実装には次のような制約がある。

・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を使い始めるための手順は次のようになる。

1. Hyper-Vの「内部ネットワーク」仮想スイッチを作成する。Hyper-Vの管理ツールにある仮想スイッチマネージャで作成してもよいし、後述のPowerShellで操作してもよい
2. 作成した仮想スイッチに対して、静的にIPアドレスとサブネットマスクを割り当てる。これも、仮想ネットワークアダプターにあるTCP/IPv4プロパティ画面で操作してもよいし、PowerShellでもよい
3. 2.で作成した仮想スイッチに対して、Set-NetNatコマンドレットで、WinNATとして利用するIPアドレスの範囲とネットマスクを定義する
4. 作成した仮想スイッチを仮想マシンにアタッチして起動する
5. 仮想マシン内でネットワークインタフェースに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」という名前を付けて作成しているが、既存のものと重複しなければ何でもよい。