外部の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です。
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
ファイアウォールの設定
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です。
外部のWindowsパソコンからSSHでWSLに接続
外部パソコンのPowerShellやコマンドプロンプトから、以下のコマンドでWSL環境に接続します。
ssh <ユーザ名>@<WindowsのIPアドレス>
以上で、外部のWindowsパソコンからWSL環境への接続は終了です。