スマホのSSH接続が切れる原因と対策【完全解決】
この記事は「モバイルSSH完全ガイド」のクラスター記事です。モバイルSSHの全体像はガイドをご覧ください。
はじめに
スマホからSSHでサーバーに接続して作業していたら、画面を消した瞬間に接続が切れた——そんな経験はありませんか?
PCでは安定していたSSH接続が、スマホだと数分で切断される。これはスマホ特有の省電力機能やネットワーク管理が原因です。
本記事では、スマホでSSH接続が切れる5つの原因と、サーバー側・クライアント側それぞれの具体的な対策を解説します。
スマホでSSH接続が切れる5つの原因
1. OSがバックグラウンドアプリを停止する
スマホのOSはバッテリーを節約するために、画面消灯やアプリ切り替え時にバックグラウンドのネットワーク接続を積極的に切断します。
- Android: Dozeモードに入ると、ネットワークアクセスが制限される。App Standbyも同様にバックグラウンド通信を制限
- iOS: バックグラウンドのTCP接続は約30秒〜3分で中断される。VoIPやナビ以外のアプリには厳しい制限
これがスマホでSSH接続が切れる最大の原因です。
2. Wi-Fiとモバイル回線のハンドオフ
移動中にWi-Fiからモバイル回線に切り替わると、IPアドレスが変わります。SSHはTCPセッションにIPアドレスを紐づけているため、IPが変わった時点で接続が無効になります。
3. サーバー側のタイムアウト
SSHサーバーは一定時間応答のないクライアントを切断します。スマホがDozeモードに入ってkeep-aliveパケットを送れなくなると、サーバー側から切断されます。
4. NATタイムアウト
多くのモバイルネットワークやWi-Fiルーターは、NAT(ネットワークアドレス変換)テーブルのエントリを一定時間で破棄します。一般的なタイムアウトは2〜5分程度。この間にkeep-aliveが送信されないと、戻りパケットがルーティングできなくなり接続が切れます。
5. 画面オフ=アプリ一時停止
スマホのSSHアプリは、画面がオフになるとアプリ全体がサスペンド状態になることがあります。一般的なSSHクライアントではソケットの読み書きが停止し、結果としてサーバーからの応答を受け取れず、接続がタイムアウトします。
対策1: サーバー側の設定
sshd_configでkeep-aliveを設定
サーバー側で定期的にクライアントへpingを送ることで、無通信による切断を防げます。
/etc/ssh/sshd_config を編集します。
ClientAliveInterval 30
ClientAliveCountMax 3
ClientAliveInterval 30: 30秒ごとにクライアントへ生存確認を送信ClientAliveCountMax 3: 3回連続で応答がなければ切断
設定変更後、SSHサーバーを再起動します。
sudo systemctl restart sshd
この設定により、サーバー側からの一方的な切断は防げます。ただし、スマホがそもそもパケットを受信できない状態(Doze、画面オフ)では根本的な解決にはなりません。
tmux / screen でセッションを永続化
接続が切れても作業内容を失わないための保険として、tmuxまたはscreenを使います。
# tmuxセッションを開始
tmux new -s work
# 再接続時にアタッチ
tmux attach -t work
tmuxを使えば、SSH接続が切れてもサーバー上のプロセスは動き続けます。再接続後に tmux attach するだけで、切断前の状態に復帰できます。
tmuxの詳しい使い方は「tmux入門ガイド」をご覧ください。
対策2: クライアント側の設定
SSH keep-aliveの設定
クライアント側からもkeep-aliveを送ることで、NATテーブルの維持とサーバータイムアウトの防止を図れます。
~/.ssh/config に以下を追加します。
Host *
ServerAliveInterval 15
ServerAliveCountMax 3
バッテリー最適化のホワイトリスト登録
Androidの場合、SSHアプリをバッテリー最適化の対象外にすることで、Dozeモードでの制限を緩和できます。
- 「設定」→「バッテリー」→「バッテリーの最適化」を開く
- SSHアプリを選択し「最適化しない」に変更
ただし、これだけでは完全にDoze制限を回避できないケースもあります。Android 12以降はバックグラウンド制限がさらに厳しくなっており、ホワイトリスト登録だけでは不十分な場合があります。
接続が切れる原因の診断チェックリスト
SSH接続が切れたとき、以下の順番で原因を切り分けましょう。
flowchart TD
A["SSH接続が切れた"] --> B{"画面オフ後に<br/>切れる?"}
B -- はい --> C{"アプリはバッテリー<br/>最適化の対象外?"}
C -- いいえ --> D["ホワイトリストに登録する"]
C -- はい --> E["OS制限が原因<br/>→ フォアグラウンドサービス<br/>対応アプリが必要"]
B -- いいえ --> F{"移動中に<br/>切れる?"}
F -- はい --> G["Wi-Fi/モバイル回線の<br/>ハンドオフが原因<br/>→ 自動再接続機能が必要"]
F -- いいえ --> H{"数分放置後に<br/>切れる?"}
H -- はい --> I["サーバー or NAT<br/>タイムアウトが原因<br/>→ keep-alive設定を確認"]
H -- いいえ --> J["ネットワーク品質を確認<br/>→ pingテストを実行"]
確認ポイントまとめ:
- サーバーの
ClientAliveIntervalは設定済みか? - クライアントの
ServerAliveIntervalは設定済みか? - SSHアプリのバッテリー最適化は無効にしたか?
- Wi-Fiの省電力モードはオフか?
- tmux / screen は使っているか?
根本解決: フォアグラウンドサービス対応のSSHアプリを使う
上記の対策をすべて行っても、スマホ特有の制限を完全に克服するのは困難です。OSレベルのバックグラウンド制限は、ユーザー設定だけでは回避しきれません。
根本的な解決策は、フォアグラウンドサービスとWake Lockに対応したSSHクライアントアプリを使うことです。
フォアグラウンドサービス + Wake Lock
フォアグラウンドサービスに対応したSSHアプリは、通常のバックグラウンドアプリと異なり、OSが強制終了しない優先度の高いプロセスとしてSSH接続を維持します。
さらにWake Lockを取得するアプリであれば、画面がオフの状態でもCPUとネットワークが維持され、keep-aliveパケットを確実に送信し続けます。
自動再接続機能
Wi-Fiからモバイル回線への切り替え時に自動再接続する機能を持つアプリを選ぶと、ハンドオフによる切断の問題も解消できます。tmuxと併用すれば、再接続後にセッションへシームレスに復帰できます。
SSHクライアントアプリの選び方
アプリを選ぶ際は、以下の機能に対応しているかを確認しましょう。
- フォアグラウンドサービス: バックグラウンドでの接続維持
- Wake Lock: 画面オフ時のネットワーク維持
- 自動再接続: ネットワーク変更時の復帰
- 鍵認証対応: Ed25519 / RSA鍵のサポート
おすすめのSSHクライアントアプリはこちらの比較記事で紹介しています。
まとめ
スマホでSSH接続が切れる原因は、OS省電力機能・ネットワーク切り替え・サーバータイムアウト・NATタイムアウトが複合的に絡み合っています。
サーバー側の対策:
ClientAliveInterval/ClientAliveCountMaxの設定- tmux / screen でセッションを永続化
クライアント側の対策:
ServerAliveIntervalの設定- バッテリー最適化のホワイトリスト登録
これらの設定で改善はしますが、スマホのOS制限を根本的に解決するにはフォアグラウンドサービス + Wake Lock + 自動再接続に対応したSSHクライアントアプリが必要です。対応アプリを使えば、スマホでも安定したSSH接続を維持でき、外出先からのサーバー管理やリモート開発が快適になります。
おすすめのSSHクライアントはこちらの比較記事で紹介しています。