Posted at

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


やりたいこと

以下のような構成の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に対してポートフォワーディングを行う必要があります。


ポートフォワーディング設定 (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

以上のコマンドを発行した時点で、ポートフォワーディングが有効になります(再起動不要)。

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


ポートフォワーディングの設定には、wsl2のIPアドレスが必要となります。

そのため、設定はwsl2側から行います。

また、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

にチェックを入れる必要があります。