やりたいこと
以下のような構成のLANで、Host2からwsl2にssh接続する。
wsl2ではネットワーク構成が変更された
wsl1では良くも悪くもWindowsとLinuxが混ざり合っていました。
wsl1ではWindowsとLinuxが同じネットワークインターフェースを参照していました。
そのため、例えばwsl1のポート22でsshサーバを起動し、そこにHost2から接続したい場合、Host2はWindowsのポート22に接続するだけで、wsl1のsshサーバに接続できました。
wsl2の場合、LinuxはWindowsと仮想ネットワークで接続された別ホストとして扱われます。
そのため、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を以下に示します。
#!/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を以下に示します。
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
にチェックを入れる必要があります。