Windows Serverコンテナーの作成時に仮想スイッチ「Virtual Switch」を指定すると、コンテナーはNATを介してコンテナーホストが接続される外部ネットワークにアクセスすることが可能になります(図1)。
仮想スイッチ「Virtual Switch」は、「ContainerNAT」というNAT構成とのペアでNAT機能を提供します。また、コンテナーのネットワークセキュリティは、コンテナーホストの「セキュリティが強化されたWindowsファイアウオール」が担います。
ちなみに、LinuxベースのDockerの場合は、Dockerが提供する「docker0」という名前のブリッジと、Linuxの「iptables」が同様のNAT機能を提供します(上記図1の右側点線内)。
仮想スイッチ「Virtual Switch」には、コンテナーホストと各コンテナーの仮想ネットワークアダプターが接続され、「172.16.0.0/12」の内部IPサブネットを構成します。コンテナーホストの仮想ネットワークアダプターには「172.16.0.1」が設定され、各コンテナーには「172.16.0.2」から順番にIPアドレスが割り当てられます(画面3)。
各コンテナーは「172.16.0.1」をデフォルトゲートウェイとし、コンテナーホストと同じDNS(Domain Name System)サーバーを参照して、コンテナーホストを介して外部と通信できます。
なお、コンテナーで「hostname」コマンドを実行すると、コンテナーホストと同じ名前を返します。これは、コンテナーがコンテナーホストとカーネルを共用していることに起因すると筆者は想像しています。
一方、コンテナーでコンピューター名をWMI(WMICまたはSysteminfo)から取得すると、別の名前を返します。WMI(Windows Management Instrumentation)は、Windows ServerコンテナーのベースOSイメージ(WindowsServerCore)のレジストリから取得したコンピューター名を返しているようです。
このように、コンテナーを名前で識別できず、コンテナー間のネットワーク接続も分離されていない状況は、Windows Serverコンテナーの確定した仕様ではなく、変更される可能性が高いと思います。
仮想スイッチ「Virtual Switch」とNATの構成「ContainerNAT」は、コンテナーホストのセットアップ時に「ContainerSetup.ps1」が作成したものです。具体的には、次の2つのコマンドラインで作成されたものです。
1 New-VMSwitch "Virtual Switch" -SwitchType NAT -NatSubnetAddress "172.16.0.0/12"
2 New-NetNat -Name ContainerNAT -InternalIPInterfaceAddressPrefix "172.16.0.0/12"
実は、「New-VMSwitch」コマンドレットは、Hyper-VのHyper-V仮想スイッチと共通のものです。Windows Serverコンテナーにネットワーク機能を提供しているのは、Hyper-Vのネットワーク機能なのです。
コンテナーホストに「Hyper-Vマネージャー」管理ツールを接続すると、コンテナー用の仮想スイッチ「Virtual Switch」が、Hyper-Vの内部タイプの仮想スイッチと同じように見えます(画面4)。コンテナーホストに仮想マシンが存在しないことにも注目してください。コンテナーがHyper-Vの仮想マシンではないということが分かるでしょう。
Windows Server 2012 R2以前のHyper-VやWindows 8.1/10の「クライアントHyper-V」のHyper-V仮想スイッチは、「外部(External)」「内部(Internal)」「プライベート(Private)」の3種類をサポートしていますが、Windows Server 2016 TP3の「New-VMSwitch」コマンドレットには新たに「NAT」という種類が追加されています。このNATタイプのHyper-V仮想スイッチと、NetNATモジュールによるNAT構成によって、NAT機能が実現されているようです。ちなみに、NetNATモジュールは、Windows Server 2012 R2およびWindows 8.1から利用可能です。
これまで、Hyper-VでNAT機能を実現しようとすると、Windows Serverの場合は「ルーティングとリモートアクセスサービス(RRAS)」、クライアントHyper-Vの場合は「インターネット接続の共有(ICS)」と、内部タイプのHyper-V仮想スイッチを組み合わせる方法がありました。あるいは、NAT機能を備えるHyper-V仮想マシンを使って、外部と内部のネットワークを橋渡しする方法もありました。
新しいNATタイプのHyper-V仮想スイッチは、Windows Serverコンテナーだけでなく、次期バージョンのHyper-V環境でも利用できるようになるかもしれません。筆者の個人ブログでそれが実現可能であることを検証していますので、興味のある方はぜひご覧ください。
Copyright © ITmedia, Inc. All Rights Reserved.