Windows 11にインストールしたWSL2のUbuntuに、外部PCからsshでアクセスできるようにするための方法をメモ。

今回は自宅のLAN内で接続する方法についてメモ。今後、外からアクセスする方法についてもメモする予定。


環境

$ wslinfo --wsl-version
2.4.11

$ lsb_release -d
No LSB modules are available.
Description:	Ubuntu 24.04.2 LTS

手順

どの端末で作業するのかを明確にするため、以下の通り名前をつける。

  • 【Ubuntu】: WSL2内のUbuntu(ホスト)
  • 【Windows】: WSL2をインストールしているWindows 11
  • 【クライアント】: WSL2内のUbuntuに入りたいマシン (当方はOSX)

大まかな手順は以下の通り。

  1. 【Windows】事前準備
    • WSL2のインストール・設定 (ミラーモード にする ← 重要)
    • LAN-IP固定
    • ポート解放
  2. 【Ubuntu】sshdサーバーを建てる
    • sshライブラリのインストール
    • 起動・デーモン化
  3. 【クライアント】接続

【Windows】事前準備

WSL2のインストール

# コマンドプロンプトで実行する
wsl --install

OSのバージョンなどにこだわりがあれば、公式サイトなどを参考に指定する。

WSL2をミラーモードで起動する

ここがミソ。

~/.wslconfig に下記を追記して、WSLをミラーモードにする。(ここでの ~ は、Windows Cドライブのホームディレクトリ。)

[wsl2]
networkingMode=mirrored

# 一度wslを落として
wsl --shutdown

# 8秒ほど経過してからもう一度起動する
wsl

LAN-IPの固定

Windows側で設定する方法と、ルーターで設定する方法がある。
私は、ルーターで設定した。

LAN IPアドレス 固定 方法」などで調べれば、やり方がわかる。

ポート解放

CUI・GUIどちらで設定しても良い。私はGUIで実施した。

このサイトが写真付きでわかりやすかった。

  • プロトコル: TCP
  • ポート: 22

の送受信をプライベートネットワークで許可する (パブリックネットワークでの解放は危ないので注意)。

【Ubuntu】 sshdサーバーを建てる

sshライブラリのインストール

sshd (sshデーモン) を起動するのに必要なライブラリをインストールする。

sudo apt update     # ライブラリを最新に
sudo apt install ssh

起動・デーモン化

sshdの設定

sshのデーモンの設定を更新する。コメントアウトされているところをアンコメントしたり、新たに書き足したりする。

# sshのデーモンを更新
sudo vim /etc/ssh/sshd_config

# --------------------
Port 22
#AddressFamily any
AddressFamily inet      # IPv4
#AddressFamily inet6    # IPv6
ListenAddress 0.0.0.0
# ListenAddress ::
# --------------------

上記で、IPv4でのssh接続を受け入れるように設定している。これに関しては、接続できなかったときにいろいろ試行錯誤していた部分なので必ず必要なのか不明。

さらに、この設定ファイルに書くことで、公開鍵認証をできるようにしたり、パスワード認証を無効化したりできる。必要であれば該当部分をアンコメント・追記する。

sshdをデーモンとして登録する

以下のコマンドでデーモンとして登録する。

sudo systemctl enable ssh
# 止まっている状態で有効にしてもサービスは止まったまま
sudo systemctl start ssh

systemdについて詳しくなかったので調べた。

  • systemdはLinuxで利用されるデファクトスタンダードな初期化システムで、システムの起動時に各種サービスを立ち上げる役割を担います。
  • systemctlは、systemdの制御や管理のためのコマンドラインツールで、サービスの起動・停止・再起動や状態確認など、さまざまな操作ができるものです。

systemctlコマンド - Qiita

systemctl startsystemctl enable の違いは次の通りです:

  1. systemctl start: このコマンドは、指定したサービスを直ちに起動します。サービスが現在停止している場合、これにより即座に起動されます。

  2. systemctl enable: このコマンドは、指定したサービスがシステムの起動時に自動的に起動するように設定します。つまり、システムが再起動された際にもサービスが起動されるようになります。

要するに、start は手動でサービスを起動するためのコマンドであり、enable はシステムの起動時に自動的にサービスを起動するように設定するコマンドです。

https://openai.com/ja-JP/chatgpt/overview/

【クライアント】接続

接続してみる。

ssh <user-name>@<固定したLAN-IP>

で接続できればOK。

私の場合は追加でセキュリティーを高める設定をした。1. 公開鍵認証の設定 2. パスワード認証をできなくする などした。

注意点

  • Windowsがスリープになっているとログインできない
  • WSLが起動してないと繋がらない ← 意外と見落としがち
  • Windowsにもsshしたい人には向かないかも

コメント

これまでは netsh を使ってポートフォアワーディングしていたが、wslを立ち上げるたびにipアドレスが変わることが課題であった。今回のようにミラーモードにすることで解決する。

docker周りでのエラーがあったらしいが、現時点で不具合は認識できていない。

参考