WSL2内のUbuntuに外部PCからsshする【2. WAN編】
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)
- 【Windows】事前準備
- WSL2のインストール・設定 (ミラーモード にする ← 重要)
- Docker desktopのインストール・設定
- cloudflareでドメインを買う
- cloudflare tunnelを作成
- 【Ubuntu】cloudflaredコマンドをインストールする
- cloudflaredコマンドをインストール
- 【クライアント】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を使えるようにする。
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
- ‘host.docker.internal’について: 公式ドキュメント
パブリックホスト名 (ドメイン・パス) は好きなのを設定して良い。サブドメインには、’.’を含められないみたい (サブサブドメインは使えない)。
ポートは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と同じ鍵で大丈夫だった)