本連載第8回から複数回に分けて、「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)。
設定画面の「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)。
仮想ネットワークアダプターに「アクセスモード VLAN110」とVLAN情報が付加されており、当該ネットワークアダプターには「VLAN ID110」が設定されていることが分かります。
なお、VLANを設定していない仮想ネットワークアダプターは、画面2の「Private vSwitch」に接続している仮想ネットワークアダプターのように、VLAN設定に関する付加情報はありません。何も情報がない場合は「VLANタグ付与なし(Untagged)」設定となり、その仮想ネットワークアダプターのイーサネットフレームはタグなしVLANで取り扱われます。
画面2の「External vSwitch」に接続している仮想ネットワークアダプターに設定されている「アクセスモード」は、仮想ネットワークアダプターの設定として単一のVLANを使用する設定であることを示しています。このモードの場合、仮想マシンのゲストOSでは特にVLANは設定されず、VLANタグ付与の処理は全て仮想スイッチで実施されます。
この場合、送出されるイーサネットフレームのイメージは図1のようになります。
実際のイーサネットフレームを見てみると、「802.1Q」のタグが付与され、設定されたVLAN IDが記述されていることが分かります(画面3)。
VLANを設定しない場合は、タグなしのイーサネットフレームが送出されるため、画面4のようにVLANタグは付与されていない(802.1Qの4バイトのタグが存在しない)ことが分かります。
また、「アクセスモード」の他にも「トランクモード」というモードがあり、こちらは例えば仮想マシンのゲストOS側でVLANを設定したい場合に使用します。
トランクモードで設定した仮想ネットワークアダプターには画面5のように「トランクモード」と明記され、トランクされているVLAN IDが表示されます。
アクセスモードに設定されている、もしくはVLAN IDを設定していない仮想ネットワークアダプターに対してゲストOS側でVLANタグを付与した場合、Hyper-V仮想スイッチではVLANタグが付与されたイーサネットフレームが処理されず、結果として通信エラーが発生します。
こうしたシナリオは「ネスト(入れ子)構成のHyper-V」などで起こり得えますが、トランクモードに設定することで、ゲストOSが付与したVLANタグを信頼して処理するため、正常に通信できます。
送出されるイーサネットフレームのイメージは図2のようになります。
ここまで仮想マシンと仮想スイッチ間のVLAN設定について説明してきましたが、仮想スイッチと物理スイッチを接続する際の設定はどのようになるのでしょうか。
結論からいえば、物理スイッチ側でいつも通りのVLANを設定するだけで完了します。例として、図3のようにHyper-Vホスト上の仮想マシンに設定されるVLAN IDが「VLAN 110」「VLAN 115」「VLAN 120」の3つのVLANが必要だった場合を想定します(図3)。
この場合は、物理スイッチ側で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)。
なお、VLANは仮想スイッチの接続先を問わずに使用可能です。これまでは外部仮想スイッチでの利用例を紹介してきましたが、内部仮想スイッチやプライベート仮想スイッチでもVLANは使用できます。内部仮想スイッチに接続された仮想マシン同士でも、異なるVLAN IDが仮想ネットワークアダプターに割り当てられていた場合には通信できませんし、プライベート仮想スイッチの場合でも同様です(画面7)。
内部仮想スイッチやプライベート仮想スイッチは複数作成できるので、VLANで論理分割して運用するようなユースケースは少ないとは思いますが、外部仮想スイッチと同じように運用したいというニーズがあった場合には、内部向けの2つの仮想スイッチでも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
画面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
画面9の設定では、VLAN110〜VLAN120までをトランクし、タグなしのイーサネットフレームはそのままタグを付与せずに送出する設定になっています。「-NativeVlanId」オプションがタグなしのイーサネットフレームにVLAN IDを付与する設定となっており、例えば「-NativeVlanId 10」とすると、仮想マシンから送出されるタグなしのイーサネットフレームに対して仮想スイッチがVLAN ID 10のタグを付与し、物理スイッチに渡すことになります。
Hyper-V仮想スイッチからトランクモードでタグなしのイーサネットフレームを送出したい場合には、「-NativeVlanId 0」と設定するという点を覚えておいてください。
ここまで説明してきたVLAN機能が一般的なVLANの利用形態かと思いますが、Hyper-V仮想スイッチは「プライベートVLAN(PVLAN)」もサポートしており、より大規模なVLAN運用にも対応可能です。
「プライベート」という文言から、仮想スイッチの種類である「プライベート仮想スイッチ」とよく混同されますが、PVLANとプライベート仮想スイッチは全く関係ないものになるので注意してください。
あらためてプライベートVLANとは、「プライマリーVLAN」と「セカンダリーVLAN」の2つのVLANをペアとして使用し、同じプライマリーVLANに属している仮想マシン間であってもセカンダリーVLANのモード(分離モード、コミュニティーモード)によって通信の可否が決まるVLANの利用形態です。
身近なユースケースでは、ホテルの客室ネットワークやマンションの居室ネットワークなどがあります。
例えば、図4のようなマルチテナントな仮想マシンネットワークを想定します。
インターネットと通信するためのプロキシサーバには、全てのテナントの仮想マシンと通信を可能にしたいが、個々の会社用のVLAN間は通信をNGにしたい。しかし、同一の会社用VLANの間は通信可能にしたい。これをIP通信(L3)のレイヤーではなく、VLAN(L2)で実現したい、という場合にPVLANを使用します。
考え方としては、まずネットワークの立て付けを以下のように整理します。
セカンダリーVLANにPVLANのモードを設定することで、仮想マシン間の相互通信の可否が決定されます。分離(Isolated)モードが基本ですが、相互通信を例外的に許可したい場合にコミュニティーモードを利用する、という考え方でよいでしょう。
また、全セカンダリーVLANの仮想マシンと通信したいサーバ、例えば監視サーバや図4の例のようなネットワークの中継サーバに対してのみ無作為検出(Promiscuous)モードを利用する、と覚えておいてください。
VLAN数の上限は4094個です。図4のようなネットワークで個社にVLANを割り当てていくとあっという間に上限に達してしまうので、大規模なネットワークではVLANを利用するにしてもいろいろと考慮する必要があります。
そうした場合にPVLANを使用することで、少ないVLAN数で大規模ネットワークを構築できます。PVLANのユースケースは少ないと思いますが、そうした機能もHyper-V仮想スイッチは備えているということを覚えておいてください。
PVLANを設定する場合は、Windows PowerShellを使用します。使用するコマンドレットは、VLAN設定の項でも紹介したSet-VMNetworkAdapterVlanコマンドレットです。
図4をPVLANの設定として、仮想マシン名と設定を追加して書き直すと図5のようになります。
全ての仮想マシンの仮想ネットワークアダプターは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
画面10ではGet-VMNetworkAdapterコマンドレットで、対象の仮想マシンが全て同一の仮想スイッチに接続されていることを確認し、Get-VMNetworkAdapterVlanコマンドレットでAcorp-VMとBcorp-VMのVLAN設定(モード)が既定値の「タグなし(Untagged)」であることを確認しています。
Set-VMNetworkAdapterVlanコマンドレットを実行すると、モードが「分離(Isolated)」に変更され、VLANが100と200に設定されました。
Hyper-Vマネージャーから設定した仮想マシンのネットワークの情報タブを見ると、画面11のようにモードと設定された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
画面12の通り、Set-VMNetworkAdapterVlanコマンドレット実行後はモードが「コミュニティー(Community)」に変更されていることが分かります。
最後にProxyVMを「無作為検出(Promiscuous)」モードに設定します(画面13)。
$proxyvmvnic = Get-VMNetworkAdapter -VMName ProxyVM Set-VMNetworkAdapterVlan -VMNetworkAdapter $proxyvmvnic -Promiscuous -PrimaryVlanId 100 -SecondaryVlanIdList 200-201
では、動作を確認してみましょう。まず、Acorp-VMから疎通確認してみます(画面14)。
同じセカンダリーVLANに所属しているBcorp-VMや、違うセカンダリーVLANであるCcorp-VM01へは「Ping」コマンドは到達不可でした。ARP(Address Resolution Protocol)テーブルを参照すると「192.168.50.250(ProxyVM)」のテーブルが存在するので、想定通りの挙動であることが分かります。
次にCcorp-VM01で確認してみます(画面15)。
同じセカンダリーVLANであるCcorp-VM02とは疎通可能で、またProxyVMのARPは取得できていることから通信可能であることが確認できました。これも想定通りです。
最後に無作為検出(Promiscuous)モードであるProxyVMのarpテーブルを確認すると、今回設定した全ての仮想マシンのMAC(Media Access Control)アドレスが登録されており、通信可能であることが分かります(画面16)。
PVLANは同一のHyper-Vホスト上だけではなく、異なるHyper-Vホスト上の仮想マシンでもPVLANを設定し、物理ネットワーク上で適切に通信ができるようにVLANを設定することで、同一のPVLANのネットワークを構築可能です。
画面17は、host39上でCcorp-VM01と同じ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.