【 Add-VMNetworkAdapterExtendedAcl 】コマンドレット――Hyper-V仮想マシンの仮想ネットワークアダプターに拡張ACLを追加する(1):Windows PowerShell基本Tips(148)
本連載は、PowerShellコマンドレットについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は「Add-VMNetworkAdapterExtendedAcl」コマンドレットを解説します。
本連載では、Windows PowerShellの基本的なコマンドレットについて、基本的な書式からオプション、具体的な実行例までを分かりやすく紹介していきます。今回は、「Hyper-V」の仮想マシンに接続された仮想ネットワークアダプターに「拡張アクセス制御リスト」(Extended Access Control List:拡張ACL)を追加する「Add-VMNetworkAdapterExtendedAcl」コマンドレットです。
本コマンドレットは、使い方によっては他のホストと通信できなくなるなどの障害を引き起こす可能性があるため、拡張ACLの適用順序や実際の適用例を2回に分けて詳しく解説します。今回は拡張ACLの基本と「標準ACL」との違い、基本的な使い方を扱います。
Add-VMNetworkAdapterExtendedAclコマンドレットとは?
Hyper-Vの仮想スイッチの機能としてのアクセス制御は、標準ACLと拡張ACLの2種類があることはこれまでも繰り返し説明してきましたが、今回解説するAdd-VMNetworkAdapterExtendedAclは仮想マシンのネットワークアダプターに対して拡張ACLを追加するコマンドレットになります。
標準ACLを追加できる「Add-VMNetworkAdapterAcl」コマンドレット(本連載第145回)と比較すると、優先順位やステートフル設定などが可能なため、使用可能なオプションが増えています。また、同じオプションでも値として設定できるものが異なるので注意が必要です。本コマンドレットのオプションについては、本稿の実行例を通じて理解を深めてください。
【注】Add-VMNetworkAdapterExtendedAclは「Windows PowerShell用Hyper-Vモジュール」に含まれるコマンドレットになります。GUI(グラフィカルユーザーインタフェース)の「Windowsの機能の有効化」や「役割と機能の追加」からHyper-Vを有効化するか、PowerShellから「Enable-WindowsOptionalFeature」コマンドレットを使用して有効化します。
Add-VMNetworkAdapterExtendedAclコマンドレットの主なオプション
| オプション | 意味 |
|---|---|
| -VMName | 仮想マシン名を指定する |
| -VMNetworkAdapter | リソースオブジェクトとして仮想ネットワークアダプターを指定する。省略可能 |
| -VMNetworkAdapterName | 仮想ネットワークアダプター名を指定する。省略可能 |
| -ManagementOS | ホストOS用の仮想ネットワークアダプターに拡張ACLを追加したい場合に指定する。省略可能 |
| -Action | 拡張ACLのアクション(Allow/Deny)を指定する |
| -Direction | 拡張ACLの方向(Inbound/Outbound)を指定する |
| -LocalIPAddress | ローカルコンピュータのIPアドレスを指定する。省略可能 |
| -RemoteIPAddress | リモートコンピュータのIPアドレスを指定する。省略可能 |
| -LocalPort | ローカルコンピュータの通信ポート番号を指定する。省略可能 |
| -RemotePort | リモートコンピュータの通信ポート番号を指定する。省略可能 |
| -Protocol | 拡張ACLで制御するプロトコルを指定する。省略可能 |
| -Weight | 拡張ACLの「重み」を指定する |
| -Stateful | 拡張ACLをステートフルで評価するかどうかを指定する。省略可能 |
| -IdleSessionTimeout | ステートフルに評価した場合のアイドルセッションタイムアウトを指定する。省略可能 |
| -ComputerName | リモートのHyper-Vホストの仮想ネットワークアダプターの拡張ACLを追加する場合にコンピュータ名を指定する。省略可能 |
拡張ACLの基本と標準ACLとの違い
拡張ACLの基本的な考え方は、標準ACL同様、条件を設定して通信を特定し、特定された通信に対して制御を行います。
通信の特定方法としては、通信方向(Direction)やローカルアドレス、リモートアドレスなどの組み合わせになります。標準ACLで設定可能だったMAC(Media Access Control)アドレスでの指定は拡張ACLでは使用できなくなっており、標準ACLで指定不可だったプロトコル(Protocol)や通信ポート番号を指定でき、また拡張ACLの重みを「-Weight」オプションで指定可能です。
標準ACLでは、ACLの適用順序は「longest match」、つまりプレフィックス(Prefix)が長い順に適用されましたが、拡張ACLでは明示的に「-Weight」オプションで設定された重み順に適用されます。「重み」なので、設定された値が大きい順に評価されます。「-Weight」オプションは整数値での指定となり、最も重い値は「65535」になります(画面1)。
また、「-Weight」オプションでは同じ値を設定することはできません(画面2)。
ただし、「-Direction」オプションで指定する方向(Inbound/Outbound)が異なる場合には、同じ「-Weight」オプションの値を設定できます(画面3)。始点の通信とその戻りの通信に同じ重みを設定することで、運用上の視認性を高められます。
標準ACLに存在せず、拡張ACLに存在するオプションとして「-Stateful」オプションがあります。これは許可した通信の戻りを自動的に許可する動きになり、一般的なステートフルファイアウォールのACLと同じ挙動になります。
「-Stateful」オプションにより、明示的に戻りの通信を許可する必要がなくなるため、ACLの簡素化を図れます。具体的な挙動やオプションの使用方法は、後述する使用例を参照してください。
ネットワーク機器などのACLでは「暗黙の拒否」と呼ばれる非明示的な全通信拒否のポリシーが設定されていますが、Hyper-Vの拡張ACLには「暗黙の拒否」は存在しません。全ての拡張ACLにマッチしなかった通信を拒否するためには、“明示的な拒否”を設定する必要があるので注意が必要です。
なお、標準ACLではオプションとして用意されていた通信量を計測する「-Action Meter」オプションは、拡張ACLには存在しません。通信量を計測したい場合は、標準ACLを使用してください。
Hyper-V仮想マシンの仮想ネットワークアダプターに拡張ACL設定を追加する
必須オプションは「-VMName」「-Action」「-Direction」「-Weight」ですが、これを指定してAdd-VMNetworkAdapterExtendedAclコマンドレットを実行すると、全ての通信先に対する拡張ACLが設定されます(画面4)。なお、Add-VMNetworkAdapterExtendedAclコマンドレットは管理者権限での実行が必要となります。
コマンドレット実行例
Add-VMNetworkAdapterExtendedAcl -VMName Test-VM01 -Action Deny -Direction Outbound -Weight 10
画面4のコマンドレット実行例の場合、全ての通信先のアウトバウンド通信が拒否され、重みが「10」の拡張ACLとなり、この拡張ACLだけが設定されている場合には、全ての通信先に対してパケットを送信できなくなります。
また、拡張ACLは重み順に評価し、マッチした拡張ACLがあればそれを適用して評価終了となるため、画面4の拡張ACLが設定された場合には、「10」未満の重みを持つ拡張ACLは評価されません。このような「設定された方向の全通信を拒否」する拡張ACLは、重みを「1」に設定して、最後に評価する、つまりネットワーク機器でいうところの「暗黙の拒否」のように設定すべきでしょう(画面5)。
実際の通信を意識して拡張ACL設定を追加する
ここでは前項の画面5の「明示的な拒否」が設定された状態をベースに解説します。リモートホスト「192.168.100.119」からのリモートデスクトップ接続(RDP)を許可したい場合を考えます。
ローカルホストである「Test-VM01(192.168.100.112)」とリモートホスト「Test-VM02(192.168.100.119)」との関係は、図1のようになります。
この図1の考え方を参考に、リモートホストやローカルポートを利用して通信を許可します(画面6)。
コマンドレット実行例
Add-VMNetworkAdapterExtendedAcl -VMName Test-VM01 -Action Allow -Direction Inbound -LocalPort 3389 -RemoteIPAddress 192.168.100.119 -Weight 10 Add-VMNetworkAdapterExtendedAcl -VMName Test-VM01 -Action Allow -Direction Outbound -LocalPort 3389 -RemoteIPAddress 192.168.100.119 -Weight 10
リモートデスクトップ接続は、図1からも分かる通り、接続先と接続元でパケットが往復する双方向通信となります。そのため、画面6のようにリモートホストからの接続通信とローカルホストからの戻りの通信を意識して双方の拡張ACLを設定する必要があるので、通信の始点とポート番号を意識して拡張ACLを設定します。
これを怠ると、片方の通信が「明示的な拒否」の拡張ACLによって拒否されるので、リモートデスクトップが開始できません。
図1では拡張ACLを設定する「Test-VM01」の仮想ネットワークアダプターが通信の終点のため、ローカルポートとしてRDPの待ち受けポートである「3389」を設定し、通信の始点である「192.168.100.119」をリモートアドレスとして指定しました。戻りの通信としては「-Direction」に「Outbound」を指定した拡張ACLを設定しています。
また、画面6のように「-LocalPort」オプションで通信ポート番号を指定しつつ「-Protocol」オプションを指定しないと、全てのプロトコルでの通信ポート「3389」の疎通が許可されます。
RDPはTCP(Transmission Control Protocol)とUDP(User Datagram Protocol)が併用されるため、画面6のようにプロトコルを指定しないでRDPを許可した場合は、リモートデスクトップクライアントの接続情報を確認すると、UDPで接続していることが分かります(画面7)。
これを踏まえ「-Protocol」オプションで「TCP」を指定して拡張ACLを設定します(画面8)。
コマンドレット実行例
Add-VMNetworkAdapterExtendedAcl -VMName Test-VM01 -Action Allow -Direction Inbound -LocalPort 3389 -Protocol "TCP" -RemoteIPAddress 192.168.100.119 -Weight 10 Add-VMNetworkAdapterExtendedAcl -VMName Test-VM01 -Action Allow -Direction Outbound -LocalPort 3389 -Protocol "TCP" -RemoteIPAddress 192.168.100.119 -Weight 10
画面8の状態でリモートデスクトップクライアントの接続情報を確認すると、UDPが有効化されている旨のメッセージが消え、TCPのみで接続していることが確認できます(画面9)。
このように、プロトコルオプションで評価対象のプロトコルを絞り込むことが可能となり、プロトコルレベルでも疎通可否を設定できます。
なお、TCPやUDPなどはキーワードで指定できますが、例えばICMP(Internet Control Message Protocol)などはプロトコル番号で指定します(画面10)。
コマンドレット実行例
Add-VMNetworkAdapterExtendedAcl -VMName Test-VM01 -Action Allow -Direction Inbound -Protocol "1" -RemoteIPAddress 192.168.100.119 -Weight 20 Add-VMNetworkAdapterExtendedAcl -VMName Test-VM01 -Action Allow -Direction Outbound -Protocol "1" -RemoteIPAddress 192.168.100.119 -Weight 20
筆者紹介
後藤 諭史(ごとう さとし)
株式会社ネットワールド所属。Microsoft MVP for Cloud and Datacenter Management(2012-2026)。現業の傍ら、コミュニティーイベントでの登壇や著作にてMicrosoftテクノロジーに関する技術情報の発信、共有を続けている。ネットワークやハードウェアといった物理層に近いところが大好きな、昔ながらのインフラ屋さん。得意技はケーブル整線。近著は『詳解! Windows Server仮想ネットワーク』(日経BP社)。
Copyright © ITmedia, Inc. All Rights Reserved.








