このページの本文へ

Windows Info 第414回

Windows Subsytem for Linux(WSL)が昨年9月のアップデートでファイアウォール対応になった

2024年01月14日 10時00分更新

文● 塩田紳二 編集● ASCII

  • この記事をはてなブックマークに追加
  • 本文印刷

 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ファイアウォールに関連するコマンドの一覧である。

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で、指定した条件を満たすルールを有効化/無効化ができる。

Hyper-Vファイアウォール

 PowerShellによるファイアウォールの設定に慣れているなら、Hyper-Vファイアウォールの設定は単純化されているので難しくはない。ただし、GUIがないのでそうでない人には難しいだろう。ただ、WSLのサービスなどをLANやインターネット側などに公開しなければ、Hyper-Vファイアウォールは、以前と同じ状態で無効化しておいても構わないと思われる。

 Disable-NetFirewallHyperVRuleを引数なしで実行すると、すべてのルールが無効になる。この状態でSet-NetFirewallHyperVVMSettingを使い、Inbound、Outboundの許可・ブロックを設定できる。これにより、すべて許可、すべてブロックを指定することもできる。

 いつの間にか導入されていたHyper-Vファイアウォールは、簡単に言えば、WSL専用のファイアウォール設定だ。ファイアウォールは、Linux側でも設定が可能だが、仮想マシンの外側になるWin32側でするほうが効率的だろう。

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン