サブスクリプションリンクの正体
サブスクリプションリンクとは、本質的には単なる HTTP/HTTPS アドレスにすぎません。クライアントはこのアドレスに定期的にアクセスしてテキスト内容を取得し、それを何らかの約束に従ってノードリストとルールへ解析します。問題は、この「約束された形式」が一種類ではないことです。異なるプロキシ系統はそれぞれ独自にテキスト構造を定義してきたため、同じ「サブスクリプション」という概念のもとでも、実際に流通している主流形式は少なくとも3種類あります。Clash系のYAML設定、v2ray/Shadowsocks系のBase64ノードリスト、そして一部のパネルソフトが出力する専有JSON形式です。あるクライアントがそのリンクを「読める」かどうかは、対応する形式のパーサーを実装しているかにかかっています。
これが、同じサブスクリプションリンクがあるクライアントでは正常にインポートできるのに、別の異なるプロトコルスタックを使うクライアントでは形式エラーや空リストになる理由です。リンクが壊れているわけではなく、両者が使っている「言語」が違うだけなのです。
Clash YAML設定:構造化・可読性・情報量の最も高い形式
Clash と Clash Meta(コアは mihomo)が使うサブスクリプション形式は標準的なYAMLテキストで、完全な設定にはいくつかのトップレベルフィールドが含まれます。
port: 7890
socks-port: 7891
mode: rule
proxies:
- name: "HK-01"
type: ss
server: example.com
port: 443
cipher: aes-256-gcm
password: "your-password"
proxy-groups:
- name: "自動選択"
type: url-test
proxies: [HK-01]
url: "http://www.gstatic.com/generate_204"
interval: 300
rules:
- DOMAIN-SUFFIX,google.com,自動選択
- MATCH,DIRECT
ご覧のとおり、YAML形式はノード(proxies)だけでなく、ノードをどのようにグループ化するか(proxy-groups)、通信をどのルールでどのグループに振り分けるか(rules)まで記述しています。これが他の形式との決定的な違いです。YAMLサブスクリプションは単なるアドレスリストではなく、「実行可能な一式のポリシー」そのものなのです。情報量が多い分、フィールドの表記やインデントの階層には厳密さが要求され、スペースが1つ足りなかったり、インデントにタブが混入したりするだけで、設定全体の解析が失敗することがあります。
注意:YAMLはインデントに非常に敏感で、同じ階層のフィールドの前にあるスペース数は完全に一致させる必要があり、Tabキーによるインデントは禁止です。手作業で設定ファイルを編集する場合は、YAMLのシンタックスハイライトに対応したエディタを使うことをお勧めします。目視ではスペース1つの不足を見落としやすいためです。
Base64ノードリスト:軽量だが「アドレス一覧」にすぎない
もう一つよく見られる形式は、Shadowsocks、V2Ray、Trojan、VLESSなどのプロトコルがそれぞれ持つクライアント系統から生まれたものです。この種のサブスクリプションを開くと、改行のない一続きの、見た目には規則性のない文字列が表示されることが多く、例えば c3M6Ly8... のように始まります。実際にはこれは複数のノードリンク(それぞれ ss://…、vmess://…、trojan://… の形)を改行でつなぎ、それを丸ごとBase64エンコードしたものです。目的はQRコードや純テキスト環境での伝送を容易にし、特殊文字がエスケープされて壊れることを避けるためです。
デコード後、各行はおおむね次のような構造になります(Shadowsocksを例に):
ss://[email protected]:443#HK-01
vmess://eyJ2IjoiMiIsInBzIjoiSEstMDIiLCJhZGQiOiJleGFtcGxlLmNvbSJ9
trojan://[email protected]:443?sni=example.com#HK-03
この形式の情報密度はYAMLよりはるかに低く、「どのノードがあり、アドレスは何で、どんな暗号方式を使うか」しか記述されておらず、グループ化ポリシーやルーティングルールは含まれません。クライアントはこのリストを受け取った後、ルールをどう決めるか、ノードをどうグループ化するかを、すべて自身に内蔵されたデフォルトポリシーで判断します。これが、よくある疑問を説明します。同じBase64サブスクリプションを2種類のクライアントにインポートすると、ノード数は同じでも、プロキシモードのグループ構造やデフォルトの振り分けがまったく異なる、という現象です。グループ化ルールはそもそもサブスクリプション内容の一部ではなく、クライアント側が独自に補っているものだからです。
インポート後にノードが表示されない・エラーになる原因
上記2つの形式の違いを踏まえると、サブスクリプションのインポート失敗はおおむね次のいくつかに分類できます。
- 形式の不一致。純粋なBase64ノードリストをClash YAMLとして無理に読み込ませると、クライアントはYAMLパーサーで意味不明な文字列を読もうとするため、当然形式エラーになります。逆に、YAML設定ファイルの内容をBase64としてデコードしようとしても、意味のない乱れた文字列が得られるだけです。
- プロトコルフィールドが未対応。YAML内の
typeフィールドに書かれたプロトコル種別(例えば一部の新しいトランスポート層拡張パラメータ)について、クライアントのコアバージョンが古く、対応するプロトコルパーサーがまだ実装されていない場合、そのノードはスキップされるか、設定全体の解析が失敗します。エラーメッセージには通常、どの行・どのフィールドかが示されます。 - User-Agentによる拦截(ブロック)。一部のサブスクリプションサーバーはリクエストのUser-Agentによって異なる内容を返し、「非公式クライアントらしき」リクエストには空の内容やエラーページを返すことがあります。この場合、インポート後にノード数が0として表示されます。
- エンコードや改行の問題。Base64の内容を手作業でコピー&ペーストする際、余分な改行やスペースが混入したり、コピーが不完全だったりすると、デコード結果が途中で途切れ、一部のノードが欠落したり、全体の解析が失敗したりします。
- リンク自体が失効している。サブスクリプション提供元側でアドレスが無効化されていたり、通信量を使い切って内容の返却が制限されている場合、これはクライアント側では解決できず、サブスクリプション提供元に確認する必要があります。
切り分けの手順は次の順番で進めるのがお勧めです。まずサブスクリプションリンクがブラウザで正常に開けて内容が表示されるか確認し、次に返された内容の先頭の特徴を見ます(YAMLは通常 port: や proxies: で始まり、Base64リストは通常スペースのない一続きの文字列です)。最後にクライアント自身のログページを確認します。多くの解析エラーには具体的な行番号が示されます。
形式間の変換方法
手元のサブスクリプション形式とクライアントが要求する形式が一致しない場合、一般的な方法は変換ツールを使って途中で「翻訳」を行うことで、手作業での書き換えは避けるべきです。現在コミュニティで広く使われているのは subconverter のようなオープンソースの変換サービスで、原理は次の通りです。元のサブスクリプションリンクを入力すると、目的の形式(Clash YAML、汎用Base64リストなど)の新しいリンクが出力され、クライアントはその変換後の新しいアドレスを直接サブスクリプションすればよく、以降の更新も自動的に反映されます。
よくある2つの変換方向
- Base64ノードリストからClash YAMLへの変換:変換サービスが各
ss:///vmess:///trojan://リンクからプロトコルパラメータを解析し、proxiesフィールドに書き込み、対象クライアントの種類に応じて既定のproxy-groupsとrulesを補います(一部のサービスではルールテンプレートを指定可能)。 - Clash YAMLから汎用Base64リストへの変換:変換サービスは
proxies部分のノード情報のみを保持し、それぞれ対応するプロトコルのリンク形式に再構成してBase64エンコードします。グループ化やルール情報はこの段階で失われます。対象形式そのものがルールを記述できないためです。
注意:構造化された形式からノードリスト形式への変換は一方向の情報損失であり、ルーティングルールやグループ化のロジックは保持されません。別のクライアントで一時的に応急使用するだけであれば問題ありませんが、この変換後のリンクに長期的に依存する場合は、二次変換に頼るのではなく、サブスクリプション提供元に直接ネイティブ対応形式のアドレスを問い合わせることをお勧めします。
変換時の安全性と安定性に関する注意点
変換サービスは本質的に中間プロキシであり、元のサブスクリプション内容はまず変換サーバーを経由してからクライアントに届きます。以下の点に留意する必要があります。
- 自前で構築した、または信頼できる変換バックエンドを優先する。パブリックな変換サーバーは、それを経由するサブスクリプションの元の内容を見ることができます。サブスクリプションにアカウント関連の機密パラメータが含まれる場合は、オープンソースで自前デプロイ可能な変換サービス、またはサブスクリプション提供元が公式に用意している変換インターフェースのみを使うようにしましょう。
- 変換後にノード数を確認する。変換の過程で一部の認識できないプロトコルパラメータが暗黙的に破棄されることがあります。変換前後のノード数が一致しているか比較し、差が大きい場合は変換ログを確認するか、別のルールテンプレートに切り替えましょう。
- ルールテンプレートはクライアントのバージョンに合わせる。異なるルールテンプレートは異なるグループ化の習慣に対応しています(例えばストリーミング専用グループを分けるか、特定の地域グループを内蔵するかなど)。変換時に選ぶテンプレートは自分のクライアントの使用習慣と噛み合わせる必要があります。噛み合わないと、想定と異なるノードグループになることがあります。
- 変換後のリンクも更新サイクルに合わせて更新する必要がある。変換サービスは通常、元のサブスクリプションをリアルタイムで取得してから変換して返します。元のサブスクリプションが期限切れになったり変更されたりすると、変換後のリンクもそれに応じて無効になるため、同期して更新する必要があります。
インポート前の3ステップチェック
サブスクリプションリンクの形式が分からないときは、以下の順番で手早く判断すれば、何度もインポートを試してエラーに悩まされずに済みます。
- ブラウザのアドレスバーで直接サブスクリプションリンクを開き、返された内容の先頭の文字を確認します。
port、proxies、mixed-portなどのフィールドが出てくればほぼClash YAMLと判断でき、改行のない一続きの文字列であればBase64ノードリストと判断できます。 - 現在使用しているクライアントのコアの種類を確認します(Clash Meta / mihomo コアは通常より互換性が広く、対応するプロトコル種類も多いです)。コアのバージョンが古い場合は、まずクライアントを更新してからインポートすることをお勧めします。
- 形式が確かに一致しない場合は、変換ツールの利用を検討し、前節の安全に関する提案に従って変換バックエンドを選びましょう。
この3ステップを終えれば、「サブスクリプションのインポート失敗」「ノードリストが空」といった問題のほとんどは、試行錯誤を繰り返さずに具体的な原因を特定できます。