現在のノードを残したまま、サブスクリプションURLとサーバーの応答を確認し、通信エラーと内容の解析エラーを切り分けます。v2rayN(デスクトップ版)とv2rayNG(Android版)が対象です。URL、更新経路、形式、システム時刻を順に確認すれば、どの段階で止まっているかを特定でき、サブスクリプションを削除したりコアを変更したりせずに済みます。
まず確認:内容を取得できないのか、取得した内容を解析できないのか
「更新失敗」は結果であって、原因ではありません。通常、サブスクリプションの更新ではクライアントがHTTPリクエストを送り、テキストを取得してノードを解析し、該当グループに追加します。この処理はノードの接続テストとも、XrayやV2Flyの起動確認とも別です。更新に失敗したら、最後の「インポート失敗」だけでなく、クライアントログで最初に記録されたエラーを確認してください。
- 本文を取得できない:まず、DNS名前解決、接続タイムアウト、プロキシ経路、TLS証明書、HTTPステータスを確認します。
- 本文は取得できるが、ノードが1件もインポートされない:ログインページやエラーメッセージ、空のテキスト、クライアント非対応の形式が返されていないか確認します。
- 更新は成功したが、ノードを使えない:サーバーアドレス、ポート、プロトコル設定、ルーティングルールを確認します。これはサブスクリプションのダウンロード失敗ではありません。
手順1:サブスクリプションURLをコピーし直し、利用権限を確認する
最初にURL自体の問題を確認します。サブスクリプションURLには通常、アクセス用トークンが含まれています。アカウントのトップページや購入ページ、ノード単体の共有リンクでは代用できません。コピー時にクエリパラメーターが欠けたり、改行が混ざったり、半角の & が & という文字列になったりすると、認証に失敗したり、別のリソースにアクセスしたりすることがあります。
-
以前のグループを残す
元のグループ名とノード数を記録します。接続できるノードを失わないよう、すべてのサーバーを削除せず、まずサブスクリプションURLだけを編集してください。
-
専用URLをコピーする
サブスクリプション提供元のアカウントページでエクスポート画面を開き、v2rayNまたはv2rayNG向けの形式を選択します。チャットのスクリーンショットや折り返されたテキストから手作業でつなげず、コピー用ボタンを使ってください。
-
URL全体を確認する
スキーム、ドメイン、パス、クエリパラメーターがすべて含まれていることを確認し、先頭と末尾の空白や引用符を取り除きます。トークンが再発行されている場合、古いURLは使えないことが多いため、新しいURLをコピーしてください。
-
対象グループだけを更新する
URLを保存したら、対象のグループだけを更新し、結果を一度記録します。複数の提供元を同時に更新すると、ログのタイムアウトや認証エラーを見分けにくくなります。
信頼できる端末のブラウザーでサブスクリプションURLを開くと、テキストが返るか、ファイルをダウンロードできるかを確認する手がかりになります。ただし、ブラウザーはログインCookieを送信したり、異なるプロキシを使ったり、サーバーから別の応答を受け取ったりすることがあります。ブラウザーで開けるだけでは、クライアントでも更新できるとは限りません。URL全体をオンラインのデコード・速度測定・変換サイトに貼り付けないでください。
手順2:HTTPステータスを確認し、ログインページをサブスクリプションと誤認しない
HTTPステータスは原因の切り分けに役立ちますが、本文が正しいことを単独で証明するものではありません。以下は標準のHTTPステータスコードであり、速度測定の結果ではありません。クライアントにステータスコードが表示されない場合はログを確認してください。提供元の管理画面にあるリクエスト履歴も参考になります。
| 応答の状態 | まず確認すること | 次に行うこと |
|---|---|---|
200、本文が <!DOCTYPE html> で始まる | ログイン、本人確認、エラーなどのWebページが返されています | サブスクリプション専用URLを取得し直し、プログラムからアクセスするためのURLを提供元に確認する |
401 または 403 | 認証情報が無効、権限がない、またはアクセス制限によりブロックされています | トークンとアカウントの状態を確認する。403だけでプランの期限切れとは判断できません |
404 または 410 | 指定したパスが存在しないか、リソースが削除されています | アカウントページから現在のサブスクリプションURLをコピーし直す |
429 | 短時間にリクエストしすぎたか、サーバー側のレート制限に達しています | 連続で操作せず、応答に Retry-After が含まれている場合は指定された時間だけ待つ |
5xx | サーバー側または上流の処理に失敗しています | 以前のノードを残し、時間をおいて再試行してから提供元に問い合わせる |
手順3:プロキシを使わない更新と、使う更新をそれぞれ試す
サブスクリプションのドメインとノードのサーバーは別の接続先です。ノードが使えてもサブスクリプションのドメインに直接接続できるとは限らず、サブスクリプションをダウンロードできてもノードに接続できるとは限りません。v2rayNの更新メニューには「プロキシを使用しない」「プロキシを使用する」があります。両方を試してください。システムプロキシを切り替えただけで、更新リクエストの経路が変わったと決めつけないようにしましょう。
-
サブスクリプション設定を開く
v2rayNで「サブスクリプショングループ」→「サブスクリプショングループ設定」を開き、対象グループのURLを確認します。画面の表記はバージョンによって多少異なる場合があるため、現在の画面にある同等の項目を選んでください。
-
プロキシを使わずに更新する
「サブスクリプショングループ」から「現在のサブスクリプションを更新(プロキシを使用しない)」を選びます。テストは一度だけ行い、タイムアウト、証明書エラー、HTTPエラーの有無を記録してください。
-
プロキシが使えることを確認する
以前に接続できたノードを選んでコアを起動し、「現在のサブスクリプションを更新(プロキシを使用する)」を選びます。使えるノードが一つもなければ、この経路だけで接続を復旧することはできません。
-
Androidのグループを確認する
v2rayNGのメイン画面で右上のメニューから「サブスクリプショングループ設定」を開き、URLを確認して保存します。メイン画面に戻り、対象グループを選択して、メニューから「現在のグループのサブスクリプションを更新」を実行してください。
-
再試行して結果を比較する
v2rayNGでは、サービスを停止した状態と、利用可能なサービスを起動した状態の両方で再試行し、ログを比較できます。VPNの接続状態だけでサブスクリプションの通信経路を判断せず、現在のバージョンにある更新方法とルーティング設定も確認してください。
手順4:エンコードとサブスクリプション形式を確認する
一般的なサブスクリプション本文は、複数の共有リンクか、それらのリンクをまとめてBase64エンコードしたテキストです。クライアントはまず外側の形式を判別し、その後で各ノードを解析します。単体の vmess:// のデータにも別のエンコード層が含まれる場合があります。「読める文字列に見える」までレスポンス全体を何度もデコードしないでください。
- 共有リンクの一覧:デコード後のテキストに
vmess://、vless://、trojan://などクライアントが対応するスキームが含まれているか、各項目が途中で切れていないか確認します。 - エラーの応答:JSONオブジェクトに
errorやmessageなどのエラー項目だけがある場合、通常はAPIからのエラー応答です。ノード一覧としてインポートするものではありません。 - 形式の不一致:YAML設定やコア全体のJSON設定は、サブスクリプションURLの一覧として解析できるとは限りません。提供元のエクスポート画面で対象クライアント向けの形式を選んでください。
- データの破損:途中で切れたBase64、文字の置き換わり、エンコード層の誤りは、いずれも解析エラーの原因になります。文字を手作業で補うのではなく、まず元のレスポンスを取得し直してください。
空行や案内文、未対応のノードがレスポンスに含まれていると、一部だけインポートされたり、エラーが表示されたりすることがあります。動作はパーサーの実装によって異なります。更新後のノード数が以前より少ない場合は、インポートログと提供元が現在返している内容を確認してください。クライアントがノードを削除したとすぐに判断しないようにしましょう。
サブスクリプションの解析はクライアントの機能であり、ノードの動作にはコアの機能が関係します。VLESSの設定やその他のプロトコル項目を認識できない場合は、クライアントのバージョンとエクスポート形式を確認してください。XrayをV2Flyに替えても、Webページの応答や破損したBase64は修復できません。
手順5:エラー内容からDNS・TLS・時刻の問題を特定する
以下は、ネットワークライブラリやデコードライブラリでよく見られるエラーの一部です。大文字・小文字、接頭辞、補足情報はクライアントのバージョンによって異なります。すべてのエラーが同じクライアントに表示されるわけではありません。確認時はエラーが発生した段階を見極め、コアの接続ログとサブスクリプションのダウンロードログを混同しないでください。
エラー:No such host is known
原因:ドメイン名を解決できていません。URLの入力ミス、システムのDNS、ネットワーク環境などが原因として考えられます。
対処法:まずサブスクリプションのドメインを確認し、同じネットワークで再試行します。必要に応じて信頼できる別のネットワークでも試し、実際のリクエスト経路で使われるDNSを確認してから設定を変更してください。
エラー:Connection refused
原因:接続先のポートで接続が拒否されました。接続先がローカルアドレスの場合は、まずローカルプロキシが待ち受けているか確認してください。
対処法:エラーに記載されたホストとポートを確認し、サブスクリプションサーバーとローカルプロキシのどちらかを特定して、それぞれサーバー側またはローカルコアの動作状態を確認します。
エラー:x509: certificate has expired or is not yet valid
原因:証明書の有効期間と端末の現在時刻が一致していません。システム時刻の誤りか、サーバー証明書の期限切れが考えられます。
対処法:システムの日付と時刻を正確に設定してから再試行してください。時刻が正しいのに失敗する場合は、サブスクリプション提供元に証明書の対応を依頼します。証明書の検証を無効にしないでください。
エラー:illegal base64 data at input byte 0
原因:Base64デコーダーに渡された内容が、先頭から想定された形式ではありません。形式の誤りやWebページの応答でよく発生します。
対処法:レスポンス本文の先頭とエクスポート形式を確認し、サブスクリプション全体を取得し直してください。実際のエラーでは、位置を示すバイト番号が異なる場合もあります。
Windowsでは「設定」→「時刻と言語」→「日付と時刻」を開き、自動時刻設定を有効にして同期します。Androidではシステムの「設定」から「日付と時刻」を開き、ネットワーク提供の時刻を有効にしてください。メーカーによって項目の場所や表記は異なります。タイムゾーンは主に表示に関わる設定ですが、実際の日付と時刻も正しいか確認してください。
更新成功後:グループを確認してからノードをテストする
成功の表示は、その更新処理が完了したことを示すだけです。対象グループに想定したノードが追加されたか、別のグループを見ていないか、重複項目がないかも確認してください。その後ノードを一つ選んで接続テストを行い、「サブスクリプションのインポート」と「通信の復旧」をそれぞれ確認します。
- グループが空:別のグループを選んでいないか、サーバーから空のサブスクリプションが返されていないか、すべての項目で解析エラーが記録されていないか確認します。
- ノードはあるが接続テストに失敗する:サーバーアドレス、ポート、TLSのホスト名、プロトコル設定を確認します。サブスクリプションの更新に成功しているなら、トークンを何度も再発行しないでください。
- 一部のアプリだけで問題が起きる:システムプロキシ、TUN、アプリ独自のプロキシ設定、ルーティングルールを確認します。これはサブスクリプションの解析段階の問題ではありません。
- 問い合わせる場合:クライアント名、実際のバージョン、OS、失敗した時刻、更新方法、個人情報を伏せたエラー行を伝えてください。サブスクリプションURL全体、トークン、ノードの認証情報、アカウント情報は伏せてください。
確認を終える条件も決めておきましょう。正しいレスポンスを取得してインポートできたら、サブスクリプションに関する変更は終了です。権限の失効やサーバーエラーが原因だと分かった場合は、使える設定を残して提供元に確認してください。DNS、ポート、コアを次々に変更して問題の範囲を広げないようにしましょう。