Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

やりたいこと

以下のような構成の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
にチェックを入れる必要があります。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした