会社で起動してるWSL Ubuntuに、自宅からSSHでログインしたい。

(2024.11.4 追記)WindowsのOpenSSHサーバを利用して接続 > wsl.exe を実行…という方法を @hkuno さんにコメント欄で紹介していただきました。こちらの方法の方がより手軽だと思います。

https://qiita.com/yuskesuzki/items/9bfacf3beeb94222f266#comment-92e56e34508285306dc2

## はじめに

タイトルが何を言ってるのかよくわからんという話ですが、こういう事です。

Linuxを用いたちょっとした事を試したく、身近なLinuxを探してみたが手頃な環境が見つからない。AWSのEC2を起動するのも費用がかかってもったいない。

ということで、お手軽なLinux環境として、会社PCのWindows 10で使ってる、WSLのUbuntuを使うことにしてみました。ついでに自宅の環境からSSHでログインもさせたかったので、その設定も追加してみました。

## WSL2の有効化、Ubuntuの利用

WSL2はすでにWindows PCに導入が完了してる前提とします。一応インストール方法書いとくと、`wsl --install` コマンドで導入します。

[参考] 「WSL を使用して Windows に Linux をインストールする方法
」 https://learn.microsoft.com/ja-jp/windows/wsl/install

## UbuntuにSSHで接続させる

### WSL2のUbuntuにSSHで接続することについて

通常、WSLはWindows Terminalを介して、WSLが動くホストPCから使うのが通常の使い方です。ホストOSからSSH接続して使ったり、ましてや外部のマシンから接続させる必要は特にありません。[^1]

[^1]:macOSがUnix準拠のワークステーションですが、サーバ的な使い方がさほど求められていないのと似た感じですかね。ちょっと前のmacOSだとcron動かすのも面倒くさかった。

したがって、WSL環境にSSHでログインさせたい方は十分なセキュリティ対策を行った上で、これからやろうとすることが自己責任であることを理解しつつ、対応を行ってください。[^2]

[^2]:これを試して変なことが起きたら、それは試した君自身が悪いのだ、ガハハ…ということです。

### WSL2 Ubuntuにてsystemdを使えるようにする

ところで、WSL2はsystemdに対応しており、単体でインストールした通常のLinuxに近い仕組みを持っております。なので、これを有効にします。

vi, nano等のテキストエディタを使って `/etc/wsl.conf` ファイルを開きます。

```bash
$ sudo vi /etc/wsl.conf
```

以下の内容に編集して保存します。
```bash
[boot]
systemd=true
EOF
```

ホストOS側の、管理者モードで立ち上げたPowerShellに切り替え、wslを一旦シャットダウンします。シャットダウンしたかどうかイマイチわかりづらいですが、応答が戻ればシャットダウンされてます。

```PowerShell
wsl --shutdown
```

その後、Ubuntuを起動。psコマンドを実行し、この時点でWSLのPID 1にsystemdが立ち上がっていればsysytemdが有効になっています。

```
~$ ps -ae
    PID TTY          TIME CMD
      1 ?        00:03:31 systemd
```

### sshを有効化し、sshサービスを起動する

引き続き WSLのUbuntu にて sshd を使えるようにします。

```
# systemctlでsshの機能を有効にする
sudo systemctl enable ssh

# sshで利用する秘密鍵等が揃ってないため、用意する
sudo ssh-keygen -A
```

最低限のセキュリティ対応を行うため /etc/ssh/sshd_config を編集します
```
$ sudo vi /etc/ssh/sshd_config
```

`#PasswordAuthentication yes` のコメントを外して有効にします。

```
#PasswordAuthentication yes
↓
PasswordAuthentication yes
```

その後、ssh サービスを起動します。
```
$ sudo service ssh start
```

### ホストOSからSSHで繋いでみる

この時点でホストOSからSSHで繋いでみましょう。ホストOSから localhost を指定することができるので、sshのコマンドは以下のようになります。[^3]

```
ssh [wsl username]@localhost

例) ssh ubuntu@localhost
```

[^3]: このとき、Windowsのご機嫌次第ではlocalhostを指定しても、WSLに通信できない場合もあり、その場合、WSL側のOSでifconfigコマンドを実行し、結果として表示されるネットワークデバイス・eth0に割り当てられたipアドレスを指定してください。

このような反応が戻ってくれば、ホストOSからsshでの接続はできています。
```
The authenticity of host 'xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx)' can't be established.
ECDSA key fingerprint is SHA256:ZdX1KLJws7c8ayPeiRojjH+1jQi9j8Hah5PtNewOZQw.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Password: 
```

## 自宅から会社PCのWSLにリモートログインしたい

引き続き、このWSLのUbuntu環境に自宅からリモートログインできるようにしてみます。

自宅と会社、ネットワークのセグメントが全く異なりますので、接続するためにはVPSを経由してつなぎます。

今回は、WireGuard技術を用いた簡単VPSツール・Tailscaleを用いてみます。[^4]

[^4]: 自宅から会社側の機器と接続できるならVPSの種類は問いません。

### Tailscaleのインストール

こちらは導入済みという事で省略します。インストール方法はTailscaleのダウンロードページに簡単に記載されています。

Tailscaleは無料版であるFree Planでも3アカウントまで、合計100台の機器まで登録、接続することができて、なにかと便利です。

https://tailscale.com/download

### ホスト側OSにポートフォワード設定を行う

Tailscaleはインストールを行ったWindows PCに対しネットワーク接続はできます。

しかし、WSL2のOSは仮想ネットワークを介してホストOSと共存しており、通常、ホストOSからWSLネットワークに対し接続することもめんどくさくなってます。[^5]

[^5]: これが故に、Windowsのネットワークと変に交じる事もなく使いやすくなってるのですが、まあその辺りは別の話。

そこでWSLが動くホストOS側に、外部のネットワークからの接続を行えるよう設定を行います。

WSLのホストOSはWindows側に、SSHのリクエストをWSL側OSに転送するため、管理者モードで立ち上げたPowerShellにポートフォワード設定を行います。

```
netsh.exe interface portproxy add v4tov4 listenaddress=* listenport=22 connectaddress=[ip_addr_of_wsl2]
```

Windows側でポートフォワードを起動するにはIP Helperサービスを起動する必要があるため、以下のコマンドも実行します。

```
sc.exe start  iphlpsvc
```

ポートフォワード設定がされているか確認するには以下のコマンドを実行します。
```
netsh.exe interface portproxy show v4tov4

例）
PS C:> netsh.exe interface portproxy show v4tov4

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

Address         Port        Address         Port
--------------- ----------  --------------- ----------
*               22          172.19.100.182  22
```

ポートプロキシ設定を削除するには以下のコマンドを入力します。

```
netsh.exe interface portproxy delete v4tov4 listenaddress=* listenport=22
```

### Tailscaleネットワークにログインする

自宅のPC、WSLが動く会社のPCそれぞれでTailscaleを有効にします。

これにより、100から始まるipアドレスがそれぞれの機器に割り当てられ、Tailscaleネットワークに所属している同士での通信が可能になります。

### 自宅からSSHコマンドでWSLのUbuntuに繋いでみる

会社のPCの方はWSLで動くOSをWindowsターミナルで動かした状態にしてください。

その後、wslが動く会社のPCのTailscale ipアドレスを指定して
```
ssh [wsl username]@100.xxx.xxx.xxx

例) ubuntu@100.104.33.41
```
として接続をしてみます。


```
% ssh ubuntu@100.104.33.41
Password:

Welcome to Ubuntu 22.04.2 LTS (GNU/Linux 5.15.146.1-microsoft-standard-WSL2 x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

 * Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8s
   just raised the bar for easy, resilient and secure K8s cluster deployment.

   https://ubuntu.com/engage/secure-kubernetes-at-the-edge
Last login: Sun May 26 12:40:54 2024
```

ということで自宅のPCから、会社のPCに接続することができました。

WSL側のsshd_configを変更すると、公開鍵認証による接続もできますので、パスワード入力が面倒な方は別途設定してみてください。