はじめに
以前、「Windows OpenSSHで公開鍵認証が通らない時の解決策」という記事を公開したところ、コメントで以下のアドバイスをいただきました。
mirrored modeを使えばTailscale経由でWSLに直接SSHできるので、そちらの方が楽だと思います。
確かに、Windows経由でWSL2にアクセスするより、直接WSL2へSSH接続できた方がスマートです。早速試してみたところ、予想外のポート競合問題に遭遇したため、解決過程を共有します。
環境
- OS: Windows 11 + WSL2 (Ubuntu 24.04)
- Tailscale: インストール済み、mirrored networking mode有効
- 既存構成: Windows OpenSSH Server(ポート2222で稼働中)
mirrored networking modeとは
WSL2の.wslconfigで以下を設定することで有効化:
[wsl2]
networkingMode=mirrored
このモードでは、WSL2がWindowsのネットワークスタックを共有するため、Tailscale経由でWSL2に直接アクセスできるようになります。
目標
- WSL2のUbuntu環境へTailscale経由で直接SSH接続
- Windows経由のプロキシ接続を排除
- 公開鍵認証による安全な接続
遭遇した問題
エラー: Address already in use
WSL2でOpenSSH Serverを起動しようとしたところ、以下のエラーが発生:
$ sudo service ssh restart
Job for ssh.service failed because the control process exited with error code.
$ systemctl status ssh.service
× ssh.service - OpenBSD Secure Shell server
Active: failed (Result: exit-code)
1月 28 00:34:21 hostname sshd[2727]: error: Bind to port 2222 on 0.0.0.0 failed: Address already in use.
1月 28 00:34:21 hostname sshd[2727]: error: Bind to port 2222 on :: failed: Address already in use.
1月 28 00:34:21 hostname sshd[2727]: fatal: Cannot bind any address.
原因: mirrored modeでのポート空間共有
Windows PowerShellで確認すると、Windows側のOpenSSH Serverがポート2222を使用中でした:
PS> netstat -ano | findstr :2222
TCP 0.0.0.0:2222 0.0.0.0:0 LISTENING 58508
TCP [::]:2222 [::]:0 LISTENING 58508
PS> Get-Service sshd
Status Name DisplayName
------ ---- -----------
Running sshd OpenSSH SSH Server
mirrored modeでは、WindowsとWSL2がポート空間を共有するため、Windows側で2222を使用していると、WSL2側でも同じポートがバインドできません。
解決手順
1. Windows側のSSHサービス停止(一時的)
まず、Windows PowerShell(管理者権限)で:
Stop-Service sshd
Set-Service -Name sshd -StartupType Disabled
停止後も、既存のESTABLISHED接続が残っている場合があります。
2. WSL2の完全再起動
wsl --shutdown
30秒待機してからWSL2を再起動。
3. 必須ディレクトリの作成
WSL2内で、sshdに必要なディレクトリを作成:
sudo mkdir -p /run/sshd
sudo chmod 755 /run/sshd
このディレクトリが存在しないと、以下のエラーが発生します:
$ sudo /usr/sbin/sshd -t -f /etc/ssh/sshd_config
Missing privilege separation directory: /run/sshd
4. ポート番号の変更
Windows側と競合を避けるため、WSL2のSSHポートを2223に変更します。
sudo nano /etc/ssh/sshd_config
以下の行を変更:
- Port 2222
+ Port 2223
5. 公開鍵認証の設定
公開鍵をauthorized_keysに追加:
# 公開鍵をauthorized_keysに追加
cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
/etc/ssh/sshd_configで公開鍵認証が有効か確認:
grep -i "PubkeyAuthentication" /etc/ssh/sshd_config
# 出力: PubkeyAuthentication yes
6. SSH サービス再起動
sudo service ssh restart
sudo systemctl status ssh
成功すると以下の表示:
● ssh.service - OpenBSD Secure Shell server
Active: active (running)
1月 28 02:00:52 hostname sshd[1925]: Server listening on 0.0.0.0 port 2223.
1月 28 02:00:52 hostname sshd[1925]: Server listening on :: port 2223.
7. 接続テスト
WSL2内から自己接続
# Tailscale IPを確認
tailscale ip -4
# 例: 100.102.205.45
# 接続テスト
ssh -p 2223 user@100.102.205.45
パスワード入力なしで接続できればOK。
Termiusから接続
-
Host設定
- Alias:
WSL2 Ubuntu - Hostname:
<Tailscale IP> - Port:
2223 - Username:
user
- Alias:
-
秘密鍵のインポート
# WSL2でクリップボードにコピー cat ~/.ssh/id_ed25519 | clip.exeTermiusで「Keychain」→「Keys」→「Import」→ペースト
-
接続
Host一覧から「WSL2 Ubuntu」をダブルクリック →user@hostname:~$プロンプトが表示されれば成功。
まとめ
ポート2223運用のメリット
今回、ポート競合を避けるため2223を採用しましたが、これには以下のメリットがあります:
- セキュリティ向上: 標準ポート(22)や準標準(2222)を避けることで、自動スキャン攻撃のリスクを軽減
- Windows SSHとの共存: 将来的にWindows側のSSHも再度有効化したい場合に対応可能
- 動作への影響なし: SSHプロトコルはポート番号に依存しないため、全てのクライアントで問題なく動作
mirrored mode環境での注意点
- ポート空間が共有される: WindowsとWSL2で同じポートは使用できない
- Tailscaleの設定: WSL2でもTailscaleデーモンを起動する必要あり
-
ファイアウォール: WSL2側の
ufwは通常デフォルトで無効
次のステップ
- VS Code Remote-SSHでの接続設定
- Claude Code等の開発ツールとの統合
- ポート転送を活用した開発サーバーへのアクセス
関連記事
- [前編] Windows OpenSSHで公開鍵認証が通らない時の解決策
- [Zenn] 布団の中から自宅PCのClaude Codeを操作する —— Android × Tailscale × SSH 構築の記録
コメントやアドバイスをいただいた方に感謝します。
