0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

iPhoneからWSL2(Ubuntu 24.04)へSSH接続し Claude Code / Codex CLI を使う

Last updated at Posted at 2025-09-25

はじめに

自宅のiPhoneから、Windows 11上のWSL2で動くUbuntu 24.04へSSH接続し、Claude CodeCodex CLI を活用する手順を、やさしいステップでまとめました。
前提は次のとおりです。

  • WSL2に Ubuntu 24.04 は導入済み
  • Claude CodeCodex 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 にネットワーク&リソース設定)

  1. %UserProfile% (実体は通常C:\Users\<ユーザー名>) にある(または作成する) .wslconfig を編集します。
    ミラーモードとメモリ・CPU上限を一緒に設定しておくと、EDAワークロードでも安定しやすいです。
[wsl2]
networkingMode=mirrored
memory=8GB        # 開発環境に応じて調整します
processors=4      # お使いのCPUコア数に合わせて調整します
  1. 反映のため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でポート転送(代替)

  1. WSL2内でWSL側IPを確認します(NATでは 172.* などになります)。
hostname -I
# 例: 172.29.80.10
  1. 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
  1. Windowsファイアウォールで 受信 22/tcp をプライベートに許可 します。
  2. 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(またはご利用ツールの正確なコマンド名)
  • 切断対策tmux new -s work → 切れたら tmux attach -t work

  • ログ確認:長い出力は less -Rtee が便利です。例:codex ... | tee codex.log

  • 入力効率:Termiusのキー補助(Ctrl、Esc、矢印など)を使うとショートカット操作が楽です。外付けキーボードがあるとさらに快適です。

  • CLIの相性ripgrepfdbear などを入れておくと、AI提案の検証や検索が速くなります。

  • 秘密情報:APIキーや機密は ~/.config/... 配下の権限を適切にし、.gitignore を徹底します。


セキュリティのポイント

  • 自宅LAN内でも、できれば 公開鍵認証 に移行することをおすすめします。
  • 公開インターネットへ直接公開はしないでください。外出先から使う場合は、まず VPN(ルーター内蔵やWireGuard等) で自宅LANに入ってからSSHします。
  • PermitRootLogin no、鍵運用時の PasswordAuthentication noPubkeyAuthentication 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+転送の場合は portproxyconnectaddress を更新する運用が必要です。

Q. パスワード認証から公開鍵認証に切り替えたいです。
A. ~/.ssh/authorized_keys に公開鍵を追加し、sshd_configPubkeyAuthentication yes を確認します。鍵運用に移行したら PasswordAuthentication no を設定すると安全性が高まります。権限は ~/.ssh 700authorized_keys 600 を守ってください。

Q. Codex CLI という名前が紛らわしくありませんか?
A. はい。環境によって指すものが異なるため、ご利用のCLIツールの正式名称(パッケージ名やリポジトリ名)を記事や画面に併記することをおすすめします。本記事では便宜上「Codex CLI」と表記しています。

Q. 自宅外からも使いたいです。
A. 直接公開は危険です。自宅ルーターの VPNWireGuard を使って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 sshhostname -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)

  1. 設定プライバシーとセキュリティWindows セキュリティWindows セキュリティを開く を選びます。
  2. ファイアウォールとネットワーク保護 → 右下の 詳細設定 を開きます(「セキュリティが強化された Windows Defender ファイアウォール」)。
  3. 左ペインの 受信の規則 → 右ペインの 新しい規則… をクリックします。
  4. ポート を選択 → TCP特定のローカルポート22 を入力 → 次へ
  5. 接続を許可する次へ
  6. プロファイルプライベート のみにチェック(自宅LAN向け)。必要なら ドメイン にも。パブリック は外での接続を許可してしまうので通常は外します。
  7. 名前に例として 「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 <WindowsLAN 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 portproxyWSLの 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)で鍵を作成

  1. Termius を開き、下部の Keychain(鍵アイコン) を開きます。

  2. +(New Key)ED25519 を選びます(推奨。互換性重視ならRSA 3072でも可)。

  3. Name(例:iphone-ed25519)とPassphrase(推奨)を設定して保存します。

  4. 作成した鍵をタップし、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」など)。
目安:~ はグループ書込不可、~/.ssh700authorized_keys600

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 を置く場所

.wslconfigWindows 側ユーザーフォルダ直下に置きます。パス例は次のとおりです。

  • エクスプローラー%UserProfile%\.wslconfig
  • cmdnotepad "%UserProfile%\.wslconfig"
  • PowerShellnotepad $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

以上

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?