いまさら聞けないHyper-Vネットワークの詳細(3):仮想スイッチのQoS機能/アクセス制御機能:今だからこそ学び直すHyper-V再入門(10)
本連載第8回から複数回に分けて、「Hyper-V」の仮想ネットワークに関する考え方やポイント、仮想スイッチや仮想ネットワークアダプターの設定といった、ネットワーク周りを学び直しています。今回は、仮想スイッチが提供する機能の中から「QoS機能」とセキュリティ機能の一つである「アクセス制御リスト機能」を取り上げ、仮想ネットワークアダプターの設定とともに、その機能を見ていきます。
Hyper-V仮想スイッチのQoS機能とは
「Hyper-V仮想スイッチ」の基本機能の一つに「QoS(Quality of Service)機能」があります。
QoSは“ネットワーク上で提供されるサービス品質”を指しますが、ある特定の通信を優先したり、特定の条件を満たすよう通信帯域を制御したりと、「ネットワーク上での通信の品質を保証するため仕組み」と言い換えることもできます。
QoSについては、本サイトの以下の記事も参考になります。
- QoS - ネットワーク用語事典(@IT)
ビデオ会議や音声チャット、IP電話など、ネットワークを利用するリアルタイム通信にはQoSは必要不可欠ともいえる機能で、そうしたサービスを利用している物理ネットワークの構成機器では必ずといっていいほど実装されています。
Hyper-Vの仮想スイッチでもQoS機能は提供されており、以下の2つの制御方式でのQoSを仮想マシンに対して提供しています。
- 最小帯域幅保証:ネットワークが混み合っている場合でも、最低帯域を保証する機能
- 最大帯域幅制御:仮想マシンに対して利用可能な帯域の上限を割り当てる機能
これらは仮想マシンに対して提供されるQoS機能ですが、ホストOSと物理ネットワーク機器が協調して動作する「ECN(Explicit Congestion Notification)マーキング」、日本語では「明示的輻輳(ふくそう)通知」と称される、スイッチのバッファーリソースが枯渇しないようにトラフィックを制御する機能も有しています。
ここでは、仮想マシンに対するQoS機能である「最小帯域幅保証」と「最大帯域幅制御」について取り扱いますが、これらをどこで設定するかというと、本連載第5回でも触れた通り、仮想マシンの「仮想ネットワークアダプター」で設定します(画面1)。
設定画面の「帯域幅管理」の項にある「帯域幅管理を有効にする」のチェックボックスをオンにして最小帯域幅、もしくは最大帯域幅を「Mbps」単位で指定、例えば画面1のように最大帯域幅「100」Mbpsと設定することで、その仮想マシンが利用できるネットワーク帯域を100Mbpsに絞り込めます。
画面2は、ファイルコピー中に最大帯域幅を100Mbpsに設定した例(帯域幅管理はオンラインで設定変更可能です)となりますが、設定する直前まで1Gbps近くまで出ていたスループットが、設定直後から100Mbps前後に抑え込まれていることが分かります。
最小帯域幅についても同様で、同じ仮想スイッチに接続された3台の仮想マシンで同時にファイルコピーを実施、設定しない状態では300Mbps程度だったスループットが、最小帯域幅500Mbpsに変更した時点でスループットが設定値の500Mbps以上になっていることが確認できました(画面3)。最小帯域幅は最小値を指定しているため、それ以上の帯域が空いていれば通常通り使用します。
500Mbpsという値は極端ですが、他の仮想マシンが大量のトラフィックを流したとしても、最低限帯域を確保したいという場合にこの設定は有効です。
最小帯域幅は仮想マシンごとに設定されますが、割り当てた帯域幅の合計は仮想スイッチ内で評価されます。同一の仮想スイッチに接続された仮想マシンの最小帯域幅の合計は、仮想スイッチに接続された物理ネットワークアダプターの帯域によって制限されます。
例えば、1Gbpsの物理ネットワークアダプターをアップリンクとする仮想スイッチに接続された4台の仮想マシンに対し、全て500Mbpsといった設定はできません。これは合計帯域が2000Mbpsとなってしまい、物理ネットワークアダプターの帯域を超えてしまうためです。リソースを超過して割り当てた場合は、画面4のようなリソース超過エラーが発生し、設定できません。
最小帯域幅として設定可能なリソースは、物理ネットワークアダプターの帯域から仮想スイッチに設定されている「DefaultFlowMinimumBandwidthAbsolute」に設定されている値を引いたものになります。この値の既定値(デフォルト)は物理ネットワークアダプターの帯域の10%なので、1Gbpsのネットワークアダプターの場合は100Mbpsになります。
従って、1Gbpsのアップリンクを持つ既定値の仮想スイッチであれば、割り当て可能な帯域は900Mbpsになります。
デフォルトフローの帯域を変更する場合は、Windows PowerShellの「Set-VMSwitch」コマンドレットを使用します。Set-VMSwitchコマンドレットについては、別連載「Windows PowerShell基本Tips」の第128回を参照してください。
どうしても各仮想マシンに対して500Mbpsの最小帯域幅を割り当てたい(物理ネットワークアダプターの帯域以上を割り当てたい)場合は、仮想スイッチのアップリンクを10Gbpsの物理ネットワークアダプターに変更するなどの対応が必要になります。
最小帯域幅の設定は、前述のように帯域幅を数値で指定する「絶対値(Absolute)」モードと、重み付けで優先度を設定する「重み付け(Weight)」モードの2つがあります。
絶対値モードは画面3のように最低帯域幅を「bps」単位で指定しますが、重みのモードは「0〜100」の間の数値で指定します。
重み付けモードの場合、重みに従って仮想マシンに対して帯域を割り当てていくので、絶対値のように仮想スイッチ全体の容量を厳密に計算しながら値を設定する必要はありません。MicrosoftのQoSに関するガイドラインでは「重みの合計が100未満」になるように割り当てを調整すればよい、とされています。
最小帯域幅について、上記ドキュメントでは絶対値(Absolute)ではなく、重み付け(Weight)での指定が推奨であると記述されています。
理由は絶対値指定の場合は、厳密に合計帯域を管理しなければ設定したタイミングでエラーが発生するだけでなく、別の回で解説しますが、仮想マシンが別のホストに移動を試みた際、移動先のHyper-Vホスト(仮想スイッチ)に設定された最小帯域幅を充足する帯域が空いていなかった場合、仮想マシンの移動に失敗するためです。こうした点も考慮しながら、QoS設定を行う必要があります。
なお、QoSによる最大帯域幅/最小帯域幅の設定は、イグレス方向(仮想マシンから見てアウトバウンド方向)のトラフィックにしか効かない点に注意が必要です。
画面2や画面3は、仮想マシンからネットワーク上のノードにファイルをアップロードした際(トラフィックとしてはアウトバウンド方向)の画面になっています。仮想マシンへファイルをダウンロードした場合は、トラフィックを受ける側(イングレス方向〈インバウンド方向〉)になるため、ファイル(トラフィック)を送出する側がQoS設定を行っていなければ、帯域制限を受けることはありません(画面5)。
なお、レガシーネットワークアダプターでは画面6の通り、帯域幅管理が表示されないので、QoSは設定できません。
レガシーネットワークアダプターを使用しなければならないシナリオは多くないと思いますが、仕様として覚えておいた方がよいでしょう。
Hyper-V仮想スイッチのQoS設定方法
Hyper-V仮想スイッチでのQoS設定は2段階になります。
1段階目は仮想スイッチ作成の際に「最小帯域幅の設定方法」を指定します。
GUI(グラフィカルユーザーインタフェース)ツールである「Hyper-Vマネージャー」から仮想スイッチを作成した場合は、最小帯域幅の指定方法はデフォルトの「絶対値(Absolute)」になります。
最小帯域幅の指定方法を「重み付け(Weight)」にしたい場合は、Windows PowerShellの「New-VMSwitch」コマンドレットで「-MinimumBandwidthMode」オプションを併用して仮想スイッチを作成する必要があります(画面7)。
New-VMSwitch -Name "Weight vSwitch" -NetAdapterName "イーサネット 3" -AllowManagementOS $false -MinimumBandwidthMode Weight
New-VMSwitchコマンドレットの詳細については別連載「Windows PowerShell基本Tips」の第127回を参照してください。
New-VMSwitchコマンドレットで「絶対値(Absolute)」モードの仮想スイッチを作成する場合は、「-MinimumBandwidthMode」オプション「Absolute」を指定しますが、「-MinimumBandwidthMode」オプション使用しなければ既定値で「Absolute」が採用されます。
仮想スイッチの設定が完了したら、2段階目となる実際のQoS設定になります。
QoS設定は仮想ネットワークアダプターに対しての実施となり、「絶対値(Absolute)」で指定する場合は前出の画面1のようにHyper-Vマネージャーから設定できます。
Windows PowerShellの場合は「Set-VMNetworkAdapter」コマンドレットを使用します(画面8)。
Set-VMNetworkAdapter -VMName Test-VM02 -MinimumBandwidthAbsolute 200000000
画面8は絶対値の最小帯域幅設定でしたが、これは接続している仮想スイッチの「MinimumBandwidthMode」が「絶対値(Absolute)」の場合に設定可能です。「MinimumBandwidthMode」が「重み付け(Weight)」の場合は、画面9のエラーが発生します。
Hyper-Vマネージャーから同様の設定をした場合にも、「重み付け(Weight)」の仮想スイッチに対して絶対値での設定は不可能であるため、画面10のエラーが発生します。
「重み付け(Weight)」の最小帯域幅はWindows PowerShellからのみ設定可能で、「Set-VMNetworkAdapter」コマンドレットで「-MinimumBandwidthWeight」オプションを使用します(画面11)。
Set-VMNetworkAdapter -VMName Test-VM02 -MinimumBandwidthWeight 5
仮想ネットワークアダプターの設定内容の確認は、「Get-VMNetworkAdapter」コマンドレットを実行し、「MinimumBandwidthAbsolute」や「MinimumBandwidthWeight」の値を確認します(画面12)。
なお、本QoS設定は「Windows Server 2016」より前のHyper-Vで実装されていたQoS設定(vmQoS)であり、Windows Server 2016以降では「Microsoft SDN v2」(Hyper-V Network Virtualization v2:HNV v2)によるSDN(Software Defined Network:ソフトウェア定義ネットワーク)機能が提供するSDN QoSが代替とされています。
もちろん、vmQoSも使用可能ですが、細かい制御を必要としている環境ではSDN QoSの使用を推奨しています。
Microsoft SDN v2(HNV v2)については、別の回で解説します。
Hyper-V仮想スイッチのアクセス制御リスト(ACL)機能とは
「アクセス制御リスト(ACL)」によるアクセス制限は、Windows OSの「Windows Defenderファイアウォール」などでも実施可能な、送信元IPアドレスやプロトコルを見て通信を許可する/許可しないを設定できるセキュリティ機能です。
Windows DefenderファイアウォールはWindows OSの機能として実装されていますが、仮想スイッチのACL機能は仮想スイッチに通信パケットが到達した段階で処理されるため、ゲストOSに通信パケットが届く前に処理されます。したがって、仮想マシンのリソースを使うことなくアクセス制御が可能です。
画面13は、仮想マシン「Test-VM01」に対して、リモートアドレス「192.168.100.112」に対する通信を双方向(インバウンド/アウトバウンド)で拒否する、というACLを設定した画面になります。
「192.168.100.112」と「192.168.100.113」に対してPingで疎通を確認しています。前述の条件のACLを設定すると「192.168.100.112」に対するPingがタイムアウト(=疎通不可)になりますが、「192.168.100.113」への通信には影響がないことが分かります。また、仮想マシンが起動中でも設定が可能で、設定後即座に通信に影響を及ぼしている(ACLによるアクセス制御が実施されている)ことも分かります。
もう少し細かいACLを設定することも可能で、画面14では仮想マシン「Test-VM01」に対して、リモートアドレス「192.168.100.112」に対してICMP(Internet Control Message Protocol)をアウトバウンド方向で拒否する、というACLを設定しました。
Pingはタイムアウトするものの、「192.168.100.112」へのファイルコピー(443/TCPの通信)は継続して行われていることが確認できます。つまり、ICMPのみがACLによって拒否されている状態であることが分かります。
このように、仮想マシン側の設定を変更することなく、リアルタイムにアクセス制御できることが、仮想スイッチによるACLのメリットといえるでしょう。
Hyper-V仮想スイッチのACL設定方法
ACLについては、Hyper-Vマネージャーからは設定できず、全てWindows PowerShellによる設定となりますが、設定したいACLによって使用するWindows PowerShellコマンドレットが異なります。
送信元IPアドレス、送信先IPアドレスといったレイヤー3(ネットワーク層)でのACLを設定したい場合は「Add-VMNetworkAdapterAcl」コマンドレットを使用します(画面15)。
Add-VMNetworkAdapterAcl -VMName Test-VM01 -Action Deny -Direction Both -RemoteIPAddress 192.168.100.112
設定は「Get-VMNetworkAdapterAcl」コマンドレットで確認できます。画面13で示したACLと同じものを設定しているので、アクセス制御の挙動としては画面13と同じになります。
なお、ACLは送信元MAC(Media Access Control)アドレスや送信先MACアドレスといったレイヤー2(データリンク層)での設定も可能です(画面16)。
Add-VMNetworkAdapterAcl -VMName Test-VM01 -Action Deny -Direction Both -RemoteMacAddress 00-15-5D-0A-20-44
IPベースでのアクセス制御だけではなく、プロトコルや通信ポートといったレイヤー4(トランスポート層)で制御したい場合には、拡張ACLを設定できる「Add-VMNetworkAdapterExtendedAcl」コマンドレットを使用します。
拡張ACLでは前述の通り、TCP(Transmission Control Protocol)やUDP(User Datagram Protocol)、ICMPといったプロトコルを指定したり、ポート番号、例えば既定値のリモートデスクトップ接続を拒否したい場合にはポート番号「3389」を指定したりと、前述のACLよりも細かい制御が可能です。
画面14で設定したように、リモートホスト「192.168.100.112」に対するICMPのアウトバウンドのみを拒否したい場合は画面17のようになります。
Add-VMNetworkAdapterExtendedAcl -VMName Test-VM01 -Action Deny -RemoteIPAddress 192.168.100.112 -Protocol "1" -Direction Outbound -Weight 10
TCPやUDPであればそのまま「TCP」「UDP」で指定可能ですが、それ以外の場合はプロトコル番号で指定する必要があります。例えば、ICMPはプロトコル番号「1」なので、「-Protocol」オプションで「1」を指定します。もちろん、TCPやUDPの場合でもプロトコル番号「6」や「17」で指定できます(画面18)。
なお、本ACL設定はQoSの設定同様、Windows Server 2016より前のHyper-Vで実装されていたACL設定であり、Windows Server 2016以降ではMicrosoft SDN v2によるSDN機能が提供するSDN ACLによって改善が図られています。もちろん、これまでの解説通りACLおよび拡張ACLも使用可能です。Microsoft SDN v2については、別の回で解説します。
今回は、Hyper-V仮想スイッチのQoSやセキュリティ機能の一つであるACLと設定方法について見てきました。次回は仮想スイッチが提供する他のセキュリティ機能について、仮想ネットワークアダプターの「高度な機能」画面と照らし合わせながら、その詳細を見ていきます。
筆者紹介
後藤 諭史(ごとう さとし)
株式会社ネットワールド所属。Microsoft MVP for Cloud and Datacenter Management(2012-2025)。現業の傍ら、コミュニティーイベントでの登壇や著作にてMicrosoftテクノロジーに関する技術情報の発信、共有を続けている。ネットワークやハードウェアといった物理層に近いところが大好きな、昔ながらのインフラ屋さん。得意技はケーブル整線。近著は『詳解! Windows Server仮想ネットワーク』(日経BP社)。
Copyright © ITmedia, Inc. All Rights Reserved.