TL;DR
Tailscale + SSH + Termux の組み合わせで、スマホ(Android)から自宅PCのClaude Codeをフル操作できるようになりました。途中5回詰まりましたが、全部別の方法で突破できました。
こんなことをやりたかった
普段、スマホからClaude Codeを操作するときはHappyCodeというアプリを使っています。HappyCode(正式名称:Happy Coder)はiOS・Android両対応のClaude専用クライアントアプリで、インストールするだけでスマホからClaudeとやり取りできます。それはそれで便利なのですが、使っていてちょっと気になることがありました。
最新のAIモデルについて聞くと、「2025年8月時点では〜が最新です」とClaude Codeからコメントが返ってくることがあります。知識のカットオフはモデルの仕様なので仕方ないのですが、VS CodeでClaude Codeを立ち上げているときにはそういうストレスを感じたことがありませんでした。アプリ経由だと何か情報が欠けているのかもしれない、と感じていました。
「自前のSSH環境で直接つなげたらもっと自由度が上がるのでは」とずっと気になっていたのも、こういう経験が積み重なっていたからです。
- アプリの制約に縛られない
- フルターミナルでClaude Codeの全機能が使える
- TailscaleのVPN経由なのでセキュリティも安心
チャレンジしてみることにしました。なお、TailscaleのインストールとVPNの初期設定は事前に済んでいる前提で進めます(Tailscaleのセットアップ自体はこの記事では扱いません)。接続先のIPアドレスはTailscaleアプリまたは管理コンソール(login.tailscale.com)の Machines タブで確認できる 100.x.x.x 形式のものを使います。構成はこちらです:
Android(Termux)
↓ Tailscale VPN
自宅PC(Windows)
↓
Claude Code CLI
詰まり① OpenSSHのインストールがフリーズした
やったこと
まず自宅PCにOpenSSHサーバーを入れようとしました。ネットで調べると管理者PowerShellでこれを実行するとあります:
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
実行しました。プログレスバーが出ました。そのまま10分待ちました。全然動きません。
GUIの設定画面(オプション機能)から試しても、「追加中」の表示が永遠に消えません。DISMコマンドも試しました。同じ結果でした。
原因
Windows UpdateのサーバーからダウンロードするAPIが何らかの理由でブロックされていました。回線速度は120Mbpsあるにもかかわらず、Microsoftのサーバーへの接続だけが詰まっていました。
解決策:GitHubから直接バイナリをダウンロード
Windows Updateを一切使わず、GitHubのリリースページから直接OpenSSHをインストールする方法があります。
# ダウンロード
Invoke-WebRequest -Uri "https://github.com/PowerShell/Win32-OpenSSH/releases/download/v9.5.0.0p1-Beta/OpenSSH-Win64.zip" -OutFile "$env:TEMP\openssh.zip"
# 展開
Expand-Archive -Path "$env:TEMP\openssh.zip" -DestinationPath "C:\Program Files\OpenSSH" -Force
# インストール
cd "C:\Program Files\OpenSSH\OpenSSH-Win64"
.\install-sshd.ps1
# サービス起動
Start-Service sshd
Set-Service -Name sshd -StartupType Automatic
あっさり動きました。
詰まり② ファイアウォールの設定コマンドもフリーズした
やったこと
OpenSSHを入れただけではスマホから接続できません。Windowsファイアウォールでポート22を開ける必要があります。管理者PowerShellでこれを実行しました:
New-NetFirewallRule -Name "OpenSSH-Server" -DisplayName "OpenSSH Server (sshd)" -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
またフリーズしました。 5分待っても反応がありませんでした。
原因
New-NetFirewallRule はWindows Management Instrumentation(WMI)経由で動作するため、WMIサービスが不安定な環境や特定のWindowsビルドで応答しなくなることがあります。①と同じくMicrosoftのインフラに依存したコマンドが原因でした。
解決策:netshコマンドを使う
New-NetFirewallRule が応答しないときは古典的な netsh コマンドが使えます:
netsh advfirewall firewall add rule name="OpenSSH" protocol=TCP dir=in localport=22 action=allow
一瞬で完了しました。
詰まり③ MicrosoftアカウントのパスワードでSSH認証が失敗した
やったこと
Termux(Android)にopensshをインストールして接続テストをしました:
注意: TermuxはGoogle Play版ではなくF-Droid版を使うこと。Google Play版は更新が止まっており、opensshなどのパッケージインストールが正常に動かないことがあります。
pkg install openssh
ssh yourname@100.xx.xx.xx
yourname はWindowsのローカルユーザー名(C:\Users\ 以下に表示される名前)を入れます。Microsoftアカウントでサインインしている場合も、ローカルユーザー名を使います。
接続はできました。パスワードを聞かれました。MicrosoftアカウントのパスワードをWindowsにサインインするときと同じものを入力しました。
Connection reset by 100.xx.xx.xx port 22
切断されました。
原因
WindowsのOpenSSHサーバーはMicrosoftアカウント(オンラインアカウント)のパスワード認証が正常に機能しないケースがあります。PINログインしている環境ではなおさらです。
解決策:SSH鍵認証に切り替える
パスワード不要のSSH鍵認証を設定しました。
スマホ(Termux)側で鍵を生成:
ssh-keygen -t ed25519
# 全部Enterでデフォルト設定
公開鍵を確認:
cat ~/.ssh/id_ed25519.pub
# ssh-ed25519 AAAA... という1行が表示される
PC側(管理者PowerShellで)公開鍵を登録:
公開鍵の文字列(ssh-ed25519 AAAA... から始まる1行)をスマホ画面からコピーしてPCに渡します。メモアプリやLINEのKeepメモ、Googleドキュメントなど、スマホ↔PC間でテキストを共有できる方法であれば何でも構いません。
# ファイル作成
New-Item -Path "C:\ProgramData\ssh\administrators_authorized_keys" -ItemType File -Force
# 公開鍵を書き込む(↓をスマホで表示した公開鍵に置き換える)
Set-Content -Path "C:\ProgramData\ssh\administrators_authorized_keys" -Value "ssh-ed25519 AAAA...(ここにスマホで表示された公開鍵を貼る)"
# 権限設定(これをやらないとSSHが鍵ファイルを読んでくれない)
icacls "C:\ProgramData\ssh\administrators_authorized_keys" /inheritance:r /grant "SYSTEM:(F)" /grant "BUILTIN\Administrators:(F)"
再接続したら、パスワードなしで接続できました。
詰まり④ SSHターミナルからGoogleドライブ(G:\)にcdできない
やったこと
接続成功後、ObsidianのVaultに移動しようとしました。
cd G:/マイドライブ/Obsidian
動きません。 G: が見つからないというエラーになります。
原因
G:\ はWindowsにログインしたユーザーセッションにマウントされるドライブです。SSHサービスは別のシステムセッションで動くため、そのマウントが見えません。Google DriveはネットワークドライブでもないのでSSHセッションには引き継がれません。
解決策:シンボリックリンクをC:に作る
管理者PowerShellで一度だけ実行します:
New-Item -ItemType SymbolicLink -Path "C:\gdrive" -Target "G:\マイドライブ"
成功するとこう表示されます:
ディレクトリ: C:\
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----l 2026/03/26 1:04 gdrive
d----l の l がシンボリックリンクを意味します。
以降はSSHターミナルから:
cd C:/gdrive/Obsidian
で普通にアクセスできます。
最終的な接続確認
Termuxで:
ssh yourname@100.xx.xx.xx
# → Windows のコマンドプロンプトが開く
claude
# → Welcome back!
スマホ画面にClaude Codeのウェルカム画面が表示された瞬間
スマホの画面にClaude Codeのウェルカム画面が表示された瞬間、素直に嬉しかったです。
詰まり⑤ TailscaleをONにするとSIMが使えなくなった
やったこと
接続確認後、ふだん通りスマホを使おうとしたらChromeもLINEも繋がりません。 TailscaleをONにした瞬間からSIMの通信が止まっていました。
原因
Exit NodeはNoneになっていたので最初は原因がわかりませんでした。実際の原因は**Use Tailscale DNS**でした。
Tailscaleはトラフィック自体を乗っ取らなくても、DNSだけ自分のサーバーに向けさせることがあります。AndroidのVPN仕様上、これがONだとDNS経由で全通信がTailscale側に引き込まれ、インターネット全体が繋がらないように見えます。
切り分けの手順:
- TailscaleをONにしたままChromeで
8.8.8.8(IPアドレス直打ち)にアクセス - 繋がらなかった → ルーティングかDNSの問題
Use Tailscale DNSをOFFにした → 即解決
解決策:Use Tailscale DNS をオフにする
Tailscaleアプリ → 右上のアカウントアイコン → 設定 → Use Tailscale DNS をOFF
これだけです。SIMとTailscaleが共存できるようになりました。
補足: PCの名前(例:
mypc.tail○○.ts.net)でSSH接続したい場合はDNSが必要になることもありますが、TailscaleのIPアドレス(100.x.x.x)直打ちでつなぐなら問題ありません。
だから私はこうした
HappyCodeはやめていません。今も使っています。
ただ今回の構成を手に入れたことで、「スマホからClaude Codeを使う」という選択肢が増えました。
| HappyCode | Tailscale+SSH+Termux | |
|---|---|---|
| セットアップ | ほぼ不要 | 今回のような作業が必要 |
| 自由度 | アプリの制約あり | フルターミナル |
| コンテキストの充実度 | 制限あり(話が通じないことも) | VS Codeと同等 |
| セキュリティ | アプリ依存 | VPN経由で安心 |
| 向いている場面 | さっと使いたいとき | がっつり作業したいとき |
詰まりまくりましたが、それぞれ「なぜ詰まったか」が明確で、代替手段が存在していました。Windowsのコマンドは時々こういうことがあります。詰まったらコマンドを変える、というのが今回の学びです。
まとめ
Add-WindowsCapabilityが詰まったら → GitHubからバイナリを直接インストールNew-NetFirewallRuleが詰まったら →netshコマンドを使う- MicrosoftアカウントのSSH認証が失敗したら → SSH鍵認証に切り替える
- GoogleドライブにSSHからcdできないなら →
C:\gdriveにシンボリックリンクを作る - Tailscaleが入っていれば外出先からも同じ手順で接続できる
- TailscaleをONにするとSIMが使えなくなるなら →
Use Tailscale DNSをOFF