Windows Subsytem for Linuxの2023年9月アップデートでは、WSLのファイアウォール対応がなされた。これは、Windows 11 Ver.22H2以上で利用可能で、デフォルトで有効になっている。このため、WSLのネットワークに関しては、ファイアウォールを気にする必要がある。
このファイアウォールには、Win32側のファイアウォール(セキュリティが強化されたWindows Defenderファイアウォール、以下Defenderファイアウォール)も関係するが、WSL専用に「Hyper-Vファイアウォール」と呼ばれる、「ややこしい名前」の専用ファイアウォールが新設されている。このため、WSLのファイアウォールはこの両方を扱わねばならない。
Hyper-Vファイアウォールとは?
Windows 11 Ver.22H2に装備された「Hyper-Vファイアウォール」は、Hyper-Vを利用したコンテナ用のファイアウォールで、Hyper-Vの仮想マシンとは無関係である。現状で対象となるコンテナーはWSLのみ。WSLに似たものにWindows Subsystem for Androidがあるのだが、こちらは今のところ対象外のようである。
WSLに対するファイアウォールの設定は、ユーザーフォルダにある.wslconfigファイルで行う。「[wsl2]」セクションの「firewall=」にtrueまたはfalseを設定する。何も設定しないと、デフォルト値であるtrueが設定されているとみなされ、ファイアウォールが有効になる。
Hyper-Vファイアウォールは、Defenderファイアウォールの簡易版である。DefenderファイアウォールやPowerShellからの操作に関しては、本連載の以前の記事を参照してほしい(「WindowsのファイアウォールをPowerShellから制御する」)。
なお、Hyper-Vファイアウォールに関しては現時点ではGUIがなく、すべてPowerShellのコマンドで設定しなければならない(https://learn.microsoft.com/ja-jp/windows/security/operating-system-security/network-security/windows-firewall/hyper-v-firewall)。企業向けには有償の「Microsoft Intune」を使う方法もあるようだが……。
ルールの基本的な考えは同じだが、Defenderファイアウォールのようにアドレス指定やポート指定にフィルターを使わず、直接Local/Remoteのアドレス、ポートを指定する。このため、PowerShellからのルール記述は、Defenderファイアウォールよりも少し簡単になっている。
以下の表は、Hyper-Vファイアウォールに関連するコマンドの一覧である。
PowerShell内であれば、
Get-Command -Noun NetFirewallhyperv* | sort Noun,verb
で、Hyper-Vファイアウォール関連のコマンドを列挙することができる。
コマンドは対象で分類できる。大きく「ルール」「VM設定」「プロファイル」「クリエーター」「ポート」に分けられる。このうち「ルール」は、Hyper-Vファイアウォールのルール、「VM設定」は、Hyper-VファイアウォールにおけるVMごとの基本設定のためのものだ。どちらもGet-系コマンドで内容を取得できる。
この中にあるコマンドのいくつかは、パラメーターとして対象となるVM CreatorのGUIDを要求する。それを表示するのが「Get-NetFirewallHyperVVMCreator」コマンドで、実行するとWSLに対応するクリエーターのGUIDを出力する。
「ポート」は、IPネットワークのポートとは無関係で、VM側のソフトウェアの機能名と思われる。いまのところ特に利用する必要はなさそうだ。
「プロファイル」は、Win32側のプロファイルと同じく、ドメイン、プライベート、パブリックに対応する。「プロファイル」も現時点では、ルールの対象として指定する程度で、作成などをする必要はなさそうだ。
プロファイルオブジェクトには、現在のネットワークプロファイルに応じて適用されるデフォルト値がある。実際には、VM設定にも同様のデフォルト値がある。これらのデフォルト値には、未定状態(他の設定などで値が決まることを示す)である「NotConfigured」があり、これが設定されているプロパティは、他のコマンドで扱うオブジェクトで値が決まる。
たとえば、Hyper-Vファイアウォールルールの受信ルールの既定値を設定する「DefaultInboundAction」は、Hyper-VプロファイルにもVM設定にもある。どちらかが確定した値(NotConfigured以外のAllowまたはBlock)に設定されると、Hyper-Vファイアウォールの受信ルールは、対応するルールがなければ、設定値で許可(Allow)または拒否(Block)が決まる。
Hyper-Vファイアウォールを制御する場合、VM設定でデフォルト値を決め、あとはルールを追加して使う。基本的にプロファイルを追加/削除する必要はなく、VM基本設定も最初から存在するので変更(Set-コマンド)のみ使う。
コマンドは多数あるが、表中の太字のコマンドで、ルールの作成、編集や管理、VM基本設定の変更のみを行えばよい。
ルールの作成は、New-NetFirewallHyperVRule(https://learn.microsoft.com/en-us/powershell/module/netsecurity/new-netfirewallhypervrule?view=windowsserver2022-ps)で、変更はSet-NetFirewallHyperVRule(https://learn.microsoft.com/en-us/powershell/module/netsecurity/set-netfirewallhypervrule?view=windowsserver2022-ps)でする。
以下の表は、ルールを作成するNew-NetFirewallHyperVRuleの主な引数を示している。基本的には、「方向」「動作」やローカル/リモートのアドレスとポートを指定してルールを作る。作成したルールは、Enabledプロパティで有効、無効を指定できる。作成後は、Disable-NetFirewallHyperVRuleやEnable-NetFirewallHyperVRuleで、指定した条件を満たすルールを有効化/無効化ができる。
PowerShellによるファイアウォールの設定に慣れているなら、Hyper-Vファイアウォールの設定は単純化されているので難しくはない。ただし、GUIがないのでそうでない人には難しいだろう。ただ、WSLのサービスなどをLANやインターネット側などに公開しなければ、Hyper-Vファイアウォールは、以前と同じ状態で無効化しておいても構わないと思われる。
Disable-NetFirewallHyperVRuleを引数なしで実行すると、すべてのルールが無効になる。この状態でSet-NetFirewallHyperVVMSettingを使い、Inbound、Outboundの許可・ブロックを設定できる。これにより、すべて許可、すべてブロックを指定することもできる。
いつの間にか導入されていたHyper-Vファイアウォールは、簡単に言えば、WSL専用のファイアウォール設定だ。ファイアウォールは、Linux側でも設定が可能だが、仮想マシンの外側になるWin32側でするほうが効率的だろう。
この連載の記事
-
第458回
PC
Windows上でhostsファイルを活用する -
第457回
PC
IPv6アドレスは先頭を見ればどんな種類かわかる -
第456回
PC
あらためてIPv6基本のキ -
第455回
PC
Windowsで現在どのネットワークアダプタがインターネット接続に使われているかを調べる方法 -
第454回
PC
Windows 11 24H2では「デバイスの暗号化」の条件が変わり、より多くのPCでドライブが暗号化される -
第453回
PC
Windows 11 24H2の配布開始後もすぐにはやってこない Windows UpdateとSafeguard Holds -
第452回
PC
Windows 11 Ver.24H2が登場 Copilot+ PCとそうでないPCで実質Windowsが2つに分かれる -
第451回
PC
新しいWindowsサンドボックスではコマンドラインからの制御が可能に -
第450回
PC
ユニコードで文字数を数える方法 -
第449回
PC
WSLはプレビュー版でGUIでの設定が加わった! リリース2.3.xの新機能を見る -
第448回
PC
PowerShellで面倒なオブジェクトはPSCustomObjectに変換するのが早道 - この連載の一覧へ