うたカモ技術ブログ

Windows Wi-Fi

Windows   WSL上のSSHサーバーに対する追加設定(portproxy、ファイアウォール)の紹介

post: 

この記事は、Secure Shell(SSH)記事「【ネットワークコマンド】SSHコマンドの基本的な使い方:パスワード認証と公開鍵認証」を補足するためのメモです。 Windows Subsystem for Linux 2(WSL2)上に構築したSSHサーバーへ、SSHクライアントが接続できる状態を作る手順についてまとめました。

この記事では、WSL2上のLinuxへSSH接続するために追加で必要になる Windows側の設定(portproxyによるポート転送 / ファイアウォール)のみを扱います。

注意

インターネット公開を前提にした設定ではありません。 宅内ローカルエリアネットワーク(LAN)などの閉域環境での利用を前提にし、公開運用する場合は公開鍵認証・認証制限・監査ログなどを必ず追加してください。

目次

  1. 前提条件
  2. WSL2のIPアドレスをWindows側から確認する
  3. Windows側でポートフォワードを設定する
  4. Windowsファイアウォールを許可する
  5. 設定を解除する手順
  6. 接続確認
  7. トラブルシュート

前提条件

このメモは、WSL2上のLinuxでSSHサーバー(OpenSSH)が構築済みであることを前提にしています。

WSL2のネットワークモードのデフォルト設定はNATです。 本記事は、WSL2のネットワークモードがNATであることを前提にしています。 そのため、Windows側でportproxyとファイアウォール設定を実施します。

まだの場合は、先に次の記事でLinux側の設定を完了してください。
【ネットワークコマンド】SSHコマンドの基本的な使い方:パスワード認証と公開鍵認証

この記事で紹介する手順は、WindowsでコマンドプロンプトまたはPowerShellを開いて実行してください。 netsh やファイアウォール設定のコマンドは管理者権限で実行する必要があります。

補足

今回は、WSL2のネットワークモードがデフォルト設定のNATであることを前提に説明しています。 ミラーリングの場合はWindowsとWSL2上のLinuxが同じIPアドレスを持つため、portproxy設定などは不要です。

そのため、ミラーリングの際はこの記事の中のファイアウォール設定だけを実施すれば済みます。

ただし、ミラーリングはWindows/WSLのバージョンやネットワーク環境(ドライバ・VPN・セキュリティ設定)によって利用できない、 もしくは不安定になる場合があるため、事前によく確認してください。

以下のWSL Settingsでネットワークモードを変更できます。

WSL2のIPアドレスをWindows側から確認する

Windows側のportproxy設定で接続先(connectaddress)として使用するため、 Windows側のPowerShellからWSL2のInternet Protocol version 4(IPv4)アドレスを確認します。

1. 対象ディストリビューション名を確認する

PS C:\Users\xxx> wsl --list --verbose

上記コマンドは、インストール済みWSLディストリビューションの一覧を表示します。 ここで NAME 列の値(例: UbuntuUbuntu-24.04)を確認します。

2. 対象ディストリビューションのIPアドレスを確認する

PS C:\Users\xxx> wsl -d Ubuntu -- hostname -I

このコマンドは、-d で指定したディストリビューション内で hostname -I を実行し、IPアドレスを表示します。 -- は「ここから後ろはLinux側で実行するコマンド」という意味です。

Ubuntu の部分は環境に合わせて置き換えてください (例: Ubuntu-24.04)。 wsl --list --verboseNAME 列に表示される値を使います。

実行結果の例は次の通りです。

PS C:\Users\xxxx> wsl --list --verbose
  NAME              STATE           VERSION
* Ubuntu            Running         2
  docker-desktop    Stopped         2
PS C:\Users\xxxx> wsl -d Ubuntu -- hostname -I
172.24.124.119
PS C:\Users\xxxx>

今回、私の場合は wsl --list --verbose の結果で UbuntuRunningdocker-desktopStopped でした。 SSH接続先として使うLinux環境はUbuntuなので、次のコマンドでも -d Ubuntu を指定しています。

今回の実行結果では、hostname -I の出力として 172.24.124.119 が表示されました。 この値を portproxyconnectaddress に使います。

3. portproxy設定に使うIPアドレスを決める

複数表示される場合は、先頭のIPv4アドレスを使用します。今回の例では 172.24.124.119 を使用します。

なお、WSL2は再起動やネットワーク再接続でIPアドレスが変わることがあるため、接続できない場合はこの手順を再実行してIPを確認してください。

Windows側でポートフォワードを設定する

以降のコマンドはWindows側の「管理者権限PowerShell/コマンドプロンプト」で実行します。

既存設定がある場合を考慮して、いったん削除してから再作成します。

1. 既存のportproxy設定を削除する

C:\Windows\System32>netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=22

2. WSL2のIPアドレスを指定してportproxy設定を追加する

今回の実行結果では 172.24.124.119 が確認できたため、 connectaddress にこの値を指定します。 読者の方は、自分の環境で確認したIPアドレスに置き換えてください。

C:\Windows\System32>netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=22 connectaddress=172.24.124.119 connectport=22

3. portproxy設定を確認する

C:\Windows\System32>netsh interface portproxy show v4tov4

ipv4 をリッスンする:         ipv4 に接続する:

Address         Port        Address         Port
--------------- ----------  --------------- ----------
0.0.0.0         22          172.24.124.119  22

上記のように、0.0.0.0:22 への受信を 172.24.124.119:22 に転送する設定になっていれば成功です。

Windowsファイアウォールを許可する

New-NetFirewallRuleGet-NetFirewallRule はPowerShellコマンドレットです。 コマンドプロンプトではなく、管理者権限のPowerShellで実行してください。

PS C:\Users\xxx> New-NetFirewallRule -DisplayName "WSL2-SSH-22" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 22

実行結果の例は次の通りです。

PS C:\WINDOWS\system32> New-NetFirewallRule -DisplayName "WSL2-SSH-22" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 22

Name                          : {50158745-fd6a-4068-99b0-6ed83972d555}
DisplayName                   : WSL2-SSH-22
Description                   :
DisplayGroup                  :
Group                         :
Enabled                       : True
Profile                       : Any
Platform                      : {}
Direction                     : Inbound
Action                        : Allow
EdgeTraversalPolicy           : Block
LooseSourceMapping            : False
LocalOnlyMapping              : False
Owner                         :
PrimaryStatus                 : OK
Status                        : 規則は、ストアから正常に解析されました。 (65536)
EnforcementStatus             : NotApplicable
PolicyStoreSource             : PersistentStore
PolicyStoreSourceType         : Local
RemoteDynamicKeywordAddresses : {}
PolicyAppId                   :
PackageFamilyName             :

DisplayNameWSL2-SSH-22EnabledTrueActionAllow になっていれば登録成功です。

既存ルールの確認例:

PS C:\Users\xxx> Get-NetFirewallRule -DisplayName "WSL2-SSH-22"

コマンドプロンプトで設定・確認したい場合は、次を実行します。

C:\Windows\System32>netsh advfirewall firewall add rule name="WSL2-SSH-22" dir=in action=allow protocol=TCP localport=22
C:\Windows\System32>netsh advfirewall firewall show rule name="WSL2-SSH-22"

設定を解除する手順

検証後に設定を元へ戻す場合は、Windows側で次を実行します。

C:\Windows\System32>netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=22
C:\Windows\System32>netsh advfirewall firewall delete rule name="WSL2-SSH-22"

接続確認

同一Windowsホストから確認

PS C:\Users\xxx> ssh <wsl-user>@127.0.0.1

同一LAN上の別端末から確認

PS C:\Users\xxx> ssh <wsl-user>@<windows-host-ip-address>

ここで指定するIPアドレスは、WSL2側Linux環境のIPアドレスではなく、WindowsホストのIPアドレスです。

トラブルシュート

  1. Windows側でportproxy設定があるか確認する(netsh interface portproxy show v4tov4
  2. Windowsファイアウォール受信ルールを確認する(Transmission Control Protocol(TCP)の22番ポート)
  3. WSL再起動後にIPアドレスが変わった場合はportproxyのconnectaddressを更新する

補足

Wi-Fi経由で通信している場合、接続先として使うWindowsホストのIPアドレスはDHCPで貸与されています。 48時間などに設定されている場合があります(24時間や72時間など値は環境ごとに異なります。)。 リース更新時は同じIPアドレスが継続される場合もありますが、再接続や再起動のタイミングでIPアドレスが変わることがあるため、 接続不良時はWindowsホストのIPアドレスとportproxy設定を再確認してください。