2015/09/11

Windows Server 2016 TP3 > Hyper-V で NAT スイッチが簡単に?

Windows Server 2016 Technical Preview 3 の New-VMSwitch コマンドレットの -SwitchType パラメーターに NAT が追加されています(これまでは Internal と Private または外部 NIC 指定のみ)。


Windows Server 2016 Technical Preview 3 から利用可能になったコンテナー テクノロジは、Hyper-V のテクノロジをいろいろと利用しています。例えば、この NAT タイプの仮想スイッチは、Windows Server コンテナーに外部ネットワーク アクセスと外部からの IP マスカレード(ポート forワーディング) を提供するために利用されています。

もしかすると、Hyper-V の仮想マシンでも NAT タイプの仮想スイッチができるのでは?と思ったので、やってみました。

こちらは、Windows Server コンテナーの実行環境の仮想スイッチの構成です。





図にするとこんな感じ。


これを参考に、Windows Server 2016 Technical Preview 3 の Hyper-V ホストに、NAT タイプの仮想スイッチを作成してみました。図にするとこんな感じ。


仮想マシン側の IP アドレス範囲は 10.0.0.0/24 にしました。

$SubnetPrefix = "10.0.0.0/24"
New-VmSwitch "Virtual Switch - NAT" -SwitchType NAT -NatSubnetAddress $SubnetPrefix
New-NetNat -Name "VmNAT" -InternalIPInterfaceAddressPrefix $SubnetPrefix


こうして作成した仮想スイッチは、Hyper-V からは内部ネットワーク (Internal network) タイプの仮想スイッチとして見えます。通常の Hyper-V の内部ネットワーク (Internal network) タイプの仮想スイッチは、管理 OS と仮想マシンのみが接続できるスイッチです。

管理 OS (Hyper-V ホスト) に追加されたネットワーク アダプターは、自動的に -NATSubnetAddress パラメーターに指定した IP アドレス範囲の最初の IP アドレス(10.0.0.1)が設定されていました。

NAT タイプの仮想スイッチに仮想マシンを接続し、開始したところ、残念ながら IP アドレスが自動的に割り振られることはなく、外部との通信はできませんでした。が...


-NATSubnetAddress パラメーターに指定した IP アドレス範囲から空いている IP アドレス (10.0.0.2 以降) を仮想マシンに手動で割り当て、デフォルトゲートウェイとして管理 OS 側に自動設定された最初の IP アドレスを指定し、DNS サーバーとして管理 OS が参照している DNS サーバーを指定してあげたところ、外部ネットワークにアクセスできるように!!

(Virtual Machine Manager 環境があれば DHCP Extension が使えるので、それでいけるかも... Windows Server Gateway なしでも NAT 環境作れるかも...といろいろと想像) 
Static IP Injection の機能 (Msvm_GuestNetworkAdapterConfiguration class → https://msdn.microsoft.com/en-us/library/hh850156(v=vs.85).aspx) を使って Hyper-V ホスト側から仮想マシンの IP を設定するという方法もありますね。

参考:
Hyper-V ホストから仮想マシンの IP を設定する (Static IP Injection 利用で) 

Windows Server コンテナーの場合と同じ手順で、IP マスカレードも設定できました。例えば、次の例は、Hyper-V ホストの TCP ポート 3390 を、NAT の背後にある仮想マシンの TCP ポート 3389 (RDP) に IP マスカレードする例です。

New-NetFirewallRule -Name "NatRdpDemo" -DisplayName "NatRdpDemo" -Protocol TCP -LocalPort @(3390) -Action Allow
 

Add-NetNatStaticMapping -NatName VmNAT -Protocol TCP -ExternalPort 3390 -ExternalIPAddress 0.0.0.0 -InternalPort 3389 -InternalIPAddress 10.0.0.2

Hyper-V ホストの外部にあるリモートデスクトップ接続クライアントで、Hyper-V ホストの IP アドレス: 3390」を指定して接続すると、仮想マシンに接続できました。

あくまでも、Technical Preview 3 で私が勝手にやってみた話でした。正式リリースでこんな使い方ができるようになるのかは分かりません。

これまではクライアント Hyper-V では「インターネット接続の共有」を、サーバー Hyper-V では RRAS の機能を利用して、内部ネットワーク用の仮想スイッチで NAT 機能を実現するという方法がありましたが、 Windows Server 2016 Hyper-V ではもっと簡単になる“かも”です。

ちなみに、Windows 10 のクライアント Hyper-V の New-VMSwitch コマンドレットは、-SwitchType NAT に対応していません。将来のビルドではできるようになる“かも”しれません。


追記) こちら↓は Windows Server コンテナーに自動設定された IP アドレス。ネットワーク アダプターで DHCP は有効になっていますが、DHCP ではなく、マニュアル(Manual) で IP アドレスが設定されていました。

0 件のコメント: