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

今回は自宅外のネットワークからアクセスする方法について。


環境

$ 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のインストール・設定 (ミラーモード にする ← 重要)
    • Docker desktopのインストール・設定
    • cloudflareでドメインを買う
    • cloudflare tunnelを作成
  2. 【Ubuntu】cloudflaredコマンドをインストールする
    • cloudflaredコマンドをインストール
  3. 【クライアント】cloudflaredコマンドをインストールする

【Windows】事前準備

WSL2のインストール

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

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

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

ここがミソ。

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

[wsl2]
networkingMode=mirrored

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

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

Docker desktopのインストール・設定

公式ドキュメントなどを参考にWindows11にインストールする。

WSL2で使えるようにするため、「歯車マーク」>「Resources」>「WSL integration」から、WSL2のUbuntuでdockerを使えるようにする。

2025-03-12-docker-desktop-wsl.png

Dockerが動いていないと接続できないので、「PCを起動した時にDockerも起動する」ように設定しておくとよさそう。

cloudflareでドメインを買う

私はすでに買っていたのでスキップ。ドメインを買わなくてもDNSをcloudflareにすれば良い、らしい。

cloudflare tunnel作成

Cloudflare Zero Trustを利用できるようにする。Cloudflareダッシュボードから「Zero Trust」を選んで初期設定。Team nameやPlanを適当に設定する。Freeで十分そう。

Zero Trustのサイドバーの 「ネットワーク」>「Tunnels」からトンネルを作成する。

  • トンネルの種類: Cloudflared
  • サービス: SSH://host.docker.internal:22

パブリックホスト名 (ドメイン・パス) は好きなのを設定して良い。サブドメインには、’.’を含められないみたい (サブサブドメインは使えない)。

ポートは22番以外でも良いと思ったのだけれど、他の番号にするとうまくいかなかった。原因不明。

続いて、認証に関する設定をするため「Access」>「アプリケーション」からアプリケーションを追加する。

以下は、私の設定した例。

  • アプリケーションの種類: SELF-HOSTED
  • 「基本情報」>「パブリック ホスト名を追加」
    • 入力方法: デフォルト
    • パブリックホスト名: 先ほど設定したトンネルと同じやつ
  • ポリシー
    • アクション: Allow
    • ルール: Emails

【Ubuntu】cloudflaredコマンドをインストールする

Zero Trustのサイドバーの 「ネットワーク」>「Tunnels」からすでに作成済みのtunnelのインストールコマンドをコピーする。

今回はDocker上にインストールする。

「Docker」アイコンを選んでコマンドをコピーする。少し改変して使う。

# 元のコマンド
# docker container run cloudflare/cloudflared:latest tunnel --no-autoupdate run --token <your-private-token>

# 改変後のコマンド1 (自動でリスタートさせたい場合)
docker container run --name cloudflare-tunnel -d --restart=always cloudflare/cloudflared:latest tunnel --no-autoupdate run --token <your-private-token>

# 改変後のコマンド2 (毎回手動で実行する場合)
docker container run --name cloudflare-tunnel -d --rm cloudflare/cloudflared:latest tunnel --no-autoupdate run --token <your-private-token>

改変のポイントは以下。

  • --name cloudflare-tunnel: コンテナに名前をつけるため。コンテナを探しやすくする。
  • -d: デーモン化。バックグラウンドで実行する。
  • --restart=always: コンテナが止まると自動で再起動する。
  • --rm: コンテナを消したときにそのコンテナを削除する。

リスタートする場合、止めても止めても起動してしまうので、以下のコマンドで restart=no にしてから消す。

# restart=noにする
docker update --restart=no

# コンテナを止める
docker container stop cloudflare-tunnel

dockerのコンテナがうまく起動してトンネルが作れたら、Zero Trustのサイドバーの 「ネットワーク」>「Tunnels」から「ステータス」を確認できる。’HEALTHY’ならちゃんとトンネルが掘れている。

【クライアント】cloudflaredコマンドをインストールする

当方はOSXなので、Homebrewでインストールした。

brew install cloudflared

私は、以下の通り~/.ssh/configを設定した。

Host wsl
  HostName <設定したパブリックドメイン>
  User <your-user-name>
  ProxyCommand /opt/homebrew/bin/cloudflared access ssh --hostname %h
  IdentityFile <秘密鍵のパス>

その後、下記コマンドを実行する。実行後、自分で設定した認証方法で認証後、ログインできる。

ssh wsl

私の場合は、メールアドレスを入力してワンタイムパスワードで認証する設定になっている。これで接続できればOK。

注意点

  • ホストのポートは開けなくてよい
  • wslが起動してないと接続できない
  • dockerコンテナが動いてないと接続できない

コメント

  • 公開鍵認証もできる (LAN内SSHと同じ鍵で大丈夫だった)

参考