🕌

外部PCからWSLのSSHに接続する

2024/02/07に公開

今までやる必要性を感じなかった

先日パルワールドのサーバーを立てる記事を書いた。
実際プレイするとカックカックで遊べたものではなかった。
マイクラならともかくハイエンドマシンを使うようなゲームで、
クライアントとサーバーを同居させるのは無理だ。

ということで別のPCにサーバーを立ててリモート接続するのをやろうとしたのだが、
実はこの方法やったことがなかった。
(NASのようなサーバー専用機ではあるけど)

リモートにあるWSLにLAN経由で接続するということだが、
調べるとすでに情報がたくさんあるので、
今回はいったんそれをまとめることにした。

ヾ(・ω<)ノ" 三三三● ⅱⅲ コロコロ♪

------------------- ↓ 本題はここから ↓-------------------

事前準備

WSL上にSSHDが稼働している前提。
パスワード認証設定とか鍵認証の準備などは説明しない。
接続設定する前に接続に関する情報を集めておく必要がある。

ServerPCのローカルIP

サーバーとなるPCのIPアドレスを調べておく
ipconfig コマンドで一覧表示されるうち、
外部と接続しているLANアダプタのアドレスを抑えておく

powershell
ipconfig
  Wireless LAN adapter Wi-Fi:
   IPv4 アドレス . . . . . . . . . . . .: 192.168.1.32

φ(..)カキカキ

WSLのIPアドレス

サーバーとなるPCでSSHサーバーが稼働しているWSLインスタンスのIPアドレス
こちらは ifconfig で表示される eth0inet の情報

powershell
ifconfig
   eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1472
        inet 172.18.166.75  netmask 255.255.240.0  broadcast 172.18.175.255

( ..)φメモメモ

クライアントPCに疎通確認

疎通確認用のツールを入れて、
疎通できないことを確認しておく

powershell
winget install Insecure.Nmap

ターミナルを再起動してPathを通しておく
ポート22の状態を確認すると

nmap 192.168.1.32 -p 22
  PORT   STATE    SERVICE
  22/tcp filtered ssh

ポート22は filtered で解放されていないということがわかる

ファイヤーウォールのポート開放

WindowsPCにはWindows Defenderというセキュリティツールが入っているが、
外部から接続する際にポートを開ける必要がある。
GUIツールでも可能だが、
ここではコマンドで実行
管理者権限のあるPowershell上で行う

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

参考:
https://github.com/microsoft/WSL/issues/4150#issuecomment-504209723

netshでポートフォーワーディング

先ほどメモしたWSLインスタンスのIPアドレス 172.18.166.75
今度はServerPCがポート22で受けたものをWSLインスタンスのポートに割り当てる必要がある
ややこしいのでWSLのポートを 61546 とする。

bash
netsh interface portproxy add v4tov4 listenport=22 listenaddress=0.0.0.0 connectport=61546 connectaddress=172.18.166.75
netsh interface portproxy show all

ipv4 をリッスンする:         ipv4 に接続する:

Address         Port        Address         Port
--------------- ----------  --------------- ----------
0.0.0.0         22          172.18.166.75   61546

再度疎通確認

疎通設定ができたので外部PCから疎通確認してみる

nmap 192.168.1.32 -p 22
  PORT   STATE SERVICE
  22/tcp open  ssh

ポート22は open で解放されていることがわかる

SSHで接続

ではSSHでサーバーPCに接続してみる。

ssh user@192.168.1.32
  Last login: Tue Feb  6 23:37:09 2024 from 172.18.160.1
  [user@DESKTOP-xxxxx ~]$

('ω') つながった

今回異なる目的で試してみたものの、
結構応用範囲が広い内容だなと感じた。
今後の参考にしていこう

------------------- ↓ 後書きはここから ↓-------------------

NetFireWallRuleコマンド

ファイヤーウォール設定のコマンドを整理しておく
設定名称を WSL 2 Firewall Unlock、ポートを 22、プロトコルを TCP とすると

追加

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

削除

powershell
Remove-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' 

netshコマンド

ポートフォーワーディングツールのコマンドを整理しておく
設定名称を v4tov4、外部PCからの接続ポートを 22
WSLインスタンスのIPアドレスを 172.18.166.75 、ポートを 61546 とすると
(0.0.0.0は固定値)

追加

powershell
netsh interface portproxy add v4tov4 listenport=22 listenaddress=0.0.0.0 connectport=61546 connectaddress=172.18.166.75

確認

powershell
netsh interface portproxy show v4tov4

削除

powershell
netsh interface portproxy delete v4tov4 listenport=61546 listenaddress=0.0.0.0

次のヘルパー DLL を読み込めません: PEERDISTSH.DLL

netshを使うと毎回エラーとして出るが、
はっきり言って無視でいい。

Discussion