(2024.11.4 追記)WindowsのOpenSSHサーバを利用して接続 > wsl.exe を実行…という方法を @hkuno さんにコメント欄で紹介していただきました。こちらの方法の方がより手軽だと思います。
はじめに
タイトルが何を言ってるのかよくわからんという話ですが、こういう事です。
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
したがって、WSL環境にSSHでログインさせたい方は十分なセキュリティ対策を行った上で、これからやろうとすることが自己責任であることを理解しつつ、対応を行ってください。2
WSL2 Ubuntuにてsystemdを使えるようにする
ところで、WSL2はsystemdに対応しており、単体でインストールした通常のLinuxに近い仕組みを持っております。なので、これを有効にします。
vi, nano等のテキストエディタを使って /etc/wsl.conf
ファイルを開きます。
$ sudo vi /etc/wsl.conf
以下の内容に編集して保存します。
[boot]
systemd=true
EOF
ホストOS側の、管理者モードで立ち上げたPowerShellに切り替え、wslを一旦シャットダウンします。シャットダウンしたかどうかイマイチわかりづらいですが、応答が戻ればシャットダウンされてます。
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
このような反応が戻ってくれば、ホスト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
Tailscaleのインストール
こちらは導入済みという事で省略します。インストール方法はTailscaleのダウンロードページに簡単に記載されています。
Tailscaleは無料版であるFree Planでも3アカウントまで、合計100台の機器まで登録、接続することができて、なにかと便利です。
ホスト側OSにポートフォワード設定を行う
Tailscaleはインストールを行ったWindows PCに対しネットワーク接続はできます。
しかし、WSL2のOSは仮想ネットワークを介してホストOSと共存しており、通常、ホストOSからWSLネットワークに対し接続することもめんどくさくなってます。5
そこで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を変更すると、公開鍵認証による接続もできますので、パスワード入力が面倒な方は別途設定してみてください。
-
macOSがUnix準拠のワークステーションですが、サーバ的な使い方がさほど求められていないのと似た感じですかね。ちょっと前のmacOSだとcron動かすのも面倒くさかった。 ↩
-
これを試して変なことが起きたら、それは試した君自身が悪いのだ、ガハハ…ということです。 ↩
-
このとき、Windowsのご機嫌次第ではlocalhostを指定しても、WSLに通信できない場合もあり、その場合、WSL側のOSでifconfigコマンドを実行し、結果として表示されるネットワークデバイス・eth0に割り当てられたipアドレスを指定してください。 ↩
-
自宅から会社側の機器と接続できるならVPSの種類は問いません。 ↩
-
これが故に、Windowsのネットワークと変に交じる事もなく使いやすくなってるのですが、まあその辺りは別の話。 ↩