目次
WSLのインスタンスにリモートから接続する
WSLのインスタンス上のサーバーソフトウェアと、リモートのクライアントとを接続させる方法について記述する。さんざん擦られている内容だが、できるだけGUIを多用して、何をやっているかの解説を入れるというところで独自性を担保していきたいと思う。
サーバーソフトウェアを準備
WSL側でOpenSSH ServerやApache Web Serverなどの任意のサーバーソフトウェアを起動して、任意のポートでリッスンしている状態にしておく。複数のWSLインスタンスを管理している場合は、それぞれのリッスンポートがダブらないようにする。
たとえば筆者の場合、複数のWSLインスタンスでそれぞれOpenSSH Serverをtcp/22とtcp/2022で立ち上げている。一方の起動ログはこんな感じ。Open SSH ServerはTCPを使いServer listening on 0.0.0.0 port 2022
となっていることから、IPv4で、TCPの2022番ポートをリッスンしていることが分かる。
$ systemctl status sshd
Failed to dump process list for 'ssh.service', ignoring: Input/output error
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2024-04-02 16:19:08 JST; 826ms ago
Docs: man:sshd(8)
man:sshd_config(5)
Process: 61619 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
Main PID: 61620 (sshd)
Tasks: 2 (limit: 14999)
Memory: 11.1M
CGroup: /system.slice/ssh.service
Apr 02 16:19:08 arithmetica systemd[1]: Starting OpenBSD Secure Shell server...
Apr 02 16:19:08 arithmetica sshd[61620]: Server listening on 0.0.0.0 port 2022.
Apr 02 16:19:08 arithmetica sshd[61620]: Server listening on :: port 2022.
Apr 02 16:19:08 arithmetica systemd[1]: Started OpenBSD Secure Shell server.
何事もローカルから
念のためSSHでもHTTPでもなんでも、ホストマシン側(Windows 11)から、WSLのインスタンスへ接続できるかどうかを確認しておくとよい。この段階でチェックしておくと、後に問題が発生した場合にそれがポートフォワーディング以前の段階での問題なのか否かがわかる。
ssh [email protected] -p 2022 # シェルが出てきたら成功(適切に公開鍵が交換できているものとします)
リモートからのパケットを通過させる
Windowsファイアウォール側で、リモートからのパケットの通過を許可したいパケットの種類(プロトコルの種類など)やポートを設定しておく。TCPのポート番号と、UDPのポート番号は別物なので、混同しないように正しく設定すること。
Local Port | Windows側でリッスンしたい任意のポート(62022など) |
Remote Port | Any |
Protocol | サーバー側がリッスンする任意のプロトコル(今回はTCP) |
リバースプロキシを設定
portproxyを設定する。筆者の理解が正しければportproxyはWindowsに備わるリバースプロキシのようなもので、今回はそのリバースプロキシを特定のポート番号のパケットを別の接続先に転送するために使う。netsh interface portproxy
を使ってもよいが、今回はPortProxyGUIというソフトウェアを利用して楽をする。このソフトウェアを使うと、簡単にプロキシの管理ができるのでおすすめ。
Listen port | Windowsにリッスンさせたい任意のポート(62022など) |
Connect to | 127.0.0.1 (ループバックアドレス) |
Connect port | WSL側のアプリケーションがリッスンしているポート(今回は2022) |
リモートマシンからテスト
Windowsのホストアドレス(ここでは192.168.3.70
)と、開放しているポートに向けてアクセスが通れば成功である。ここでは、リモートの端末から以下のようなコマンドを叩いて、「SSH-2.0-OpenSSH_8.9p1 Ubuntu-3ubuntu0.6」という文字列が返ってくることから、宛先がOpenSSH Serverであることが分かる。
netcat 192.168.3.70 62022
# SSH-2.0-OpenSSH_8.9p1 Ubuntu-3ubuntu0.6
なお、ここで利用しているnetcatコマンドは、ncなどで通ることもある。netcatはデフォルトではTCP接続を張って、そこで通過したデータを標準出力に垂れ流す動作をする。一方、sshdは、接続が張られるとまず最初にこのような文字列を返すので、このような確認方法ができる。
以上。
コメント
コメントはありません。