Windows10にWSL2を設定してUbuntuをインストールしている状態で、sshサーバーを起動して外部のコンピューターから接続することができます。
ただし、WSL2の内部ではホストとなるWindows10とは違うネットワークが使われているためにポートフォワードする必要があります。sshであれば22/tcpをポートフォワードするように設定します。
ところが、WSL2のネットワークは起動する度にアドレスが変更されてしまいますので、固定的にポートフォワードを設定するだけではsshサーバーに到達することができません。
そこで、Windows10とWSL2にインストールしたUbuntuに動的にポートフォワードするような設定を追加していきます。
Ubuntuにsshサーバーをインストール
最初に、Ubuntuにsshサーバーをインストールします。ここでは、openssh-serverをインストールすることにします。
$ sudo apt install -y openssh-server
これだけでは、ホストキーが正しくない場合がありますので、次のようにして作成しておきます。
$ sudo ssh-keygen -A
ポートフォワード用のスクリプトを作成
Windows側から呼び出して実行するスクリプトを作成しておきます。
$ sudo vi /usr/local/bin/port-forward.sh
#!/bin/bash
IP=$(ifconfig eth0 | grep 'inet ' | awk '{ print $2 }')
netsh.exe interface portproxy delete v4tov4 listenport=22
netsh.exe interface portproxy add v4tov4 listenport=22 connectport=22 connectaddress=$(IP)
exit 0
$ sudo chmod +x /usr/local/bin/port-forward.sh
Windows10側のnetsh.exeコマンドでポートフォワードの設定をしているのですが、WSL2上のUbuntuでないと割り当てられているネットワーク・アドレスがわからないのでスクリプトをUbuntu側に作成しています。
Windows10側にバッチ・スクリプトを作成
上記のようにUbuntu側に作成したスクリプトを実行するためのバッチファイルをWindows10側に作成します。作成する場所は、%USERPROFILEとして「port-forward.bat」という名前で作成しています。
WSL --exec bash /usr/local/bin/port-forward.sh
WSL --exec sudo service ssh restart
WSL2側のUbuntuで実際のポートフォワードの設定を実行しているのですが、sshサーバーが正常に起動していないことがあるためserviceコマンドで再起動しています。
タスクスケジューラの設定
スクリプトの準備ができましたので、これらを自動実行するための設定を追加します。Windows10では、タスクスケジューラを使うことができますから検索して画面を開きます。
「タスクの作成」で、「全般」に入力していきます。
・「名前」は、任意の名前を入力します。
・「ユーザーがログオンしているかどうかにかかわらず実行する」にチェックを入れます。
一応、「パスワードを保存しない(P)(タスクがアクセスできるのはローカルコンピューターリソースのみ)」にもチェックを入れています。
・大事なのは、「最上位の特権で実行する」にチェックを入れておくことです。
・「構成」は「Windows 10」を選択しています。
「トリガー」は、「スタートアップ時」としています。
「操作」では、「新規」をクリックしてプログラムスクリプトを「参照」から選択して設定しています。
以上の設定をしたら、「OK」ボタンで新しいスケジュールを追加します。
再起動して設定を確認
以上が正しく設定できていれば、Windowsを再起動して外部のコンピューターからsshで接続することができます。
正常にポートフォワードの設定ができていれば、PowerShellからnetshコマンドで確認することができます。
PS C:\Users\User> netsh.exe interface portproxy show v4tov4
ipv4 をリッスンする: ipv4 に接続する:
Address Port Address Port
----------------- ------------- --------------- ----------
* 22 172.29.111.92 22
以上で、便利になったWindows10のWSL2を使用して更にsshも使用できるようになります。