36
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

wsl2のsshサーバーに他PCから接続できるよう自動設定する

TL;DR

  • @yabeenicoさんの記事 wsl2でsshサーバを起動し、外部からそこに接続 (Qiita) をもとにssh接続のためポートフォワード設定をやった。
  • 上の記事で省略されている、タスクスケジューラの設定をやってみた。
  • これだけではsshできず!sshの自動再起動スクリプトを設定することでsshできるようになった。

はじめに

日本時間5/28にWindows10 2004 がリリースされ、wslがwsl2にアップデートされました:tada:

このwsl2ではネットワークの仕様がwsl1と大きく変更されておりwsl1と同じ方法でsshサーバーを有効にすることができません。このあたりの事情と解決方法についてはInsider Previewで既にwsl2を試されていた方々が検証してくれています。

特に、@yabeenicoさんの記事[1]ではwsl2のネットワーク仕様からssh設定の自動化までが大変分かりやすくまとめられて、本当に勉強になります。

ただ、[1]の記事では作成したスクリプトの自動起動方法について以下のように触れられているだけです。(まあ本題じゃないですからね。)

このスクリプトを、タスクスケジューラでログオン時に自動起動するように設定すれば完了です。

タスクスケジューラ is なに???:thinking:
windows何もわからない自分はこの設定に数時間かかりました・・・

ということで、この記事では自分のような悲劇を再び生まないように、[1]をベースとしたwsl2のssh起動自動化方法を紹介します。

検証環境

  • Windows: Windows 10pro 2004
  • WSL2 (WSL1からバージョン変更したもの)
  • Linuxディストリビューション: Ubuntu (20.04および18.04)
  • Windowsの管理者アカウントを使用

wsl2側の設定

  • とりあえずwslでsshが入っていることを確認しておきましょう。
$ sudo apt install -y openssh-server
  • 以降の設定は[1]と基本的に同様です。

  • ポートフォワード用のシェルスクリプトをport-forward.shとして作成します

    • [1]では/opt/binに配置していますが、自分は/opt/に配置しています。
  • ファイルを作成します。(例はvimの場合)

$ sudo vim /opt/port-forward.sh
  • 以下を作成したファイルに入力します。
/opt/port-forward.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                                                                                 
  • rootにのみ実行権限を付けておきましょう。
$ sudo chmod 700 /opt/port-forward.sh

windows側のスクリプト作成

  • 上のスクリプトをwslに叩かせるためのスクリプトを作成します。
  • 自分はドキュメントフォルダ%homepath%\Documentsport-forward.batとして作成しました。
    • もし複数のディストリビューションをインストールされている場合は設定したいものを-d <ディストリビューション名>で指定する必要があります。
    • rootにのみ実行権限を付けているため、[1]の例とは異なりwslのrootユーザーとして実行する必要があります。
port-forward.bat
wsl -u root --exec /bin/bash /opt/port-forward.sh

rem Ubuntuというディストリビューションを指定するときは以下のコマンド。
rem wsl -d Ubuntu -u root --exec /bin/bash /opt/port-forward.sh

win-shell.png

タスクスケジューラの設定

  • ここからが本題です。
  • スタートメニューでスケジューラと入力するとタスクスケジューラが表示されるのでクリックしてください。

search-scheduler.png

  • タスクの作成をクリック

Click-Newtask.png

  • この画面でタスクの詳細な設定を行います。
    • 名前はwsl-port-forwardとしました。(適当でいいです。)
    • 今回はコンピューターがスタートアップ時点で(ログオン前に)タスクを実行させたいためユーザーがログオンしているかどうかにかかわらず実行するにチェックをいれます。
      • なん となくパスワードを保存しないにチェックをいれます。
    • ポートフォワーディングの実行には管理者権限が必要なため、最上位の特権で実行するにチェックを入れます。
    • 構成をWindows 10に変更します。

create-task-port-forward.png

  • タスクの実行タイミングを指定します。トリガータブに移動し新規をクリックします。

Scheduler-Triger.png

  • タスクの開始でプルダウンからスタートアップ時を選択、OKで閉じます。

Shcheduler-Triger-New.png

  • 次に実行するスクリプトの指定です。操作タブに移動し、新規をクリックします。

Scheduler-Job.png

  • 操作はプログラムの開始のまま、参照ボタンからプログラム/スクリプトの欄に先ほど作成したport-forward.batのパスを入力します。OKで閉じます。

Shcheduler-Job-NewJob.png

  • これでタスクの登録は終了です。OKを押してタスクの作成ウィンドウを閉じてください。なお、作成したタスク一覧はタスクスケジューラのタスクスケジューラ ライブラリから確認できます。
  • では再起動してsshができるようになっているか確認してみましょう!

問題発生!

  • これでwsl2にsshできるようになる・・・ハズですが自分の環境ではうまくいきませんでした。
$ ssh <user名>@<IPアドレス>
kex_exchange_identification: Connection closed by remote host
  • どうやらwsl2にまでは到達できているものの何らかの問題がsshサーバーで発生しているようです。
  • いろいろ試したところsshのサービスをWindows起動時に再起動することでssh接続ができるようになりました。

sshサーバー再起動自動化

  • この操作も自動化したいので、sshのサービスをWinodws起動時に再起動するスクリプトを作成、タスクスケジューラに設定していきます。

  • 先ほどと同様に、ドキュメントのフォルダ%homepath%\Documentswsl2-ssh-restart.batとして以下のスクリプトを保存します。

wsl2-ssh-restart.bat
@echo off
wsl -u root -- service ssh restart

rem ubuntuというディストリビューションを指定するときは下のコマンド。
rem wsl -d Ubuntu -u root -- service ssh restart
  • 先ほどと同様にタスクスケジューラに設定します。
  • この操作は管理者権限が必要ないので、最上位の特権で実行するのチェックはつけません。

Scheduler-ssh.png

  • 操作 -> 新規 と進みます。実行するスクリプトとしてwsl2-ssh-restart.batのパスを入力します。 OKで閉じます。

Scheduler-Job-ssh.png

  • トリガー -> 新規と進み、からスタートアップ時にタスクを起動するよう設定します。

Scheduler-Triger-ssh.png

  • これで設定は終了です!お疲れさまでした。
  • 再起動してしばらく待ってからsshを実行してみましょう!
    • sshできるようになるまで1分ほど時間がかかります。

うまくいかないときは

  • コマンドプロンプトやpowershellを管理者権限で起動したうえで、作成した2つのスクリプトport-foward.batwsl2-ssh-restart.batを手で実行してみましょう。スクリプトに問題がなければこれでssh接続ができるようになるはずです。
  • ポートフォワードができているか不安な場合は[1]で紹介されている以下のコマンドをPowerShellで実行することでポートフォワードの状態を確認できます。
    • 以下のようになっていればOKです。(アドレスは違ってOK)
> netsh.exe interface portproxy show v4tov4

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

Address         Port        Address         Port
--------------- ----------  --------------- ----------
*               22          172.29.240.72   22
  • 設定したタスクが実行されているかはタスクスケジューラのタスクスケジューラ ライブラリから確認できます。

  • 低スペックなPCだとwslが起動する前にタスクが実行されてしまうことがあります。タスクスケジューラのトリガーの設定で、5分 ~ 15分程度の遅延時間を設定してもいいかもしれません。

Scheduler-Triger-ssh-delay.png

まとめ

  • [1] の記事で紹介されているスクリプトをタスクスケジューラで自動実行する方法についてまとめました。
  • 自分の環境(wsl1からwsl2へアップグレードした環境)によるものかもしれませんが、sshの再起動も必要でした。
  • @yabeenicoをはじめ記事を引用させていただいた方々、素晴らしい記事を本当にありがとうございました!

それでは楽しいwsl2ライフを!

引用させていただいた記事

変更履歴

  • (6/6) port-foward用のバッチファイルを一部修正(bash -> /bin/bash)
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
Sign upLogin
36
Help us understand the problem. What are the problem?