COMPUTER WSL

外部のWindowsパソコンからSSHでWSLに接続しよう

外部のWindowsパソコンからSSHでWSLに接続する手順

Windows上で、手軽にLinux環境が構築できるWSL(Wiindows Subsystem for Linux)ですが、外部のパソコンからSSHを使ってWSLに接続するには、少し手間がかかります。
今回は、外部のWindowsパソコンから、SSHを使ってWSL環境に接続する手順を備忘録として書いておきます。
なお、WSLはデフォルトではインストールされていませんので、WSLを使ってみたい方は、以下のリンクを参照して、WSLをインストールしてください。

WSL環境の設定

まず、WSL環境側の設定を見ていきましょう。
WSL環境の設定手順は、以下のようになります。
操作は、WSLのターミナルから行います

手順

  • WSLのIPアドレスの確認
  • SSHホスト鍵の作成
  • SSHサーバの再起動

WSLのIPアドレスの確認

WSLはバージョン2から、WSLが稼働しているWindowsのネットワークとは別に、独自の仮想ネットワークを構成しています。
そのため、まずWSLのIPアドレスを確認する必要があります。
WSLの標準ディストリビューションであるUbuntuでは、以下のようなコマンドで、IPアドレスを取得することができます。

ip address show

ただ、上記のコマンドでは、不要な情報も表示されてしまいます。
少し長いですが、以下のコマンドで、IPアドレスのみを表示できます。

ip address show eth0 | grep 'inet ' | awk '{split($2,ipa,"/");print ipa[1]}'

SSHホスト鍵作成

WSLはデフォルトでSSHホスト鍵が作成されていないで、以下のコマンドでSSHホスト鍵を作成します。

sudo ssh-keygen -A

/etc/ssh配下に、枠のような ssh_host_〇〇.key や ssh_host_〇〇.key.pub というファイルが作成されていればOKです。

wsl1-1

SSHサーバ再起動

SSHホスト鍵を作成したら、SSHサーバを再起動します。

sudo service ssh restart

* Restarting OpenBSD Secure Shell Server sshd [OK] と表示されればOKです。

これで、WSL環境側の準備は完了です。

WSLが稼働しているWindowsの設定

次に、WSLが稼働しているWindows側の設定を行います。
Windows側の設定手順は、以下のようになります。
操作は、管理者権限で実行したPowerShellのターミナルから行います

手順

  • WindowsのIPアドレスの確認
  • ポートフォワーディングの設定
  • ポートフォワーディングの確認
  • ファイアウォールの設定

WindowsのIPアドレスの確認

WindowsのIPアドレスは、以下のコマンドで確認します。

ipconfig

または

Get-NetIPAddress

ただ、上記のコマンドでは、多くの不要な情報も表示されてしまいます。
少し長いですが、以下のコマンドで、IPアドレスのみを表示できます。

([system.net.dns]::GetHostAddresses((hostname)) | where {$_.AddressFamily -eq "InterNetwork"}).IPAddressToString

ポートフォワーディングの設定

WSLの仮想ネットワークは、そのままでは外部のパソコンからアクセスできません。
そこで、WSLが稼働しているWindowsのIPアドレスのポート番号と、WSLのIPアドレスのポート番号を紐付ける必要があります。
ポートフォワーディングをすると、外部のパソコンからWSLが稼働しているWindowsパソコンのIPアドレスを使って、WSLに接続することができるようになります。

netsh interface portproxy add v4tov4 listenaddress=<WindowsのIPアドレス> listenport=22 connectaddress=<WSLのIPアドレス> connectport=22

ポートフォワーディングの確認

以下のコマンドで、ポートフォワーディングの設定を確認します。

netsh interface portproxy show v4tov4

wsl1-2

ファイアウォールの設定

SSHは22番ポートを使って通信しますが、ファイアウォールでブロックされているので、22番ポートを開放する必要があります。
以下のコマンドで、ファイアウォールの22番ポートを開放します。

New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Outbound -LocalPort 22 -Action Allow -Protocol TCP
New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Inbound -LocalPort 22 -Action Allow -Protocol TCP

ファイアウォールの確認

以下のコマンドで、ファイアウォールの設定を確認することができます。
このコマンドは、Get-NetFirewallRuleでDisplayNameが 'WSL 2 Firewall Unlock' のオブジェクトを取得して、Get-NetFirewallPortFilterでそのポートの状態を表示します。
Format-Tableは、出力結果をテーブル表示にします。

Get-NetFirewallRule -DisplayName 'WSL 2 Firewall Unlock' | Get-NetFirewallPortFilter | Format-Table

以下のように、TCPの22番ポートが、それぞれAnyになっていればOKです。

wsl1-3

外部のWindowsパソコンからSSHでWSLに接続

外部パソコンのPowerShellやコマンドプロンプトから、以下のコマンドでWSL環境に接続します。

ssh <ユーザ名>@<WindowsのIPアドレス>

以上で、外部のWindowsパソコンからWSL環境への接続は終了です。

-COMPUTER, WSL
-