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側でするほうが効率的だろう。

この連載の記事
-
第508回
PC
Scalable Vector Graphics(SVG)そもそも何なのか? -
第507回
PC
Windows 11の「開発者モード」とは何か? -
第506回
PC
Windows 11は早くも来秋登場の26H2プレビューの準備が始まる -
第505回
PC
結構変化しているWindows 11のエクスプローラーの基本設定を見直す -
第504回
PC
新しいOutlookとOutlook Classic、そろそろ古いOutlookとExchangeの組み合わせは引退の頃合いか -
第503回
PC
機能が増えたこともあり、寄せ集めから統合化に進むWindowsの便利ツール「PowerToys」 -
第502回
PC
Windows 11でBluetoothのオーディオ新規格「Bluetooth LE Audio」を試す -
第501回
PC
Windows 11 Ver.25H2での変更点、新機能を整理する -
第500回
PC
Windows 11 Ver.25H2が完成した -
第499回
PC
Windowsでの致命的だが回復可能なエラーに備える手段を2つ紹介 -
第498回
PC
Windows Terminalの安定版V1.23が公開 設定UIが改良される - この連載の一覧へ













