Windows WSL上のSSHサーバーに対する追加設定(portproxy、ファイアウォール)の紹介
この記事は、Secure Shell(SSH)記事「【ネットワークコマンド】SSHコマンドの基本的な使い方:パスワード認証と公開鍵認証」を補足するためのメモです。 Windows Subsystem for Linux 2(WSL2)上に構築したSSHサーバーへ、SSHクライアントが接続できる状態を作る手順についてまとめました。
この記事では、WSL2上のLinuxへSSH接続するために追加で必要になる Windows側の設定(portproxyによるポート転送 / ファイアウォール)のみを扱います。
注意
インターネット公開を前提にした設定ではありません。 宅内ローカルエリアネットワーク(LAN)などの閉域環境での利用を前提にし、公開運用する場合は公開鍵認証・認証制限・監査ログなどを必ず追加してください。
目次
前提条件
このメモは、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 列の値(例: Ubuntu 、 Ubuntu-24.04)を確認します。
2. 対象ディストリビューションのIPアドレスを確認する
PS C:\Users\xxx> wsl -d Ubuntu -- hostname -I
このコマンドは、-d で指定したディストリビューション内で hostname -I を実行し、IPアドレスを表示します。 -- は「ここから後ろはLinux側で実行するコマンド」という意味です。
Ubuntu の部分は環境に合わせて置き換えてください (例: Ubuntu-24.04)。 wsl --list --verbose の NAME 列に表示される値を使います。
実行結果の例は次の通りです。
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 の結果で Ubuntu が Running、 docker-desktop が Stopped でした。 SSH接続先として使うLinux環境はUbuntuなので、次のコマンドでも -d Ubuntu を指定しています。
今回の実行結果では、hostname -I の出力として 172.24.124.119 が表示されました。 この値を portproxy の connectaddress に使います。
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-NetFirewallRule と Get-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 :
DisplayName が WSL2-SSH-22、 Enabled が True、 Action が Allow になっていれば登録成功です。
既存ルールの確認例:
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アドレスです。
トラブルシュート
- Windows側でportproxy設定があるか確認する(netsh interface portproxy show v4tov4)
- Windowsファイアウォール受信ルールを確認する(Transmission Control Protocol(TCP)の22番ポート)
- WSL再起動後にIPアドレスが変わった場合はportproxyのconnectaddressを更新する
補足
Wi-Fi経由で通信している場合、接続先として使うWindowsホストのIPアドレスはDHCPで貸与されています。 48時間などに設定されている場合があります(24時間や72時間など値は環境ごとに異なります。)。 リース更新時は同じIPアドレスが継続される場合もありますが、再接続や再起動のタイミングでIPアドレスが変わることがあるため、 接続不良時はWindowsホストのIPアドレスとportproxy設定を再確認してください。