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