Android VPNを選ぶ際、プロトコル名やノード数は基本条件にすぎません。日常の使い勝手を左右するのは、アプリをバックグラウンドに移しても接続を維持できるか、省電力設定でVPNプロセスが終了しないか、アプリ別プロキシでローカルサービスを正しく除外できるかです。本記事では、クライアント画面の「接続済み」表示だけに頼らず、再現可能な確認手順を解説します。
テストでは「回線障害」と「クライアントがシステムに終了させられた状態」を分けて判断する必要があります。前者はVPNプロセスやシステムの鍵マークが残っていても対象リクエストがタイムアウトすることが多く、後者では常駐通知やVPNマークが消え、クライアントを再起動して初めて復旧する場合があります。どちらも切断に見えますが、対処法はまったく異なります。
Android VPNがバックグラウンドで切断される理由
Androidクライアントは通常、システムの VPNService を通じて仮想ネットワークインターフェースを構築します。アプリが前面にある間は、コアプロセスや設定画面、ネットワーク状態が維持されやすくなります。画面を消したりアプリをバックグラウンドに移したりすると、システムは電池設定、バックグラウンド制限、端末メーカーのプロセス管理ルールに基づいてリソースを再配分します。クライアントがフォアグラウンドサービスを安定して動かしていない場合や、制限付きのバッテリーモードに設定されている場合、接続がシステムによって終了することがあります。
ここでいう「フォアグラウンドサービス」は、設定画面を表示し続けるという意味ではありません。クライアントが常駐通知を通じて、VPNコアがユーザーに認識可能な継続タスクを実行中だとシステムに伝える仕組みです。常駐通知が消えることは重要な兆候ですが、通知だけで回線品質を判断することはできません。通知が残っていても上流ネットワークの変化で一時的に通信できないクライアントがありますし、通知が折りたたまれてもVPNインターフェースが有効な場合があります。
ネットワークの切り替えもよくあるきっかけです。端末がWi-Fiからモバイルネットワークへ移行したり、あるアクセスポイントから別のアクセスポイントへローミングしたりすると、基盤ネットワークのアドレスとルートが変わります。ネットワークコールバックに正しく対応するクライアントはトランスポート層の接続を再構築しますが、処理が不完全なクライアントでは古いセッションが残り、画面は接続済みでも実際のリクエストが無効な経路で止まることがあります。Hysteria2やTUICなどUDPとQUICの考え方に基づく実装は、プロトコル固有の仕組みにより一部のネットワーク変動を改善できる場合があります。ただし、実際の復旧能力はクライアント実装、サーバー設定、現在のネットワークが該当する通信を許可しているかに左右されるため、プロトコル名だけで判断できません。
システムの「VPNを常時接続」は、接続が予期せず終了した際にVPNの再構築を要求できます。「VPN未接続時の通信を遮断」に類する設定も有効にすると、VPNの準備が整うまで通常の通信がブロックされます。トンネル外への通信を避けたい場合に適していますが、設定を誤ると端末全体がインターネットに接続できないようにも見えます。トラブルシューティング中は、まずクライアント自体が安定して接続できることを確認してから、厳格な遮断を有効にしてください。
| 確認された現象 | 考えられる原因 | 優先して確認する項目 |
|---|---|---|
| 画面ロック後にVPNマークと常駐通知が同時に消える | アプリプロセスがバックグラウンド設定で終了された | バッテリー制限、バックグラウンド実行権限、フォアグラウンドサービスの状態 |
| VPNマークは表示されるが、すべての対象リクエストがタイムアウトする | 上流回線の停止、またはネットワーク切り替え後にセッションが復旧していない | 回線を再接続する、プロトコルを切り替える、基盤ネットワークを確認する |
| ブラウザーは使えるが、特定のアプリだけ使えない | アプリ別リストまたはドメインのルーティング規則が一致していない | アプリのパッケージ名、プロキシモード、ルールの適用記録 |
| 出口IPは正しいが、DNSの帰属が想定と異なる | DNSがトンネルに入っていない、またはシステムのプライベートDNSと競合している | クライアントのDNS設定、プライベートDNS、IPv6経路 |
| ネットワーク切り替え後も接続済みと表示されるがアクセスできない | クライアントが旧ネットワーク上のトランスポートセッションを保持している | 切断して再接続する、ネットワーク変化への対応、クライアントのバージョン |
省電力設定はどう設定するか
Androidの「最適化」「制限付き」「制限なし」などの名称は、OSバージョンや端末メーカーによって異なります。ただし判断の原則は共通です。VPNコアはネットワークデータを継続的に処理するため、長時間使わない通常のバックグラウンドアプリとして扱うのは適していません。アプリごとの電池管理が用意されている場合は、使用中のVPNクライアントが継続してバックグラウンド実行できる状態にしてください。
同時に、バックグラウンド実行を許可することは、クライアントの自由な自動起動を許可することとは異なります。端末によっては、電池設定、バックグラウンド起動、関連起動、通知権限が別々の項目に分かれています。ユーザーがVPNへ手動接続した後に重要なのは、コアサービスを終了させないことです。端末の再起動後も自動復旧させたい場合は、クライアントが起動時接続に対応しているか、システムが該当する起動動作を許可しているかも確認してください。
- ✅ 使用中のVPNクライアントをバッテリー制限モードから除外し、画面ロック後にコアプロセスが直接終了されるのを防ぐ。
- ✅ クライアントの常駐接続通知を残し、フォアグラウンドサービスが動作中か確認できるようにする。
- ✅ Wi-Fiとモバイルネットワークを切り替えた後は、接続ボタンの色だけでなく出口IPを再確認する。
- ✅ 経路外への通信を厳密に防ぐ必要がある場合は、まず安定性を確認してから、システムの常時接続と遮断オプションを設定する。
- ❌ システムのVPNインターフェースを奪い合う複数のクライアントを同時に実行しない。後から起動したクライアントが現在の接続を置き換えることがある。
- ❌ 「バックグラウンドを整理する」操作をネットワーク修復手順にしない。この操作でVPNコアも一緒に終了することがある。
- ❌ プロトコルのハンドシェイクに成功しただけで設定完了と判断しない。DNS、IPv6、アプリ別ルールは個別に確認する必要がある。
省電力の除外リストも、多ければよいわけではありません。実際にVPNServiceを担当するクライアントだけを調整し、すべてのネットワークツールの制限を解除する必要はありません。サブスクリプション型の汎用クライアントを使う場合、実際にコアを動かすのはサブスクリプションをインポートしたクライアントです。サブスクリプション提供元のウェブサイトや補助アプリがトンネル処理を担うとは限らず、対象を間違えても接続維持は改善しません。
アプリ別プロキシは通常のルーティング分けではない
アプリ別プロキシは、どのAndroidアプリをVPNの仮想インターフェースへ入れるかを決め、通常はアプリのパッケージ名に基づいて動作します。一方、ドメインまたはIPによるルーティング分けは、通信がクライアントコアに入った後、宛先アドレス、ドメイン、ルールセット、ポートに応じてプロキシ経由かローカル接続かを決めます。両者は異なる層にあるため、相互に置き換えることはできません。
たとえば、ブラウザーをプロキシ対象アプリのリストに追加しても、そのブラウザーの接続をVPNコアが処理するという意味にとどまります。コア内部では、ルールにより一部のドメインを直接接続にすることもあります。逆に、ルールセットに特定の海外サイトのドメインを記載していても、対応するアプリがプロキシ対象リストに入っていなければ、その通信はコアに入らず、ドメインルールが適用されることもありません。
一般的なクライアントには、「選択したアプリのみプロキシ」と「選択したアプリを除外」という2種類のモードがあります。前者は対象範囲が明確な場合に適しており、リスト外のアプリはローカルネットワークを使います。後者は大半の通信をVPN経由にし、ローカルサービスだけを除外したい場合に適しています。設定時は現在のモードを必ず確認し、リストにアプリ名があるかだけで判断しないでください。同じリストでも、モードによって結果は正反対になります。
システムコンポーネントや埋め込みウェブページが判断を難しくすることもあります。アプリに表示されるログインページがシステムWebViewや外部ブラウザーで動作している場合、リクエストがすべて元のアプリに属するとは限りません。プッシュ通知、ダウンロード、メディア再生も独立したコンポーネントを呼び出す場合があります。「トップページは開くのにログインや再生に失敗する」場合は、すぐにノードが対象サービスに対応していないと決めつけず、リクエストに関与するコンポーネントを確認してください。
共有ネットワークも個別に確認が必要です。Android端末自身がVPNServiceを通じて送信する通信と、テザリング先の端末から転送される通信は同じものではありません。通常のクライアントのアプリ別リストは本体のアプリパッケージ名しか認識せず、下流端末も同じトンネルを通るとは判断できません。回線を共有する場合は、クライアントが転送機能を明確に提供しているか確認し、下流端末で出口を確認してください。
プロトコルとAndroidクライアントの組み合わせ方
Shadowsocks、VMess、Trojan、VLESS、Hysteria2、TUICはいずれもサブスクリプションに含まれることがありますが、プロトコル自体がAndroidのバックグラウンド維持を担うわけではありません。接続維持は、クライアントのVPNService、コアプロセス管理、ネットワーク変化への対応、システム設定によって決まります。そのため、同じサブスクリプションを別のクライアントへインポートすると、バックグラウンドでの挙動が変わることがあります。これは回線が変わったとは限らず、クライアントのコアバージョンや実装経路の違いが原因の場合もあります。
Shadowsocks、VMess、VLESS、Trojan
Shadowsocksは設定が比較的わかりやすく、クライアントの選択肢も成熟しているため、ルールの明確さや互換性を優先する場面に適しています。VMessとVLESSは複数のトランスポート方式に対応するクライアントでよく使われます。VLESSはVMessと同じ認証・暗号化の組み合わせを自ら提供するものではないため、安全性や通信特性はTLS、Realityなどの設定と合わせて理解する必要があります。Trojanは通常TLS上で動作し、証明書名、システム時刻、サーバー設定が一致しないとハンドシェイクに失敗することがあります。
これらのプロトコルをバックグラウンドで安定して動かせるかは、クライアントがフォアグラウンドサービスを確実に維持できるか、ネットワーク変化後に接続を再構築できるか、サブスクリプション変換時にトランスポートパラメータが失われていないかによって決まります。サーバーアドレスとポートだけをコピーしても完全なノードは再現できません。パス、ホスト名、トランスポート層、セキュリティ層、証明書検証の設定が必要になる場合があります。
Hysteria2とTUIC
Hysteria2とTUICは通常、UDPを基盤とする現代的なトランスポート設計を採用しており、ジッターやパケットロスの場面では従来のTCPベースとは異なる復旧特性を示すことがあります。ただし、現在のネットワークがUDPを制限している場合、クライアントコアのバージョンに互換性がない場合、証明書や輻輳制御の設定が一致しない場合は、ハンドシェイク失敗、接続後の無通信、頻繁なフォールバックが発生することもあります。Android向けの選択肢は単一プロトコルに依存せず、異なるネットワーク条件で検証済みのノード種別へ切り替えられるクライアントを選ぶべきです。
IEPL専線、中継回線、直接接続回線はネットワーク経路を表すもので、クライアントのプロトコルではありません。直接接続は端末からノード入口へ直接アクセスするため、現在の通信事業者から入口までの公衆網品質に左右されます。中継は通常、中継入口へ接続してからサービス側が出口へ転送します。IEPL専線は特定区間を専用線で運ぶことを示します。IEPLを使っていても、端末から入口までの区間はローカルネットワークの影響を受けます。同じプロトコルでも、経路が異なれば安定性が変わることがあります。
| 比較する観点 | 主な決定要因 | Android側で確認するポイント |
|---|---|---|
| Shadowsocks | 暗号化設定、サーバー互換性、回線経路 | クライアントコアの対応、UDP要件、ルールモード |
| VMess / VLESS | トランスポートパラメータ、セキュリティ層、サーバー設定 | サブスクリプション項目の完全性、ネットワーク切り替え後の再構築可否 |
| Trojan | TLS設定、証明書名、システム時刻 | 証明書検証、SNI設定、バックグラウンドサービスの状態 |
| Hysteria2 / TUIC | UDP到達性、コアの互換性、サーバーパラメータ | 現在のネットワークがUDPを制限しているか、ネットワーク切り替え後の復旧状況 |
| IEPL / 中継 / 直接接続 | 入口の位置、伝送経路、現在の接続ネットワーク | プロトコルと混同せず、実際の経路で再検証する |
サブスクリプションインポート後の実測手順
サブスクリプションリンクは通常、複数のノードまたはクライアントが認識できる設定内容を返します。インポート時は、クライアントに用意された「クリップボードからインポート」「サブスクリプションを追加」「QRコード」などの入口を優先し、信頼できないウェブページにサブスクリプションアドレスを貼り付けないでください。サブスクリプションリンク自体にアクセス情報が含まれる場合があるため、アカウント情報として管理し、公開スクリーンショットや転送は避けましょう。
- クライアントの互換性を確認する。まず、クライアントがサブスクリプション内のプロトコルとトランスポートパラメータに対応しているか確認します。クライアントがノード名を読み取れたとしても、そのノードの完全な設定をコアが扱えるとは限りません。
- サブスクリプションをインポートして更新する。インポート結果に想定したノードが含まれているか確認し、更新失敗、証明書エラー、未対応形式などの表示に注意します。空のリストを、すべての回線がオフラインだと誤って判断しないでください。
- 基本接続を確立する。まず複雑なルーティングを無効にし、制御しやすいグローバルプロキシまたはクライアントの既定モードで、ノードが接続を確立できるか確認します。基本接続が通らないうちに、多数のルールを同時に変更してはいけません。
- 出口IPを確認する。接続前後でインターネット側の出口情報を確認します。変化がない場合は、アプリがVPNに入っているか、ブラウザーが古い接続を再利用していないか、システムに別のVPN設定が存在しないかを確認してください。
- DNSとIPv6を確認する。ドメイン解決リクエストが想定した経路を通っているか確認し、IPv4とIPv6を分けて観察します。一方のアドレス種別だけがトンネルを通っている場合、対象サービスにローカルネットワークの経路が見えることがあります。
- バックグラウンドの場面を追加する。接続を維持したままアプリを切り替え、画面を消し、その後ブラウザーまたは対象アプリに戻って新しいリクエストを送ります。確認するのは、古いページがキャッシュで残っているかではなく、新しい接続を確立できるかです。
- ネットワーク切り替えを追加する。異なる接続ネットワークへ切り替え、クライアントがネットワーク変化を処理するまで待ってから、出口とDNSを再確認します。手動で切断しないと復旧しない場合は、クライアントとプロトコルの組み合わせにおける切り替え後の復旧問題として記録してください。
- 最後にルーティング分けを有効にする。基本経路が安定してから、アプリ別リスト、ドメインルール、直接接続ルールを段階的に追加します。毎回1種類の設定だけを変更すれば、どの層が異常を引き起こしたか特定できます。
DNSリークと見かけだけの接続を調べる方法
DNSリークとは、通信本体はVPNを通っているのに、ドメイン検索だけがローカルネットワークや想定外のリゾルバーへ渡る状態です。ウェブページが開けなくなるとは限りませんが、アクセス先ドメインの解決リクエストが露出したり、コンテンツの地域判定が食い違ったりすることがあります。AndroidのプライベートDNS、クライアント内蔵DNS、ブラウザーの暗号化DNS、システムの名前解決経路が同時に関与する場合があるため、確認時は層ごとに単純化する必要があります。
まずクライアントがDNSを処理しているか確認し、ルーティングルールで名前解決リクエストやリゾルバーのアドレスが直接接続にされていないか確認します。次にAndroidのプライベートDNSを確認します。プライベートDNSはシステムレベルの暗号化名前解決を使いますが、VPNクライアントとの関係はクライアントのルーティングとシステム実装によって異なります。必ずリークする、または必ず安全だと一括りにはできません。解決結果に異常がある場合は、一時的にシステムの既定状態へ戻して比較し、システムとクライアントのどちらに名前解決を一元化するか決めてください。
ブラウザーが独自のセキュアDNSを有効にしていることもあります。その場合、システム側のテストとブラウザー側のテストで異なる結果が出ることがあります。トラブルシューティングでは、システムアプリとブラウザーを分けて検証し、ブラウザーが接続や解決結果をキャッシュしていないか、独自のプロキシ機能でリクエストを送っていないか確認してください。ノードを何度も切り替えるより、特定サイトの状態を消去するか、キャッシュのない新しいセッションを作るほうが、キャッシュの影響を切り分けやすくなります。
IPv6も「接続できているように見える」状態を作ります。クライアントがIPv4だけを処理し、現在のネットワークと対象の両方がIPv6に対応している場合、一部のリクエストがトンネルに入っていないIPv6経路を優先することがあります。クライアントがIPv6を処理しているか、プロキシされていないIPv6を明確に遮断しているか、サーバー側が対応しているかを確認するのが正しい方法です。システムのネットワーク機能を初期状態で無効にして、確認を終わらせないでください。
確認手順
接続前:出口情報とDNS経路を記録する
接続後:出口を再検索し、古いページを再利用しない
アプリ別:リスト内とリスト外のアプリを個別にテストする
アドレスファミリー:IPv4とIPv6を分けて確認する
バックグラウンド移行:復帰後に新しいネットワークリクエストを送る
ネットワーク切り替え:出口とDNSを再確認する
異常時:毎回1種類の設定だけを変更する
利用シーンに合わせてAndroid向け構成を選ぶ
主な用途がブラウザーと少数の海外アプリであれば、「選択したアプリのみプロキシ」を使い、ローカルサービスがトンネルに入る可能性を減らせます。この場合は、ログイン、ダウンロード、再生を実際に担うコンポーネントも検証対象に含め、ドメインルールで重要なリクエストが誤って直接接続されていないか確認してください。
大半のアプリをまとめてVPN経由にしたい場合は、既定のプロキシを使い、ローカル出口が必要なアプリだけを明示的に除外します。このモードは設定が簡単ですが、システムコンポーネント、LANアクセス、ローカルサービスとの互換性に注意が必要です。LAN内の機器へアクセスする場合は、プリンター、画面ミラーリング、ローカル管理画面が遠隔回線へ送られないよう、クライアントにLAN除外の項目があるか確認してください。
ネットワーク切り替えが頻繁に起きる場合は、クライアントの自動再接続と切り替え後の復旧を最優先の確認項目にします。プロトコルには代替案を残しておき、現在のネットワークがUDPに適さない場合は検証済みの別の伝送方式へ切り替えます。直接接続の経路が明らかに不安定なら、中継または専線経路と比較します。同じテストでプロトコル、ノード、クライアント、DNSを同時に変えないでください。復旧しても、どの変更が有効だったのか分からなくなります。
長時間のバックグラウンド接続が必要な場合は、必要なバックグラウンド実行権限を有効にし、常駐通知を残し、システムが許可する範囲でVPNを常時接続に設定します。厳格な遮断は設定確認を終えた環境に適しており、接続の不安定さを隠すために使うものではありません。自動接続の設定には、出口とDNSの再確認を組み合わせてください。端末の再起動後、画面表示だけが復旧して実際の通信経路が戻っていない状態を避けられます。