LoginSignup
256
241

More than 3 years have passed since last update.

wsl2でsshサーバを起動し、外部からそこに接続

Last updated at Posted at 2019-07-03

やりたいこと

以下のような構成のLANで、Host2からwsl2にssh接続する。
lan.png

wsl2ではネットワーク構成が変更された

wsl1では良くも悪くもWindowsとLinuxが混ざり合っていました。
wsl1ではWindowsとLinuxが同じネットワークインターフェースを参照していました。
wsl1.png

そのため、例えばwsl1のポート22でsshサーバを起動し、そこにHost2から接続したい場合、Host2はWindowsのポート22に接続するだけで、wsl1のsshサーバに接続できました。 

wsl2の場合、LinuxはWindowsと仮想ネットワークで接続された別ホストとして扱われます。
wsl2.png

そのため、Host2からWindowsのポート22に接続しても、wsl2のsshサーバに接続することはできません。
そこで、Windowsのポート22からwsl2のポート22に対してポートフォワーディングを行う必要があります。

ssh サービスの起動 (wsl2)

wsl2 で以下を実行

sudo service ssh restart

ポートフォワーディング設定 (cmd)

以下のコマンドで、Windows(listenaddress)のポート22(listenport)に来たパケットをwsl2(connectaddress)のポート22(connectport)に転送する設定が行えます。
(実行するには管理者権限が必要)

> netsh.exe interface portproxy add v4tov4 listenaddress=localhost listenport=22 connectaddress=[ip_addr_of_wsl2] connectport=22

例: Windowsのポート22に来たパケットをwsl2のポート22に転送 (listenaddress, connectportは省略)

> netsh.exe interface portproxy add v4tov4 listenport=22 connectaddress=192.168.100.200

ポートフォワーディングを動作させるためには、IP Helper サービスを起動する必要があります。

> sc.exe config iphlpsvc start=auto # ブート時の自動起動設定
> sc.exe start  iphlpsvc            # サービスの起動

以上のコマンドを発行した時点で、ポートフォワーディングが有効になります(再起動不要)。
Windoswのファイアウォールやwsl2のsshサーバの設定が適切であれば、Host2からssh接続が可能となります。

設定確認

> netsh.exe interface portproxy show v4tov4
Listen on ipv4:             Connect to ipv4:

Address         Port        Address         Port
--------------- ----------  --------------- ----------
*               22          192.168.100.200  22

(左から listenaddress, listenport, connectaddress, connectport)

設定削除

> netsh.exe interface portproxy delete v4tov4 listenport=22

(listenport=22 connectaddress=192.168.100.200 connectport=22 のように絞り込んでも良い)

自動化

Windowsの起動時にポートフォワーディングの設定を自動的に行う方法を示します。

wsl2からnetsh.exeを叩き、ポートフォワーディングの設定を行うport_forwarding_22.shを以下に示します。

/opt/bin/port_forwarding_22.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 connectaddress=$IP

sc.exe config iphlpsvc start=auto
sc.exe start  iphlpsvc

ポートフォワーディングの設定には、wsl2のIPアドレスが必要となります。
そのため、設定はwsl2側から行います。
(コメント欄で、Windowsから設定を行う方法が紹介されています)
また、wsl2のIPアドレスはWindowsが再起動するたびに変化するので、ポートフォワーディングの設定を行う前に、古い設定を削除する必要があります。

Windows側からport_forwarding_22.shをwsl2上で実行させるport_forwarding_22.batを以下に示します。

port_forwarding_22.bat
wsl --exec bash /opt/bin/port_forwarding_22.sh

rem ディストリビューションを指定する場合の例
rem wsl -d Ubuntu-18.04 --exec bash /opt/bin/port_forwarding_22.sh 

このスクリプトを、タスクスケジューラでログオン時に自動起動するように設定すれば完了です。
注意点としては、タスクのプロパティにおいて、
General -> Security options -> Run with highest privileges
にチェックを入れる必要があります。

256
241
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
256
241