はじめに
自宅のiPhoneから、Windows 11上のWSL2で動くUbuntu 24.04へSSH接続し、Claude Code や Codex CLI を活用する手順を、やさしいステップでまとめました。
前提は次のとおりです。
- WSL2に Ubuntu 24.04 は導入済み
- Claude Code と Codex CLI は導入済み
- OpenSSHサーバー は未導入
- 自宅LAN内でPCとiPhoneが同じネットワーク内にいる
本記事は自宅LAN内での接続が主眼です。外出先から使いたい場合(VPN経由)はセキュリティ節で補足します。
全体像
iPhone側の準備(無料アプリ)
- Termius – SSH Client をおすすめします。無料の範囲でも十分に使え、キー入力補助や複数接続の管理がしやすいです。
- App StoreでTermiusをインストールして、まずはローカル保存の設定で使い始めて大丈夫です。
構成の選び方
- 方式A(推奨):WSL2を ミラーモード にして、iPhoneからWSLに直接SSHします。シンプルで安定しやすいです。
- 方式B(代替):NATのまま Windowsでポート転送 を行います。既存運用の都合でミラーモードが使えない場合に選びます。
手順A:ミラーモードで直接つなぐ(推奨)
1. Windows側(.wslconfig にネットワーク&リソース設定)
-
%UserProfile%
(実体は通常C:\Users\<ユーザー名>
) にある(または作成する).wslconfig
を編集します。
ミラーモードとメモリ・CPU上限を一緒に設定しておくと、EDAワークロードでも安定しやすいです。
[wsl2]
networkingMode=mirrored
memory=8GB # 開発環境に応じて調整します
processors=4 # お使いのCPUコア数に合わせて調整します
- 反映のためWSLを停止して再起動します。
wsl --shutdown
# その後、Windows TerminalなどからUbuntuを起動
ルーターのDHCPで、WSL2のアドレスを 固定IP にしておくと、毎回同じIPで接続できて便利です(環境によってはPCのIPで接続する方式になります。詳細は末尾の「WSLのIPアドレスについて」をご覧ください)。
2. Ubuntu側:OpenSSHサーバーの導入と起動
# パッケージ更新
sudo apt update
# OpenSSHサーバー導入
sudo apt install -y openssh-server
# 必要に応じて設定を追加(IPv4限定やキープアライブ)
sudo bash -lc 'cat >/etc/ssh/sshd_config.d/10-wsl.conf <<EOF
AddressFamily inet
ListenAddress 0.0.0.0
# サーバー側キープアライブ(任意・切断対策)
ClientAliveInterval 120
ClientAliveCountMax 3
EOF'
# サービス起動と自動起動
sudo systemctl enable ssh
sudo systemctl start ssh
# 稼働確認
systemctl status ssh
3. WSL2のLAN内IPアドレスを確認(目安)
hostname -I
# 例: 192.168.0.50 などが表示されます(環境により 172.* 系が出ることもあります)
重要:ミラーモードでは「PCのIP(WindowsのLAN IP)で接続する」のが基本です。
hostname -I
の数値はWSL内部の確認用と捉えてください(詳細は末尾の補足を参照)。
4. iPhone(Termius)から接続
Termius → Hosts → +
で新規ホストを追加します。
- Host:PCのLAN IP(例:
192.168.0.20
) - Port:
22
- User:Ubuntuのユーザー名
- Auth:まずはPassword(後で公開鍵認証に移行するのがおすすめです)
- Keep Alive:有効化するとモバイルでも安定します
保存してタップすると接続します。初回はホスト鍵の承認ダイアログが出ますので、内容を確認して受け入れてください。
手順B:NATのままWindowsでポート転送(代替)
- WSL2内でWSL側IPを確認します(NATでは
172.*
などになります)。
hostname -I
# 例: 172.29.80.10
-
PowerShell(管理者)でポート転送を設定します。
※PowerShellの行継続は バッククォート ` です(^ は cmd.exe 用)。
netsh interface portproxy add v4tov4 `
listenaddress=0.0.0.0 listenport=22 `
connectaddress=172.29.80.10 connectport=22
便利コマンド:
# 確認
netsh interface portproxy show all
# 削除
netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=22
- Windowsファイアウォールで 受信 22/tcp をプライベートに許可 します。
- iPhoneからは WindowsのLAN内IP(例:
192.168.0.20
)にSSH接続します。
WSLのIPは起動で変わることがあります。変わったら
connectaddress
を更新する必要があります。スクリプト化すると楽です。
自動起動(Windows起動時にWSL2側のsshdを立ち上げる)
WSL2はWindows起動時に自動では立ち上がりません。次のいずれかで対処します。
1) タスク スケジューラでログオン時に起動(簡単)
-
トリガー:「ログオン時」
-
操作:
- プログラム:
wsl.exe
- 引数:
-d Ubuntu-24.04 --exec sudo systemctl start ssh
- プログラム:
-
「最上位の特権で実行する」をオンにします。必要に応じて「ユーザーがログオンしているかどうかにかかわらず実行する」を選びます。
2) サインイン後に手動起動(最小手間)
wsl.exe -d Ubuntu-24.04 --exec sudo systemctl start ssh
接続できないときの確認フロー
よく使うコマンド早見表
目的 | コマンド | メモ |
---|---|---|
WSL停止 | wsl --shutdown |
.wslconfig 反映に必要です |
OpenSSH導入 | sudo apt install -y openssh-server |
まずはこれです |
SSH起動 | sudo systemctl start ssh |
status で稼働確認します |
自動起動 | sudo systemctl enable ssh |
次回以降も自動で起動します |
PCのLAN IP確認 |
Windows: ipconfig
|
iPhoneからはこのIPに接続します |
WSL内のIP表示 |
Ubuntu: hostname -I
|
確認用。接続はPCのIPが基本です |
設定分離 | /etc/ssh/sshd_config.d/10-wsl.conf |
変更点の管理が楽です |
NAT転送(登録) | PowerShell: netsh interface portproxy add ...
|
行継続は ` です |
NAT転送(確認/削除) |
netsh interface portproxy show all / delete ...
|
運用上便利です |
起動時にsshd | wsl.exe -d Ubuntu-24.04 --exec sudo systemctl start ssh |
タスクスケジューラに登録します |
切断対策 |
tmux / screen
|
モバイルでは必須級です |
Claude Code / Codex CLI を快適に使うコツ
-
表記について:本記事の「Codex CLI」は、ユーザー環境に導入済みのCLIツールを指します。OpenAIの旧称「Codex」と混同を避けるため、必要に応じてツールの正式名称(パッケージ名やGitHubリポジトリ名)を記事や画面に併記することをおすすめします。
-
起動
- Claude Code:
claude
- Codex CLI:
codex
(またはご利用ツールの正確なコマンド名)
- Claude Code:
-
切断対策:
tmux new -s work
→ 切れたらtmux attach -t work
。 -
ログ確認:長い出力は
less -R
やtee
が便利です。例:codex ... | tee codex.log
-
入力効率:Termiusのキー補助(Ctrl、Esc、矢印など)を使うとショートカット操作が楽です。外付けキーボードがあるとさらに快適です。
-
CLIの相性:
ripgrep
、fd
、bear
などを入れておくと、AI提案の検証や検索が速くなります。 -
秘密情報:APIキーや機密は
~/.config/...
配下の権限を適切にし、.gitignore
を徹底します。
セキュリティのポイント
- 自宅LAN内でも、できれば 公開鍵認証 に移行することをおすすめします。
- 公開インターネットへ直接公開はしないでください。外出先から使う場合は、まず VPN(ルーター内蔵やWireGuard等) で自宅LANに入ってからSSHします。
-
PermitRootLogin no
、鍵運用時のPasswordAuthentication no
、PubkeyAuthentication yes
を基本とします。 - fail2ban の導入も検討すると総当たり対策に役立ちます。
バックアップ(WSL2ディストリの退避)
WSL2のディストリビューションごとバックアップできます。
# エクスポート(バックアップ)
wsl --export Ubuntu-24.04 C:\backup\ubuntu-2404.tar
# 復元(別環境や再セットアップ時)
wsl --import Ubuntu-24.04 C:\WSL\Ubuntu2404 C:\backup\ubuntu-2404.tar --version 2
FAQ
Q. iPhoneのSSHクライアントは無料で何が良いですか?
A. Termius をおすすめします。無料でも実用的で、操作がわかりやすいです。
Q. ミラーモードとNAT+転送、どちらが良いですか?
A. 自宅LAN内の利用なら ミラーモード がシンプルで安定しやすいです。事情があって使えない場合は NAT+ポート転送 を選びます。
Q. たまに接続できないことがあります。
A. WSLはアイドルで停止することがあります。接続前に一度Ubuntuを起動して、systemctl status ssh
で稼働を確認してください。tmux
を使っておくと中断時も復帰が楽です。
Q. IPアドレスが変わって困ります。
A. ルーターのDHCPでWSL2に 固定IP を割り当てると安定します(ミラーモードならPCのIPで接続するのが基本です)。NAT+転送の場合は portproxy
の connectaddress
を更新する運用が必要です。
Q. パスワード認証から公開鍵認証に切り替えたいです。
A. ~/.ssh/authorized_keys
に公開鍵を追加し、sshd_config
で PubkeyAuthentication yes
を確認します。鍵運用に移行したら PasswordAuthentication no
を設定すると安全性が高まります。権限は ~/.ssh 700
、authorized_keys 600
を守ってください。
Q. Codex CLI という名前が紛らわしくありませんか?
A. はい。環境によって指すものが異なるため、ご利用のCLIツールの正式名称(パッケージ名やリポジトリ名)を記事や画面に併記することをおすすめします。本記事では便宜上「Codex CLI」と表記しています。
Q. 自宅外からも使いたいです。
A. 直接公開は危険です。自宅ルーターの VPN や WireGuard を使ってLANに入ってからSSH接続してください。
Q. Windows起動時に自動で使えるようにしたいです。
A. タスクスケジューラで wsl.exe -d Ubuntu-24.04 --exec sudo systemctl start ssh
をログオン時に実行する設定がおすすめです。
まとめ
- 一番シンプルなのは ミラーモード を使って、iPhoneからWSL2に 直接SSH する方法です。
- Ubuntu側は
openssh-server
を入れ、systemctl enable/start ssh
、hostname -I
でIP確認という順で進めます。 - iPhone側は Termius を使い、
Keep Alive
設定やtmux
と組み合わせるとモバイルでも快適に Claude Code /(ご利用の)Codex CLI を活用できます。 - セキュリティは公開鍵認証とLAN内限定を基本にし、必要に応じてVPN、fail2ban、WSLバックアップ(
wsl --export
)も活用してください。
補足1:WindowsファイアウォールでSSH(22)を許可する手順
WSLへiPhoneから接続するには、Windows側で22/tcpの受信を許可しておく必要があります。ここではGUIとPowerShellの2通りを示します。プライベート(自宅)ネットワークのみに限定するのがおすすめです。
A. GUIで追加する方法(Windows 11)
- 設定 → プライバシーとセキュリティ → Windows セキュリティ → Windows セキュリティを開く を選びます。
- ファイアウォールとネットワーク保護 → 右下の 詳細設定 を開きます(「セキュリティが強化された Windows Defender ファイアウォール」)。
- 左ペインの 受信の規則 → 右ペインの 新しい規則… をクリックします。
- ポート を選択 → TCP、特定のローカルポート に 22 を入力 → 次へ。
- 接続を許可する → 次へ。
- プロファイル は プライベート のみにチェック(自宅LAN向け)。必要なら ドメイン にも。パブリック は外での接続を許可してしまうので通常は外します。
- 名前に例として 「WSL SSH (TCP 22) - Private」 と入力し、完了。
さらに厳格にするには、作成後にルールを開き、スコープ タブで「リモートIPアドレス」を ローカルサブネット に限定します。
B. PowerShellで追加・確認・削除
PowerShell(管理者)で次を実行します。
# 追加:プライベートプロファイル限定、LAN内からのみ
New-NetFirewallRule `
-DisplayName "WSL SSH (TCP 22) - Private" `
-Direction Inbound -Action Allow -Protocol TCP -LocalPort 22 `
-Profile Private -RemoteAddress LocalSubnet
# 確認
Get-NetFirewallRule -DisplayName "WSL SSH (TCP 22) - Private" | Format-List
# (不要になったら)削除
Remove-NetFirewallRule -DisplayName "WSL SSH (TCP 22) - Private"
NAT+portproxy 構成でも、外部から最初に入ってくるのはWindowsの22番です。必ずWindows側で許可してください。
ミラーモード でも、外部からの受信にはWindowsファイアウォールのプロファイルが関与します。プライベートに限定して許可しておくのが安全です。
C. 動作確認
同一LAN上の別端末(PCやiPhone)から、WindowsのLAN IPと22番で疎通を確認します。WindowsのPowerShellからなら次のようにチェックできます。
Test-NetConnection -ComputerName <WindowsのLAN IP> -Port 22
TcpTestSucceeded : True
になればファイアウォール許可は通っています。
補足2:WSLのIPアドレスについて(ミラーモードとNATの違い)
結論だけ先に:
- 既定の NAT では、WSLに専用の仮想IP(例:
172.x.x.x
)が振られます。LANの他デバイス(iPhoneなど)からは直接届かないので、WindowsのIPに接続し、portproxy
等で中継させます。 - ミラーモード では、LANの他デバイスからはPC(Windows)のLAN IPに対して接続するのが基本です。WSL内部にもIPは見えますが、LANの別ホストからWSL固有の別IPに直接つなぐ運用は通常想定されません。PCのIP:ポートに来た通信がWSLの待ち受けへ渡るイメージです(Windowsファイアウォールの許可が必要です)。
どれに接続すればよいか
-
NATのとき:iPhone → WindowsのLAN IP:22(例:
192.168.0.20:22
)- その上で
netsh interface portproxy
で WSLの 172.*:22 へ中継します。
- その上で
-
ミラーモードのとき(推奨):iPhone → WindowsのLAN IP:22(例:
192.168.0.20:22
)-
sshd
はWSLで0.0.0.0:22
などで待ち受けておけばOKです。Windows側のファイアウォールを「プライベート」で許可しておきます。 - 環境によってはWSL内部に 192.168.* 系などが見える場合もありますが、確実なのはPCのLAN IPへつなぐことです。
-
補助コマンド
-
PCのLAN IPの確認(Windows):
ipconfig
-
WSL内のIPの確認(Ubuntu):
hostname -I
(内部確認用)
迷ったら「iPhoneはPCのLAN IPへ接続」と覚えておくのが安全です。ミラーモードを使えば、portproxy無しで届きます。NAT構成のままにしたいときだけportproxyを使います。
補足3:公開鍵認証の設定フロー(ssh-keygen → authorized_keys)
パスワード認証のままでも使えますが、公開鍵認証に切り替えると安全で快適です。
ここではiPhone(Termius)側で鍵を作って、WSL(Ubuntu)に公開鍵を登録する流れをご案内します。
0. どこで鍵を作るべきか
- 原則として クライアント(=iPhone)で作成 します。
クライアントが秘密鍵を持ち、サーバー(WSL)には公開鍵だけを置きます。 - サーバー側で鍵を作り、秘密鍵をクライアントへ持ち出す運用は避けるのがおすすめです(漏えいリスクが上がります)。
1. iPhone(Termius)で鍵を作成
-
Termius を開き、下部の Keychain(鍵アイコン) を開きます。
-
+(New Key) → ED25519 を選びます(推奨。互換性重視ならRSA 3072でも可)。
-
Name(例:
iphone-ed25519
)とPassphrase(推奨)を設定して保存します。 -
作成した鍵をタップし、Copy Public Key を選んで公開鍵文字列をクリップボードにコピーします。
- 例:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... comment
- 例:
2. 初回だけパスワードでWSLにログインし、公開鍵を登録
iPhone →(パスワード認証)→ WSL(Ubuntu) に接続して、次を実行します。
# ~/.ssh ディレクトリを作成し、権限を厳格化
mkdir -p ~/.ssh
chmod 700 ~/.ssh
# authorized_keys を開く
nano ~/.ssh/authorized_keys
# もしくは vim など好みのエディタ
エディタを開いたら、手順1でコピーした公開鍵(ssh-ed25519 ...
から始まる1行)をそのまま貼り付けて保存します。
# 保存後、権限を厳格化
chmod 600 ~/.ssh/authorized_keys
権限が緩いとSSHが鍵を拒否します(「Permissions are too open」など)。
目安:~
はグループ書込不可、~/.ssh
は700
、authorized_keys
は600
。
3. Termius のホストに鍵を割り当てて再接続
- Termius → Hosts → 対象ホスト(WSLの接続設定)を開き、Keys から先ほど作った鍵(
iphone-ed25519
)を割り当てます。 - いったん接続を閉じ、再接続してみます。パスワード入力なしで入れるようになっていれば成功です(Passphraseを設定した場合はその入力が求められます)。
4.(任意)パスワード認証を無効化して堅牢化
公開鍵で入れることを別のセッションで確認してから、パスワード認証を止めます。編集中に切れるとロックアウトするので注意してください。
# 例:既存の設定ファイルに追記(すでに作っている 10-wsl.conf を編集)
sudoedit /etc/ssh/sshd_config.d/10-wsl.conf
以下を含めます(既定値確認のうえで調整):
PubkeyAuthentication yes
PasswordAuthentication no
設定を構文チェックしてからリロードします。
sudo sshd -t # エラーが出ないことを確認
sudo systemctl reload ssh
リロード後、新しい接続で鍵認証だけで入れるか必ず確認してください。
5.(補足)Windowsや他PCからも使いたい場合
-
Windows側で鍵を作るなら(PowerShell):
ssh-keygen -t ed25519 -a 100 -f $env:USERPROFILE\.ssh\id_ed25519 -C "win@home"
出力された
id_ed25519.pub
をWSLの~/.ssh/authorized_keys
に追記し、chmod 600
を適用します。 -
Linux/Mac の場合は
ssh-copy-id
が簡単です(クライアント側で実行):ssh-copy-id -i ~/.ssh/id_ed25519.pub <user>@<windowsのLAN IP>
補足4:%UserProfile%
とは?(.wslconfig
の場所ガイド)
%UserProfile%
は Windowsの環境変数で、現在ログイン中ユーザーのホームフォルダを指します。
実体は通常、C:\Users\<ユーザー名>
です。PowerShell では %...%
ではなく $env:USERPROFILE
を使います。
どこで・どう使えるか
-
エクスプローラーのアドレスバー
%UserProfile%
と入力 → 自分のフォルダへ移動します。 -
コマンド プロンプト(cmd.exe)
echo %UserProfile% cd %UserProfile% notepad "%UserProfile%\.wslconfig"
-
PowerShell
Write-Output $env:USERPROFILE Set-Location $env:USERPROFILE notepad $env:USERPROFILE\.wslconfig
-
WSL(Ubuntu)から Windows 側を見る場合
C:\Users\<ユーザー名>
は/mnt/c/Users/<ユーザー名>
として見えます。
例:# WSL上から .wslconfig を編集(Windowsのメモ帳を呼ぶ例) /mnt/c/Windows/system32/notepad.exe /mnt/c/Users/<ユーザー名>/.wslconfig
メモ:環境変数名は大文字小文字を区別しません。
%USERPROFILE%
でも同じです。
近縁の変数として、%HOMEDRIVE%
+%HOMEPATH%
もあります(合体すると同じ場所になります)。
PowerShell では~
(チルダ)もユーザーフォルダを指します(cd ~
)。
.wslconfig
を置く場所
.wslconfig
は Windows 側ユーザーフォルダ直下に置きます。パス例は次のとおりです。
-
エクスプローラー:
%UserProfile%\.wslconfig
-
cmd:
notepad "%UserProfile%\.wslconfig"
-
PowerShell:
notepad $env:USERPROFILE\.wslconfig
-
WSL から見たパス:
/mnt/c/Users/<ユーザー名>/.wslconfig
設定変更後は
wsl --shutdown
を実行して、WSL を再起動すると反映されます。
早見表
目的 | cmd.exe | PowerShell | WSL(Ubuntu) |
---|---|---|---|
パス表示 | echo %UserProfile% |
Write-Output $env:USERPROFILE |
printf "%s\n" /mnt/c/Users/<ユーザー名> |
パス移動 | cd %UserProfile% |
Set-Location $env:USERPROFILE |
cd /mnt/c/Users/<ユーザー名> |
.wslconfig を開く |
notepad "%UserProfile%\.wslconfig" |
notepad $env:USERPROFILE\.wslconfig |
/mnt/c/Windows/system32/notepad.exe /mnt/c/Users/<ユーザー名>/.wslconfig |
以上