検索
連載

いまさら聞けないHyper-Vネットワークの詳細(2):仮想スイッチのVLAN機能今だからこそ学び直すHyper-V再入門(9)

本連載第8回から複数回に分けて、「Hyper-V」の仮想ネットワークに関する考え方やポイント、仮想スイッチや仮想ネットワークアダプターの設定といった、ネットワーク周りを学び直しています。今回は、仮想スイッチが提供する機能の中から「VLAN機能」を取り上げ、仮想ネットワークアダプターの設定とともに、その機能を見ていきます。

PC用表示 関連情報
Share
Tweet
LINE
Hatena
「今だからこそ学び直すHyper-V再入門」のインデックス

連載目次

Hyper-V仮想スイッチのVLAN機能とは

 「Hyper-V仮想スイッチ」の基本機能の一つに「VLAN機能」があります。VLANは「Virtual Local Area Network」の略で、物理的なネットワークにとらわれず、論理的にネットワークを分離する機能です。

 なお、VLANの詳細については、以下の@ITの記事で説明されているので参考にしてください。

 Hyper-Vの仮想スイッチはネットワークスイッチの動作を規定する規格「IEEE 802.1Q」に対応しており、イーサネットフレームヘッダにVLAN IDを記述した「VLANタグ」を付与して物理ネットワークにイーサネットフレームを送出したり、物理ネットワークからVLANタグ付きのイーサネットフレームを受け取り、イーサネットフレームヘッダで指定されたVLAN IDと同じVLANに属する仮想マシン(VM)にイーサネットフレームを転送したりできます。

 Hyper-V仮想スイッチは物理ネットワークのスイッチと同様、単一のポート(仮想ネットワークアダプター)に対してVLANを設定することもできれば、ポート(仮想ネットワークアダプター)に対して複数のVLANを束ねて(トランクして)イーサネットフレームを送出することも可能です(VLANトランク)。

 既定値は「VLANタグ付与なし(Untagged)/アクセスポート」設定になります。この設定は、VLANタグを付与せずにイーサネットフレームを送出する、という動きになります。

 タグが付与されていないイーサネットフレームを受け取った物理スイッチは、多くの場合「ネイティブVLAN」と呼ばれる“タグなしVLAN”に属していると見なし、ネイティブVLANに設定されているVLANでイーサネットフレームを取り扱います。

 Hyper-V仮想スイッチもタグが付与されていないイーサネットフレームは、タグなしのイーサネットフレームとして取り扱い、タグが付与されているイーサネットフレームはタグに記述されているIDのVLANで取り扱われるので、タグが付いていなくても「タグが付いていないVLAN」で取り扱われるということを覚えておきましょう。

 さて、仮想マシンのVLAN IDをどこで設定するかというと、本連載第5回「いまさら聞けないHyper-V仮想マシンの構成詳細(2):ハードウェア設定[後編]」でも触れた通り、「仮想マシンの仮想ネットワークアダプター」で設定します(画面1)。

ALT
画面1 仮想ネットワークアダプターの設定

 設定画面の「VLAN ID」の項にある「仮想LANを有効にする」のチェックボックスをオンにしてVLAN IDを設定すると、仮想マシンが送出するイーサネットフレームに指定したVLAN IDを記述したVLANタグが付与されます。

 画面1のようにVLAN IDとして「110」を設定すると、この仮想マシンが送出するイーサネットフレームには仮想スイッチで「VLAN ID110」のVLANタグが付与されます。そのため、同じ仮想スイッチに接続した仮想マシンであっても、同じVLANに属していなければ(VLANが「110」に設定されていなければ)通信できません。これはHyper-Vホストが接続している物理ネットワーク上のノードも同様で、VLAN110に属していなければこの仮想マシンと通信できません。

 VLANを設定後、「Hyper-Vマネージャー」管理ツールでこの仮想マシンを選択して「ネットワーク」タブを表示してみます(画面2)。

ALT
画面2 VLANを設定した仮想マシンの「ネットワーク」情報

 仮想ネットワークアダプターに「アクセスモード VLAN110」とVLAN情報が付加されており、当該ネットワークアダプターには「VLAN ID110」が設定されていることが分かります。

 なお、VLANを設定していない仮想ネットワークアダプターは、画面2の「Private vSwitch」に接続している仮想ネットワークアダプターのように、VLAN設定に関する付加情報はありません。何も情報がない場合は「VLANタグ付与なし(Untagged)」設定となり、その仮想ネットワークアダプターのイーサネットフレームはタグなしVLANで取り扱われます。

 画面2の「External vSwitch」に接続している仮想ネットワークアダプターに設定されている「アクセスモード」は、仮想ネットワークアダプターの設定として単一のVLANを使用する設定であることを示しています。このモードの場合、仮想マシンのゲストOSでは特にVLANは設定されず、VLANタグ付与の処理は全て仮想スイッチで実施されます。

 この場合、送出されるイーサネットフレームのイメージは図1のようになります。

ALT
図1 仮想スイッチでVLANタグを付与して送出

 実際のイーサネットフレームを見てみると、「802.1Q」のタグが付与され、設定されたVLAN IDが記述されていることが分かります(画面3)。

ALT
画面3 イーサネットフレームにVLANタグが挿入され、VLAN IDが記述されている

 VLANを設定しない場合は、タグなしのイーサネットフレームが送出されるため、画面4のようにVLANタグは付与されていない(802.1Qの4バイトのタグが存在しない)ことが分かります。

ALT
画面4 VLAN IDを設定しない場合は、イーサネットフレームにはタグが付与されない

 また、「アクセスモード」の他にも「トランクモード」というモードがあり、こちらは例えば仮想マシンのゲストOS側でVLANを設定したい場合に使用します。

 トランクモードで設定した仮想ネットワークアダプターには画面5のように「トランクモード」と明記され、トランクされているVLAN IDが表示されます。

ALT
画面5 「トランクモード」の仮想ネットワークアダプターの表示

 アクセスモードに設定されている、もしくはVLAN IDを設定していない仮想ネットワークアダプターに対してゲストOS側でVLANタグを付与した場合、Hyper-V仮想スイッチではVLANタグが付与されたイーサネットフレームが処理されず、結果として通信エラーが発生します。

 こうしたシナリオは「ネスト(入れ子)構成のHyper-V」などで起こり得えますが、トランクモードに設定することで、ゲストOSが付与したVLANタグを信頼して処理するため、正常に通信できます。

メモ

 「ネスト(入れ子)構成のHyper-V」については、Microsoftのドキュメントを参照してください。


 送出されるイーサネットフレームのイメージは図2のようになります。

ALT
図2 トランクモードの場合、ゲストOSは付与したVLANタグをそのまま処理する

 ここまで仮想マシンと仮想スイッチ間のVLAN設定について説明してきましたが、仮想スイッチと物理スイッチを接続する際の設定はどのようになるのでしょうか。

 結論からいえば、物理スイッチ側でいつも通りのVLANを設定するだけで完了します。例として、図3のようにHyper-Vホスト上の仮想マシンに設定されるVLAN IDが「VLAN 110」「VLAN 115」「VLAN 120」の3つのVLANが必要だった場合を想定します(図3)。

ALT
図3 仮想マシンで設定されているVLAN ID例

 この場合は、物理スイッチ側でVLAN110、VLAN115、VLAN120をトランクするように設定するだけで完了です。仮想スイッチのアップリンクポートとしての設定は特に必要ありません。

 一般的なエンタープライズ向け物理スイッチの場合は、以下のような設定になります。

interface GigabitEthernet1/0/1
 switchport trunk encapsulation dot1q
 switchport trunk allowed vlan 110,115,120
 switchport mode trunk

 タグなしのイーサネットフレームを特定のVLANで受けたい場合は、「switchport trunk native vlan」コマンドでVLANを設定してください。

メモ

 仮想スイッチのアップリンクとして使用している物理ネットワークアダプターのVLAN機能をオフにすると、VLANを使用した通信ができなくなる場合があるので注意が必要です(画面6)。

ALT
画面6 物理ネットワークアダプターの詳細設定でVLAN機能をオフにしないように注意

 なお、VLANは仮想スイッチの接続先を問わずに使用可能です。これまでは外部仮想スイッチでの利用例を紹介してきましたが、内部仮想スイッチやプライベート仮想スイッチでもVLANは使用できます。内部仮想スイッチに接続された仮想マシン同士でも、異なるVLAN IDが仮想ネットワークアダプターに割り当てられていた場合には通信できませんし、プライベート仮想スイッチの場合でも同様です(画面7)。

ALT
画面7 接続する仮想スイッチがプライベート仮想スイッチでもVLANは使用可能

 内部仮想スイッチやプライベート仮想スイッチは複数作成できるので、VLANで論理分割して運用するようなユースケースは少ないとは思いますが、外部仮想スイッチと同じように運用したいというニーズがあった場合には、内部向けの2つの仮想スイッチでもVLANが使用できるという点を思い出してください。

Hyper-V仮想スイッチのVLAN設定方法

 Hyper-V仮想スイッチでVLANを設定する方法は、従前説明した通り、仮想ネットワークアダプターで設定することで、仮想スイッチ側に反映されます。

 前項でVLAN設定には「アクセスモード」と「トランクモード」の2つがあると解説しましたが、アクセスモードでのVLAN設定はGUI(グラフィカルユーザーインタフェース)の管理ツールである「Hyper-Vマネージャー」を使用して設定できますし、またWindows PowerShellでも設定可能です。

 Hyper-Vマネージャーで設定する場合は、画面1でも例示した通り、仮想マシンの仮想ネットワークアダプターの設定画面でVLAN IDを設定します。

 Windows PowerShellで設定する場合は「Set-VMNetworkAdapterVlan」コマンドレットを使用します(画面8)。

$vnic = Get-VMNetworkAdapter -VMName Test-VM13 -Name "FrontNIC"
Set-VMNetworkAdapterVlan -VMNetworkAdapter $vnic -Access -VlanId 110
ALT
画面8 Set-VMNetworkAdapterVlanコマンドレットで仮想ネットワークアダプターのVLAN設定を変更した

 画面8では、Set-VMNetworkAdapterVlanコマンドレット実行前後で「Get-VMNetworkAdapterVlan」コマンドレットを実行してVLANの設定状況を確認しています。VLAN ID 110からVLAN ID 120へ変更されていることが分かります。

 今回はアクセスモードでのVLAN IDの設定(変更)であるため、「-Access」オプションを使用してアクセスモードであることを指定しています。

 もう1つのモード「トランクモード」は、GUIでは設定できず、Windows PowerShellでの設定になります。

 使用するコマンドレットはアクセスモードと同様、Set-VMNetworkAdapterVlanコマンドレットになりますが、トランクモードなので「-Trunk」オプションを使用します(画面9)。

$vnic = Get-VMNetworkAdapter -VMName Test-VM11
Set-VMNetworkAdapterVlan -VMNetworkAdapter $vnic -Trunk -AllowedVlanIdList 110-120 -NativeVlanId 0
ALT
画面9 Set-VMNetworkAdapterVlanコマンドレットで仮想ネットワークアダプターのVLAN設定をトランクモードへ変更した

 画面9の設定では、VLAN110〜VLAN120までをトランクし、タグなしのイーサネットフレームはそのままタグを付与せずに送出する設定になっています。「-NativeVlanId」オプションがタグなしのイーサネットフレームにVLAN IDを付与する設定となっており、例えば「-NativeVlanId 10」とすると、仮想マシンから送出されるタグなしのイーサネットフレームに対して仮想スイッチがVLAN ID 10のタグを付与し、物理スイッチに渡すことになります。

 Hyper-V仮想スイッチからトランクモードでタグなしのイーサネットフレームを送出したい場合には、「-NativeVlanId 0」と設定するという点を覚えておいてください。

Hyper-V仮想スイッチのプライベートVLAN(PVLAN)機能

 ここまで説明してきたVLAN機能が一般的なVLANの利用形態かと思いますが、Hyper-V仮想スイッチは「プライベートVLAN(PVLAN)」もサポートしており、より大規模なVLAN運用にも対応可能です。

 「プライベート」という文言から、仮想スイッチの種類である「プライベート仮想スイッチ」とよく混同されますが、PVLANとプライベート仮想スイッチは全く関係ないものになるので注意してください。

 あらためてプライベートVLANとは、「プライマリーVLAN」と「セカンダリーVLAN」の2つのVLANをペアとして使用し、同じプライマリーVLANに属している仮想マシン間であってもセカンダリーVLANのモード(分離モード、コミュニティーモード)によって通信の可否が決まるVLANの利用形態です。

 身近なユースケースでは、ホテルの客室ネットワークやマンションの居室ネットワークなどがあります。

 例えば、図4のようなマルチテナントな仮想マシンネットワークを想定します。

ALT
図4 マルチテナントネットワーク例

 インターネットと通信するためのプロキシサーバには、全てのテナントの仮想マシンと通信を可能にしたいが、個々の会社用のVLAN間は通信をNGにしたい。しかし、同一の会社用VLANの間は通信可能にしたい。これをIP通信(L3)のレイヤーではなく、VLAN(L2)で実現したい、という場合にPVLANを使用します。

 考え方としては、まずネットワークの立て付けを以下のように整理します。

  • このネットワーク全体をVLAN ID 100で利用する(プライマリーVLAN)
  • A社とB社は仮想マシンが1台だけなので、相互通信不可の条件の下、同じVLAN(VLAN ID 200)を設定する(セカンダリーVLANはVLAN 200/PVLANのモードは分離(Isolated)モード)
  • C社は仮想マシンが複数あるので、専用のVLAN(VLAN ID 201)を切り出し、C社の仮想マシンのみで利用する(セカンダリーVLANはVLAN 201/PVLANのモードはコミュニティー(Community)モード)
  • プロキシサーバは全てのVLANと通信可能(セカンダリーVLANはVLAN 200-201/PVLANのモードは無作為検出(Promiscuous)モード)

 セカンダリーVLANにPVLANのモードを設定することで、仮想マシン間の相互通信の可否が決定されます。分離(Isolated)モードが基本ですが、相互通信を例外的に許可したい場合にコミュニティーモードを利用する、という考え方でよいでしょう。

 また、全セカンダリーVLANの仮想マシンと通信したいサーバ、例えば監視サーバや図4の例のようなネットワークの中継サーバに対してのみ無作為検出(Promiscuous)モードを利用する、と覚えておいてください。

 VLAN数の上限は4094個です。図4のようなネットワークで個社にVLANを割り当てていくとあっという間に上限に達してしまうので、大規模なネットワークではVLANを利用するにしてもいろいろと考慮する必要があります。

 そうした場合にPVLANを使用することで、少ないVLAN数で大規模ネットワークを構築できます。PVLANのユースケースは少ないと思いますが、そうした機能もHyper-V仮想スイッチは備えているということを覚えておいてください。

Hyper-V仮想スイッチのPVLAN設定方法

 PVLANを設定する場合は、Windows PowerShellを使用します。使用するコマンドレットは、VLAN設定の項でも紹介したSet-VMNetworkAdapterVlanコマンドレットです。

 図4をPVLANの設定として、仮想マシン名と設定を追加して書き直すと図5のようになります。

ALT
図5 PVLAN設定例

 全ての仮想マシンの仮想ネットワークアダプターは1つのみ接続されていることを前提とし、図5のようなPVLANをWindows PowerShellで設定します。

 仮想ネットワークアダプターが複数接続された仮想マシンに対して設定する場合、Get-VMNetworkAdapterコマンドレット実行時にオプションを使用して仮想ネットワークアダプターを特定するようにしてください。

 なお、Get-VMNetworkAdapterコマンドレットについては別連載「Windows PowerShell基本Tips」の第135回を参照してください。

 まず、分離モードの「Acorp-VM」と「Bcorp-VM」を設定します(画面10)。

$acorpvmvnic = Get-VMNetworkAdapter -VMName Acorp-VM
$bcorpvmvnic = Get-VMNetworkAdapter -VMName Bcorp-VM
Set-VMNetworkAdapterVlan -VMNetworkAdapter $ acorpvmvnic -Isolated -PrimaryVlanId 100 -SecondaryVlanId 200
Set-VMNetworkAdapterVlan -VMNetworkAdapter $ bcorpvmvnic -Isolated -PrimaryVlanId 100 -SecondaryVlanId 200
ALT
画面10 Set-VMNetworkAdapterVlanコマンドレットで仮想マシン2台に隔離モードでPVLANを設定した

 画面10ではGet-VMNetworkAdapterコマンドレットで、対象の仮想マシンが全て同一の仮想スイッチに接続されていることを確認し、Get-VMNetworkAdapterVlanコマンドレットでAcorp-VMとBcorp-VMのVLAN設定(モード)が既定値の「タグなし(Untagged)」であることを確認しています。

 Set-VMNetworkAdapterVlanコマンドレットを実行すると、モードが「分離(Isolated)」に変更され、VLANが100と200に設定されました。

 Hyper-Vマネージャーから設定した仮想マシンのネットワークの情報タブを見ると、画面11のようにモードと設定されたVLAN情報が記述されます。

ALT
画面11 Hyper-Vマネージャーからネットワーク情報を確認すると、VLANモード(プライベート分離)とプライマリーVLAN/セカンダリーVLAN情報が表示される

 続いて、Ccorp-VM01とCcorp-VM02をコミュニティーモードに設定します(画面12)。

$ccorp01vmvnic = Get-VMNetworkAdapter -VMName Ccorp-VM01
$ccorp02vmvnic = Get-VMNetworkAdapter -VMName Ccorp-VM02
Set-VMNetworkAdapterVlan -VMNetworkAdapter $ccorp01vmvnic -Community -PrimaryVlanId 100 -SecondaryVlanId 201
Set-VMNetworkAdapterVlan -VMNetworkAdapter $ccorp02vmvnic -Community -PrimaryVlanId 100 -SecondaryVlanId 201
ALT
画面12 Set-VMNetworkAdapterVlanコマンドレットで仮想マシン2台にコミュニティーモードでのPVLANを設定した

 画面12の通り、Set-VMNetworkAdapterVlanコマンドレット実行後はモードが「コミュニティー(Community)」に変更されていることが分かります。

 最後にProxyVMを「無作為検出(Promiscuous)」モードに設定します(画面13)。

$proxyvmvnic = Get-VMNetworkAdapter -VMName ProxyVM
Set-VMNetworkAdapterVlan -VMNetworkAdapter $proxyvmvnic -Promiscuous -PrimaryVlanId 100 -SecondaryVlanIdList 200-201
ALT
画面13 Set-VMNetworkAdapterVlanコマンドレットで仮想マシン1台に無作為検出モードでのPVLANを設定した

 では、動作を確認してみましょう。まず、Acorp-VMから疎通確認してみます(画面14)。

ALT
画面14 Acorp-VMからはProxyVMのみ通信が可能であることを確認した

 同じセカンダリーVLANに所属しているBcorp-VMや、違うセカンダリーVLANであるCcorp-VM01へは「Ping」コマンドは到達不可でした。ARP(Address Resolution Protocol)テーブルを参照すると「192.168.50.250(ProxyVM)」のテーブルが存在するので、想定通りの挙動であることが分かります。

 次にCcorp-VM01で確認してみます(画面15)。

ALT
画面15 Ccorp-VM01はコミュニティーモードなので、Ccorp-VM02とProxyVMは通信可能であることを確認した

 同じセカンダリーVLANであるCcorp-VM02とは疎通可能で、またProxyVMのARPは取得できていることから通信可能であることが確認できました。これも想定通りです。

 最後に無作為検出(Promiscuous)モードであるProxyVMのarpテーブルを確認すると、今回設定した全ての仮想マシンのMAC(Media Access Control)アドレスが登録されており、通信可能であることが分かります(画面16)。

ALT
画面16 無作為検出モードのProxyVMは全ての仮想マシンと通信可能

 PVLANは同一のHyper-Vホスト上だけではなく、異なるHyper-Vホスト上の仮想マシンでもPVLANを設定し、物理ネットワーク上で適切に通信ができるようにVLANを設定することで、同一のPVLANのネットワークを構築可能です。

 画面17は、host39上でCcorp-VM01と同じPVLANを設定した仮想マシンからの疎通確認結果になります。

ALT
画面17 異なるホスト上の仮想マシンでも同一のPVLANに接続可能

 疎通確認対象は全てhost33上の仮想マシンになります。コミュニティーモードのため、VLAN201の仮想マシンとは通信が可能ですが、隔離モードのVLAN200の仮想マシンとは通信不可、無作為検出モードのProxyVMとは通信可能と、画面15のコミュニティーモードに設定した仮想マシンの疎通確認と同じ結果が得られました。

 なお、PVLANは汎用(はんよう)的な技術であるため、ネットワーク機器(物理ルーターやファイアウォールなど)がPVLANに対応していれば、VLAN IDやモードをそろえることで物理機器と仮想マシンで同一のPVLANのネットワークを構築可能です。

 今回は、Hyper-V仮想スイッチのVLAN機能と設定方法について見てきました。次回は仮想スイッチが提供する「QoS(Quality of Service)」やセキュリティ機能について、仮想ネットワークアダプターの設定と照らし合わせながら、その詳細を見ていきます。

筆者紹介

後藤 諭史(ごとう さとし)

株式会社ネットワールド所属。Microsoft MVP for Cloud and Datacenter Management(2012-2026)。現業の傍ら、コミュニティーイベントでの登壇や著作にてMicrosoftテクノロジーに関する技術情報の発信、共有を続けている。ネットワークやハードウェアといった物理層に近いところが大好きな、昔ながらのインフラ屋さん。得意技はケーブル整線。近著は『詳解! Windows Server仮想ネットワーク』(日経BP社)。


Copyright © ITmedia, Inc. All Rights Reserved.