サブスクリプションURLは更新に使い、Base64はテキストを包み、共有リンクは単一ノードを表し、ネイティブJSONはコアの実行設定を記述します。「サブスクリプションを取得できるのに追加できない」「JSONをリンクに変換したらルーティングが消えた」といった場合は、まず入力形式を見分け、プロトコル・トランスポート・セキュリティ関連の項目を確認しましょう。そのうえでクライアントから追加して動作を検証すれば、エンコードの変換と設定形式の変換を混同せずに済みます。
1. サブスクリプションURL・レスポンス内容・ノード形式
「V2Rayのサブスクリプション」は、すべてのクライアントで共通して使えるファイル規格ではありません。一般にサブスクリプションとはHTTPSのURLを指し、クライアントがそこへアクセスして複数のノードを取得し、サブスクリプショングループに保存します。URLにアクセストークンが含まれる場合もあります。追加できるかどうかを決めるのは、サーバーが返す内容とクライアントが対応する解析方式です。
| 入力形式 | 一般的な構造 | 含まれる情報 | 利用する画面 |
|---|---|---|---|
| サブスクリプションURL | HTTPS URL | 取得先とアクセス認証情報 | サブスクリプショングループの設定 |
| Base64 サブスクリプション | Base64でエンコードされたテキスト全体 | 通常は共有リンクが1行ずつ並ぶ | サブスクリプションの更新、または対応するインポーター |
| 共有リンク | vmess://、vless:// | 単一ノードの接続パラメーター | クリップボードまたはQRコードから追加 |
| ネイティブ JSON | inbounds、outbounds などのオブジェクト | インバウンド、アウトバウンド、および任意のDNS・ルーティング設定 | カスタム設定画面、または対応するコアに直接読み込む |
サブスクリプションによってはリンク一覧をそのまま返すものもあれば、リクエストのパラメーターやクライアント識別情報に応じて形式を変えるものもあります。そのため、「拡張子がJSON」「ブラウザーで文字化けして見える」といった情報だけでは対応状況を判断できません。URLの名前ではなく、実際のレスポンスを確認しましょう。ログイン画面や期限切れの案内、エラーを示すJSONが返っている場合は、再エンコードしても有効なノードにはなりません。
2. Base64サブスクリプションとVMessの二重構造
一般的なBase64サブスクリプションは、複数の共有リンクを改行でつなぎ、全体をUTF-8テキストとしてBase64エンコードしてレスポンス本文に返します。クライアントは外側のエンコードを解除してから、各行のノードを解析します。Base64テキストの先頭に vmess:// を付けるだけではいけません。リスト全体が1つのVMessノードとして扱われてしまいます。
- レスポンス本文を取得し、HTMLページやアクセス権限エラー、空の内容ではないことを確認します。
- 本文がプロトコルのプレフィックス付きリンクで1行ずつ並んでいれば、平文のリンク一覧として扱います。
- 本文がBase64なら外側をデコードし、結果が認識可能な共有リンクになっているか確認します。
- ノードを1行ずつ解析します。
vmess://の場合は、仕様に沿って内部のペイロードもデコードします。
広く使われているVMess共有形式は、vmess:// にBase64エンコードされたJSONを続けたものです。ここでのJSONは共有形式のフィールドを表しており、V2FlyやXrayの完全な設定ではありません。以下はVMessリンクをデコードしたオブジェクトの例です。v の値 2 は共有形式のバージョンを示すもので、コアのバージョンではありません。
{
"v": "2",
"ps": "サンプルノード",
"add": "example.com",
"port": "443",
"id": "0f3a10d2-7f3b-4b58-a3f6-9a6fcbec8431",
"aid": "0",
"scy": "auto",
"net": "ws",
"type": "none",
"host": "example.com",
"path": "/ws",
"tls": "tls",
"sni": "example.com"
}
ドメイン名、UUID、パスは構造を説明するための例であり、そのまま接続には使えません。aid: "0" は現在のVMess AEADで一般的な設定です。古い解説にあるように64へ変更しないでください。scy はVMessのコンテンツ暗号化方式、tls はトランスポートのセキュリティ設定で、同じ項目ではありません。ジェネレーターによって数値・文字列の扱いや拡張フィールドに違いがある場合もあります。
- 外側のデコードエラー:サブスクリプション全体をデコードできない、またはデコード後の内容がノード一覧ではない。
- 内側のデコードエラー:一覧を展開できても、一部のVMessペイロードが有効なJSONではない。
- 文字化け:備考の日本語が文字化けする場合、UTF-8のバイト列を文字として直接扱っていることがよくあります。
3. VLESSリンクのクエリパラメーターとトランスポート設定
一般的なVLESS共有リンクは通常のURIに近い構造です。UUIDはユーザー情報、ホストとポートはアドレス部分に入り、トランスポートやセキュリティ、パスなどはクエリパラメーターで指定します。備考は # の後ろに置きます。以下はVLESS + WebSocket + TLSのサンプルリンクです。%2Fws をデコードすると /ws になります。
vless://[email protected]:443?encryption=none&security=tls&type=ws&host=example.com&path=%2Fws&sni=example.com#VLESS-WS-TLS
VMess共有リンクのフィールド
- サーバー
add = example.com- 接続先ポート
port = 443- トランスポートとパス
net = ws、path = /ws- コンテンツ暗号化
scy = auto- トランスポートのセキュリティ
tls = tls、sni = example.com
これらの短いフィールドはコアの設定に対応付ける必要があり、そのままアウトバウンドオブジェクトとして使うことはできません。
VLESSのクエリパラメーター
- サーバー
example.com:443- トランスポート
type=ws- リクエストパス
path=%2Fws- プロトコルの暗号化フィールド
encryption=none- トランスポートのセキュリティ
security=tls、sni=example.com
VLESS自体はコンテンツを暗号化しません。この例ではTLSが通信を保護します。
URIパラメーターに含まれる特殊文字は、正しくエスケープする必要があります。たとえばパスに & が含まれる場合は %26 にエンコードしてください。そうしないと、次のパラメーターとの区切りとして解釈されます。IPv6のホストは角括弧で囲みます。備考に日本語が含まれる場合は、パーセントエンコードするとクライアント間で引き継ぎやすくなります。備考だけの変更は通常接続に影響しませんが、パスやSNI、Hostを変えると実際のハンドシェイクに影響します。
4. ネイティブJSONをそのままサブスクリプションとして使えない理由
ネイティブ設定はコアを動作させるためのものです。複数のインバウンドやアウトバウンドに加え、DNS、ルーティング、ログの設定を含めることもできます。以下は階層構造を説明するVMess設定の例です。ローカルのSOCKSインバウンドは 127.0.0.1:10808 で待ち受け、リモートのアウトバウンドは example.com:443 に接続します。10808は説明用のローカルポートで、サブスクリプションURLのポートではなく、すべてのクライアントで共通の値でもありません。
{
"log": {
"loglevel": "warning"
},
"inbounds": [
{
"tag": "local-socks",
"listen": "127.0.0.1",
"port": 10808,
"protocol": "socks",
"settings": {
"auth": "noauth",
"udp": true
}
}
],
"outbounds": [
{
"tag": "proxy",
"protocol": "vmess",
"settings": {
"vnext": [
{
"address": "example.com",
"port": 443,
"users": [
{
"id": "0f3a10d2-7f3b-4b58-a3f6-9a6fcbec8431",
"alterId": 0,
"security": "auto"
}
]
}
]
},
"streamSettings": {
"network": "ws",
"security": "tls",
"tlsSettings": {
"serverName": "example.com"
},
"wsSettings": {
"path": "/ws",
"headers": {
"Host": "example.com"
}
}
}
}
]
}
この例では settings.vnext にVMessサーバーのパラメーターを、streamSettings にトランスポートとセキュリティのパラメーターを設定します。VLESSはプロトコル設定の構造が異なるため、protocol を vmess から vless に変えるだけでは使えません。XrayとV2Flyの設定構文には共通部分もありますが、拡張機能やフィールドの変更は異なります。JSONの構文が正しくても、対象のコアで動作するとは限りません。
変換の範囲:ノードの移行と設定一式の移行
ノードだけを移行
- プロキシのアウトバウンドからサーバー、ポート、UUIDを取り出します。
- WebSocketのパスとHost、TLSのSNIを維持します。
- 移行先のクライアントが対応する共有リンクを生成します。
- DNS、ルーティング、ローカルの待ち受けポートは移行先のクライアントで設定します。
設定一式を移行
- アウトバウンドのタグとルーティングの参照関係を維持します。
- DNS、インバウンドの待ち受け、ログの設定を確認します。
- 移行先のコアが対応するすべてのフィールドを確認します。
- カスタム設定画面から読み込み、実際の動作ログを確認します。
通常のノード共有リンクには、DNSやルーティングのルール一式は含まれません。完全な設定をリンクに変換して再度読み込んでも、通常は元の状態に戻せません。
5. v2rayN・v2rayNG・v2flyNGのインポート対応範囲
クライアントはサブスクリプションの解析やノード管理を行い、実際の接続はコアが処理します。v2rayNは設定に応じて対応コアを利用するデスクトップクライアントです。v2rayNGはXrayコアを使うAndroidクライアント、v2flyNGはV2Flyコアを使うAndroidクライアントです。3つともVMessリンクを解析できるからといって、VLESSやREALITY、完全なJSON設定にも同じように対応しているとは限りません。
| クライアント | 主な入力形式 | ネイティブ設定の扱い | 重点確認項目 |
|---|---|---|---|
| v2rayN | サブスクリプションURL、対応するノード共有リンク | カスタム設定画面を使い、コアを合わせる | インポーターと選択したコアの両方がノードの各フィールドに対応しているか |
| v2rayNG | サブスクリプションURL、クリップボード、QRコードのノード | 使用中のバージョンに用意されているカスタム設定機能を使う | Xrayのバージョンと、トランスポート・セキュリティ関連のパラメーターが揃っているか |
| v2flyNG | サブスクリプションURL、対応するノード共有リンク | 現在のバージョンにある設定画面からV2Fly設定を読み込む | Xray専用の設定をV2Flyに直接渡さない |
以下では、v2rayN 7.xの中国語UIで一般的なメニューを例に説明します。マイナーバージョンによってメニュー名が変わる場合があります。手元にあるのがサブスクリプションURLかノードのテキストかを先に見分けてから、対応するメニューを選ぶほうが、同じインポートボタンを何度も試すより効率的です。
-
入力形式を見分ける
HTTPSのサブスクリプションURLはサブスクリプショングループから追加します。
vmess://またはvless://で始まるテキストはノードとしてインポートします。inbounds、outboundsを含むJSONは、まず完全な設定として扱ってください。 -
サブスクリプションを追加
「サブスクリプショングループ」→「サブスクリプショングループの設定」でグループを追加し、名前とサブスクリプションURLを入力します。保存後、「サブスクリプショングループ」から更新します。ネットワークの接続状況に応じて、プロキシ経由またはプロキシを使わない更新方法を選んでください。
-
単一ノードをインポート
リンク全体をコピーし、「サーバー」→「クリップボードから一括URLインポート」で読み込みます。複数のリンクは1行ずつ並べます。v2rayNGでは、メイン画面の「+」→「クリップボードからインポート」から同様に操作できます。
-
フィールドを確認
ノードの編集画面を開き、サーバー、接続先ポート443、UUID、トランスポート、パス、Host、SNIを確認します。REALITYノードではノード名だけでなく、公開鍵、short ID、フィンガープリント、Flowも確認してください。
-
接続を確認
ノードを選んでテストし、ログを確認します。未対応のプロトコルやフィールドが表示される場合はコアを確認してください。アドレスや証明書、ハンドシェイクのエラーならノード設定を見直します。最後に必要なシステムプロキシまたはTUNモードを有効にします。
6. 形式の変換方法:更新を続けるか、スナップショットを書き出すか
共有リンクからBase64サブスクリプションへの変換は、リンクを並べてエンコードするだけです。Base64サブスクリプションから共有リンクへの変換は、デコードして行ごとに分けます。どちらも外側の形式を変えるだけで、VMessがVLESSに変わるわけでも、サーバーのパラメーターが自動で補われるわけでもありません。サブスクリプション提供元がノードを変更しても、ローカルに書き出したファイルには反映されません。
元のサブスクリプションURLを使い続ける
おすすめ移行先のクライアントが元のサブスクリプション形式に対応している場合は、サブスクリプショングループに直接追加してください。提供元が管理するノード一覧を引き続き取得できるため、更新のたびにファイルをコピーし直す必要がありません。両方の端末で更新タイミングが異なると、一時的に一覧が異なることがあります。
おすすめの用途:日常利用、デスクトップとAndroidで同じノード提供元を利用
共有リンクのスナップショットを書き出す
少数のノードだけを移行する場合は、クライアントの共有またはエクスポート機能を使い、移行先でインポートします。書き出した後、トランスポートとセキュリティの各フィールドを確認してください。未対応の拡張パラメーターは、再度エクスポートすると失われる可能性があります。
おすすめの用途:単一ノードの移行、特定のリンクの解析エラーの調査
ネイティブJSONを移行
ルーティング、DNS、複数のアウトバウンドを維持するには、共有リンクに変換するのではなく、設定全体が移行先のコアに対応しているか確認します。ローカルポートがクライアントの既存の待ち受けポートと競合しないよう注意してください。
おすすめの用途:完全な設定があり、コアの動作を細かく制御したい場合
ローカルでのエンコード例:まずUTF-8のバイト列を扱う
以下は、一般的なBase64の処理を理解するための、ネイティブJavaScriptによるローカルエンコード・デコード関数です。ネットワークへのリクエスト、ノードの解析、ネイティブ設定の生成は行いません。入力には、有効であることを確認済みのリンク一覧を使ってください。運用中のサブスクリプションを、見知らぬWebサイトのコンソールに貼り付けないでください。
function encodeList(text) {
const bytes = new TextEncoder().encode(text);
const binary = Array.from(bytes, byte =>
String.fromCharCode(byte)
).join("");
return btoa(binary);
}
function decodeList(encoded) {
let normalized = encoded.trim()
.replace(/\s+/g, "")
.replace(/-/g, "+")
.replace(/_/g, "/");
normalized += "=".repeat((4 - normalized.length % 4) % 4);
const binary = atob(normalized);
const bytes = Uint8Array.from(binary, char =>
char.charCodeAt(0)
);
return new TextDecoder("utf-8", { fatal: true }).decode(bytes);
}
- エンコード前にノードを改行でつなぎ、URI同士が連結しないようにします。
- デコード関数は、一般的なURLセーフ文字への置換とパディングの欠落に対応します。不正な内容の場合はエラーになります。
- デコード結果が単一のJSONオブジェクトなら、それが共有用のペイロードか完全な設定かを確認してください。ノード一覧としてそのままインポートしてはいけません。
- ローカルのテキストを更新可能なサブスクリプションにするには、アクセス可能なサーバーを構築してアクセス権を管理する必要があります。エンコードだけではサブスクリプションURLは作成されません。
7. 形式変換とサブスクリプションの追加でよくある質問
サブスクリプションを開けるのに、クライアントにノードが表示されないのはなぜですか?
まずレスポンスの先頭をローカルで確認します。HTMLや期限切れの案内、エラーオブジェクトが返る場合は、サブスクリプションの権限を確認してください。Base64ならデコードし、プロトコル付きリンクが行ごとに含まれているか確認します。完全なJSONが返る場合は、対応するカスタム設定画面を使うか、クライアントが対応するサブスクリプション形式を提供元に問い合わせてください。
JSONをエンコードしたのに、インポートできないのはなぜですか?
Base64にしても内部の構造は変わりません。outbounds を含む設定オブジェクトは、エンコード後も設定オブジェクトのままであり、リンク一覧にはなりません。まずプロキシのアウトバウンドから情報を取り出し、サーバー、ユーザー、トランスポート、セキュリティの各フィールドに対応付けます。その後、それらの項目に対応するツールまたはクライアントで共有リンクを書き出してください。
インポートできたのに、接続に失敗するのはなぜですか?
インポートが成功したというのは、解析処理がテキストを受け付けたという意味にすぎません。ノードの編集画面で接続先ポート、UUID、WebSocketパス、SNIを確認し、ログに証明書、ハンドシェイク、未対応フィールドのエラーがないか確認してください。ローカルSOCKSの10808をリモートサーバーのポートに設定しないでください。
端末を替えたら、以前のルーティングルールがなくなったのはなぜですか?
通常のノードリンクに含まれるのは、ノードのパラメーターだけです。移行先クライアントのルーティング設定からルールを再設定するか、互換性のあるカスタム設定全体を移行してください。アウトバウンドのタグとルーティングの参照先が一致しているか確認します。サーバーアドレスとUUIDだけを移行しても、ルーティング全体は復元できません。
サブスクリプションURLを他人に渡してしまいました。備考を変更すれば大丈夫ですか?
ノードの備考を変えてもアクセス権限は取り消せません。提供元の管理画面でサブスクリプションのトークンまたはURLを再発行し、クライアントのサブスクリプショングループでも古いURLを新しいものに置き換えて更新してください。ノードの認証情報も漏えいした場合は、サーバーの管理者に該当する認証情報の変更を依頼してください。
最後に、次の3段階で確認します。まず取得したレスポンスの内容、次にクライアントが解析できるか、最後にコアが接続できるかを確認してください。クライアントのバージョン、使用中のコア、ノードのトランスポート、エラーログを記録しておくと、Base64の再エンコードを繰り返すより原因を特定しやすくなります。基本設定はクイックスタート、プロトコルやセキュリティ関連の項目はプロトコル詳解をご覧ください。