検索
連載

【 Add-VMNetworkAdapterAcl 】コマンドレット――Hyper-V仮想マシンの仮想ネットワークアダプターにアクセス制御リスト(ACL)を追加するWindows PowerShell基本Tips(145)

本連載は、PowerShellコマンドレットについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は「Add-VMNetworkAdapterAcl」コマンドレットを解説します。

PC用表示 関連情報
Share
Tweet
LINE
Hatena
「Windows PowerShell基本Tips」のインデックス

連載目次

 本連載では、Windows PowerShellの基本的なコマンドレットについて、基本的な書式からオプション、具体的な実行例までを分かりやすく紹介していきます。今回は、「Hyper-V」の仮想マシンに接続された仮想ネットワークアダプターに「アクセス制御リスト」(Access Control List:ACL)を追加する「Add-VMNetworkAdapterAcl」コマンドレットです。

Add-VMNetworkAdapterAclコマンドレットとは?

 Hyper-Vの仮想スイッチはさまざまなネットワーク機能を仮想マシンに提供しており、仮想マシンに対する通信を制御するACLによるアクセス制御にも対応しています。

 Add-VMNetworkAdapterAclは、仮想マシンのネットワークアダプターに対してACLを追加するコマンドレットであり、複数のACLを同一の仮想ネットワークアダプターに追加することが可能です。

 ACLには「標準ACL」と「拡張ACL」の二種類があることは本連載144回の「Get-VMNetworkAdapterAcl」コマンドレットでも触れましたが、Add-VMNetworkAdapterAclは標準ACLを追加するためのコマンドレットになります。

【注】Add-VMNetworkAdapterAclコマンドレットは「Windows PowerShell用Hyper-Vモジュール」に含まれるコマンドレットになります。GUI(グラフィカルユーザーインタフェース)の「Windowsの機能の有効化」や「役割と機能の追加」からHyper-Vを有効化するか、PowerShellから「Enable-WindowsOptionalFeature」コマンドレットを使用して有効化します。


Add-VMNetworkAdapterAclコマンドレットの書式

Add-VMNetworkAdapterAcl [オプション]


Add-VMNetworkAdapterAclコマンドレットの主なオプション

オプション 意味
-VMName 仮想マシン名を指定する
-VMNetworkAdapter リソースオブジェクトとして仮想ネットワークアダプターを指定する。省略可能
-VMNetworkAdapterName 仮想ネットワークアダプター名を指定する。省略可能
-ManagementOS ホストOS用の仮想ネットワークアダプターにACLを追加したい場合に指定する。省略可能
-Action ACLのアクション(Allow/Deny/Meter)を指定する
-Direction ACLの方向(Inbound/Outbound/Both)を指定する
-LocalIPAddress ローカルコンピュータのIPアドレスを指定する。省略可能
-LocalMacAddress ローカルコンピュータのMAC(Media Access Control)アドレスを指定する。省略可能
-RemoteIPAddress リモートコンピュータのIPアドレスを指定する。省略可能
-RemoteMacAddress リモートコンピュータのMACアドレスを指定する。省略可能
-ComputerName リモートのHyper-Vホストの仮想ネットワークアダプターのACLを追加する場合にコンピュータ名を指定する。省略可能

仮想マシンの仮想ネットワークアダプターにIPアドレスベースのACL設定を追加する

 必須オプションは「-VMName」オプションと「-Action」オプション、それに「-Direction」オプションですが、これだけを指定してAdd-VMNetworkAdapterAclコマンドレットを実行しても、エラーが発生してACLを追加できません(画面1)。

ALT
画面1 必須オプションだけを指定しても、ACLは追加できない

 ACLを追加するためには、通信を特定する要素が必要になります。その要素とは「-LocalIPAddress」「-LocalMacAddress」「-RemoteIPAddress」「-RemoteMacAddress」の4つのオプションのいずれかになります。

 例えば、リモートIPアドレス「192.168.200.10」への通信を拒否するACLを追加する場合は、「-RemoteIPAddress」オプションで通信先である「192.168.200.10」を指定し、通信を拒否するので「-Action」オプションは「Deny」を指定します(画面2)。なお、Add-VMNetworkAdapterAclコマンドレットは管理者権限での実行が必要となります。

コマンドレット実行例

Add-VMNetworkAdapterAcl -VMName Test-VM02 -Action Deny -Direction Both -RemoteIPAddress 192.168.200.10

ALT
画面2 指定した仮想マシンの全ての仮想ネットワークアダプターのACLを追加した

 画面2のように、複数の仮想ネットワークアダプターを持つ仮想マシンに対し、リモートIPアドレスのみを指定してAdd-VMNetworkAdapterAclコマンドレットを実行した場合は、接続されている全ての仮想ネットワークアダプターにACLが追加されます。

 特定の仮想ネットワークアダプターに対してのみACLを追加したい場合は、「-VMNetworkAdapterName」オプションを利用します(画面3)。

コマンドレット実行例

Add-VMNetworkAdapterAcl -VMName Test-VM02 -VMNetworkAdapterName "FrontendNIC" -Action Deny -Direction Both -RemoteIPAddress 192.168.200.10

ALT
画面3 指定した仮想マシンの特定の仮想ネットワークアダプターに対してのみACLを追加した

 前述の例は、ホストアドレスまで指定されたACLになっていますが、ネットワーク単位でのACLも設定可能です。その場合は「-RemoteIPAddress」オプションでネットワーク範囲を指定して、コマンドレットを実行します(画面4)。

コマンドレット実行例

Add-VMNetworkAdapterAcl -VMName Test-VM02 -VMNetworkAdapterName "FrontendNIC" -Action Deny -Direction Both -RemoteIPAddress 192.168.200.0/24

ALT
画面4 ACLのアドレス指定は、ネットワークアドレスでも可能

 ACLは、1つの仮想ネットワークアダプターに対して複数追加可能です。例えば、画面4の状態でホストアドレス「192.168.200.191」に対する通信を許可するACLを追加します(画面5)。

コマンドレット実行例

Add-VMNetworkAdapterAcl -VMName Test-VM02 -VMNetworkAdapterName "FrontendNIC" -Action Allow -Direction Both -RemoteIPAddress 192.168.200.191

ALT
画面5 ACLは同一仮想ネットワークアダプターに対して複数設定可能

 画面5のACLを追加した仮想マシン(Test-VM02)でICMP(Internet Control Message Protocol)による疎通を確認(Ping)したところ、Allow(許可)に設定されているホスト(192.168.200.191)とは疎通できましたが、それ以外のホスト(例えば、192.168.200.94)には疎通できず、追加したAllowのルールが有効であることが確認できました(画面6)。

ALT
画面6 画面5のACLが設定された仮想マシンで疎通確認をしたところ、Allowのルールが有効であることが確認できた

仮想マシンの仮想ネットワークアダプターにMACアドレスベースのACL設定を追加する

 これまでの例はレイヤー3(ネットワーク層)のIPアドレスベースのACL設定でしたが、「-LocalMacAddress」オプションや「-RemoteMacAddress」オプションを利用することで、レイヤー2(データリンク層)のMACアドレスベースの設定も可能です。

 特定のMACアドレスからの通信を拒否したい場合には、「-RemoteMacAddress」オプションを使用してリモートのMACアドレスを指定します(画面7)。

コマンドレット実行例

Add-VMNetworkAdapterAcl -VMName Test-VM01 -Action Deny -Direction Both -RemoteMacAddress 00-15-5D-0A-20-08

ALT
画面7 「-RemoteMacAddress」オプションを利用して、MACアドレスベースのACLを追加した

 IPアドレスベースのACLでは、制御対象の仮想マシンもしくは物理ノードのIPアドレスが変更されると、ACLの設定はIPアドレスの変更に自動的には追従できないため、ACLによるアクセス制御が回避されてしまいます。

 しかし、対象が仮想マシンであれば、ゲストOSレベルでは書き換えを行った上でHyper-V仮想スイッチを介して通信することが困難なMACアドレスをベースにACLを設定することで、IPアドレス変更によるアクセス制御の回避を防止できます。

【注】「MACアドレススプーフィング」が有効化されている仮想ネットワークアダプターでは、OS上でMACアドレスを書き換えてHyper-V仮想スイッチを介して通信することが可能であり、MACアドレスベースのACLも回避できてしまいます。そのため、MACアドレススプーフィングの有効化は慎重に検討してください。

 MACアドレススプーフィングについては別連載「今だからこそ学び直すHyper-V再入門」の第11回「いまさら聞けないHyper-Vネットワークの詳細(4):仮想スイッチの高度な機能」を参照してください。



仮想マシンの特定通信の通信量を計測する

 ある仮想マシンが、特定のIPアドレスを持つノードとどのくらいの通信量が発生しているかを確認したいときはないでしょうか?

 「-Action」オプションの「Meter」を利用することで、非リアルタイムではありますがメガバイト(MB)単位のおおよその通信量を計測できます。

 設定方法はこれまで説明したACLと同じですが、「-Action」オプションで「Meter」を指定します(画面8)。なお、「Meter」を使用する際は、IPアドレスベースでの指定になります。MACアドレスでの指定はできません。

コマンドレット実行例

Add-VMNetworkAdapterAcl -VMName Test-VM01 -Action Meter -Direction Both -RemoteIPAddress 192.168.100.119

ALT
画面8 「-Action」オプションで「Meter」を指定したACLを作成した

 実際の通信量の確認は、Get-VMNetworkAdapterAcl」コマンドレットで確認できます(画面9)。確認できる値は、ACL追加時からのACLにヒットした通信の累積値となります。

ALT
画面9 通信量の測定結果は「Get-VMNetworkAdapterAcl」コマンドレットで確認できる

 なお、ACLを設定した仮想マシンを再起動しても、計測値はリセットされません。計測値をリセットするには、ACLを削除する必要があります。また、「Meter」が指定されたACLは、実際の通信には何ら影響を与えません。明示的に通信を許可する場合には、別途「Allow」のACLが必要になります。


仮想マシンの仮想ネットワークアダプターにIPv6アドレスベースのACL設定を追加する

 これまでの例ではIPアドレスとしてIPv4(Internet Protocol version 4)アドレスを使用していましたが、IPv6(Internet Protocol version 6)によるアドレス指定も可能です(画面10)。

コマンドレット実行例

Add-VMNetworkAdapterAcl -VMName Test-VM01 -Action Deny -Direction Both -RemoteIPAddress 2001:db8::1

ALT
画面10 IPv6アドレスベースのACLも設定可能

 IPv6アドレスであっても、使用するオプションは同一です。指定されたアドレスのACLが追加されます。


全ネットワークアドレスに対するACLを追加する

 全てのネットワークを指定したい場合、IPv4では「0.0.0.0/0」、IPv6では「::/0」をアドレスとして指定します。

 IPv4、IPv6を問わず、全てのネットワークに対するACLを追加したい場合は、予約語である「ANY」を使用します(画面11)。

コマンドレット実行例

Add-VMNetworkAdapterAcl -VMName Test-VM01 -Action Deny -Direction Both -RemoteIPAddress ANY

ALT
画面11 「ANY」を使用することで、全てのネットワークに対するACLを追加可能

 「ANY」を使用すると、「0.0.0.0/0」および「::/0」に対するACLが追加されます。これにより、全てのネットワークに対するACLが設定されてしまうので、「-Action」オプションで「Deny」を指定していた場合には全ての通信が拒否されてしまい、ネットワークアクセスができなくなるので注意してください。


ホストOSが使用する仮想ネットワークアダプターにACLを追加する

 ホストOSが使用する仮想ネットワークアダプター、すなわちホストOSが仮想スイッチ経由で通信する際に使用される仮想ネットワークアダプターに対してもACLは追加可能です。その場合は、仮想マシン名を指定する「-VMName」オプションの代わりに、「-ManagementOS」オプションを使用します(画面12)。

コマンドレット実行例

Add-VMNetworkAdapterAcl -ManagementOS -Action Deny -Direction Both -RemoteIPAddress 0.0.0.0/0

ALT
画面12 「-ManagementOS」オプションを使用することで、ホストOSが使用する仮想ネットワークアダプターに対してACLが追加できる

 上記コマンドレット例のように、リモートアドレス「0.0.0.0/0」を拒否すると全てのIPv4通信が拒否されてしまい、リモートデスクトップ接続などの管理通信も全て拒否されます。「0.0.0.0/0」を指定する場合には、画面12のように必ず特定のネットワークからの通信は許可(Allow)した上で、「0.0.0.0/0」を拒否(Deny)するACLを追加してください。


ACLの適用順序について

 Add-VMNetworkAdapterAclコマンドレットで設定されるACLには、明示的な優先順位を示す設定はありません。前出の画面5のように、後から追加されたACLが優先される場合もあり、ACLの追加順にACLが適用されるわけでもありません。

 Add-VMNetworkAdapterAclコマンドレットで追加されたACLは、同一方向のトラフィックに対しては「longest match」、すなわちIPプレフィックスが長いものほど優先して適用されます。つまり、ホストを指定したACL(ホスト指定の場合のプレフィックスは「/32」)から評価され、「/24」「/16」とプレフィックスが長い順に評価されていき、最後は「/0」のACLが評価されます。

 同じプレフィックス長の場合の優先順位については、明確な仕様はうたわれていません。ただし、同じリモートホストを指定して「Allow」と「Deny」の両方を設定した場合は、後から追加したACLはコマンドレット実行時にエラーが発生するため設定できません。ただし「Meter」は設定可能です。

 以下の画面13は同一ホストアドレスに対する設定になりますが、設定アドレスがネットワークアドレス(例えば、「192.168.200.0/24」)の場合でも、2回目のAdd-VMNetworkAdapterAclコマンドレット実行時にエラーが発生して設定できません。

ALT
画面13 同じ対象に対して「Allow」「Deny」両方のACLは設定できない

筆者紹介

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

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


Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る