WSL2023年9月アップデート(WSL Ver.2.0)に導入された機能のうち、大きなものの1つは、ファイアウォール機能(Hyper-Vファイアウォール)だ。デフォルトでファイアウォールが有効になっているため、WSLとホスト、インターネット側との通信に影響が出る。ただし、標準状態では、Win32側のファイアウォールの標準状態と同じになっているため、通常の利用ですぐに問題が生じる可能性は少ない。しかし、コンテナーなどの利用でポートの割り当てを行うなどすると、場合によっては通信に支障が出るおそれもある。

なお、WSL2023年9月アップデートの概要に関しては、前回、前々回の記事を参照されたい。

WSLのファイアウォール

WSLのファイアウォールは、現状、WSL専用のものだ。Win32側のWindowsファイアウォールとは別物でHyper-Vファイアウォールと呼ばれているが、Hyper-Vの仮想マシンとは関係なくWSLのみに適用される。

WSLを始め仮想マシンでは、仮想的なネットワークを「仮想スイッチ」(いわゆるスイッチングハブのこと)と呼ぶ。現実でも、LANの実体の大分部がスイッチングハブの中にあるように、仮想マシンの仮想ネットワークは仮想的なスイッチングハブ(仮想スイッチ)の中にある。このとき、仮想スイッチと仮想マシンの接続点を「ポート」と呼ぶことがある。

Hyper-Vファイアウォールは、(図01)のように、仮想スイッチ側にあり、WSLに出入りするパケットに対して適用される。

図01: Hyper-VファイアウォールはWSLとWin32環境の間に入り、ここを行き交うパケットを処理する。なお、WSL側からLAN、インターネット側に接続する場合、Windowsファイアウォールも通過する

パケットに対する処理は、ルールおよびVM基本設定、プロファイルで決まる。ルールには、パケットの方向やプロトコル、宛先、差出人のIPアドレス、ポート番号などが指定してあり、条件を満たすパケットに対して、通過または阻止を決定する。

ルールの条件を満たさないパケットに関しては、VM基本設定の既定値により通過、阻止が決まる。

現状、その制御には、GUIがなく、PowerShellのコマンド(表01)を使う。コマンドは大きく4種類ある。「ルール」は、ファイアウォールのパケットを処理するためのルールに関するもの。VM基本設定は、ルールに記述されていないパケットを通過させるか、阻止するかの既定値を定める。プロファイルは、Windowsのネットワークと同じく、現在の接続環境(ドメイン、プライベート、パブリック)を設定するもので、ルールには、特定のプロファイル状態でのみ有効になるものがある。

■表01

Windowsファイアウォールの制御とほぼ同じで、PowerShellからWindowsファイアウォールを設定したことがあれば、ほぼ同じように設定できる。なお、Hyper-Vファイアウォールではルールが簡略化されていて、ルールとポートフィルター条件を個別に設定する必要がない。

基本的な操作としては、ルールの

確認 Get-NetFirewallHyperVRule

作成 New-NetFirewallHyperVRule

変更 Set-NetFirewallHyperVRule

削除 Remove-NetFirewallHyperVRule

有効化 Enable-NetFirewallHyperVRule

無効化 Disable-NetFirewallHyperVRule

が可能である。

VM基本設定やプロファイルに関しては、表示のみ程度で、変更や作成を行う必要はほとんどない。

その他のコマンドもあるが、現時点では、あまり使い道がない。ただし、ルールの作成などでVMCreatorIDが必要な場合にはGet-NetFirewallHyperVVMCreatorコマンドで調べることが可能だが、現時点では、WSLの「{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}」しかない。

Hyper-Vファイアウォール関連のコマンドは、「NetSecurity」モジュールに含まれており、Windowsファイアウォール関連のコマンドとともにMicrosoftのサイトにある「NetSecurity Module(現状英語のみ)」に記事がある。Hyper-VファイアウォールのPowerShellからの操作に関しては、Hyper-V ファイアウォールに解説がある。

ルール

ルールには、主に(表02)のような適用条件がある。ルールはオブジェクトになっているため、条件はプロパティとして指定できる。これは、「CimInstance#root/standardcimv2/MSFT_NetFirewallHyperVRule」というオブジェクトが持つプロパティの一部である(root/standardcimv2は名前空間を表す)。

■表02

既存のルールは、Get-NetFirewallHyperVRuleで調べることができる。たとえばTCPに対するルールは

Get-NetFirewallHyperVRule -Protocol tcp | Out-GridView

として調べることができる。しかし、このコマンドのオプションだけでは、ルールを絞りきれないので、Where-Object(エイリアスは?)を使い、条件を指定する。たとえば、プロファイルがPrivateであるときに有効なルールを探すには、

Get-NetFirewallHyperVRule | ? profiles -match "private|any" | Out-GridView

などとする。Profilesには、複数のプロファイル名(Domain、Public、Private)がカンマ区切りで含まれること、Anyキーワードはすべてのプロファイルに対応することを考慮すると、正規表現マッチ演算子(-match)を使うのが簡単だ。同様の手法は、ポート番号やアドレス(複数が含まれる)にも使える。

なお、リモート、ローカルのアドレス(表03)、ポート番号(表04)では、アドレス、ポート番号を数値で指定するが、これらを組み合わせた範囲やリストでの指定が使える。また、一部キーワードを使った指定が可能だ。

■表03

■表04

プロトコルも著名なものをキーワード(表05)で指定可能なほか、プロトコル番号での指定も可能。ただし、プロトコルは範囲やリストで指定することができないため、それぞれを個別のルールにする必要がある。

■表05

> Windows Subsystem for Linuxガイド 連載バックナンバー

https://news.mynavi.jp/tag/winsubsystem/