この記事は、接続に必要なパラメータを入手済みで、ShadowrocketにTrojan接続を追加する方向けです。ネットワークアドレス、TLSの識別情報、プロトコル認証情報を整理してから、Add Serverの各項目を設定します。最後に、接続タイムアウト、証明書エラー、接続後に通信できない場合の切り分け方を説明します。例に記載するドメイン名とパスワードは説明用の仮の値であり、接続には使用できません。
Trojanの仕組み:TLS接続とPassword認証の役割
ShadowrocketのTrojanタイプは、対応するプロトコルを使うサーバーへの接続に使用します。一般的なTrojan接続では、まずサーバーとTCP接続を確立し、その後TLSハンドシェイクを行います。TLSの通信路が確立してから、クライアントがTrojanプロトコルの認証情報と宛先リクエストを送信します。TLSは通信の保護とサーバーの身元確認を担い、Passwordはプロトコルレベルの認証に使われます。両者は代用できません。
Addressは実際に接続するサーバーを指定し、Portはサーバーの待ち受けポートを指定します。SNIはTLSハンドシェイクで、接続先として要求するホスト名をサーバーに伝えます。証明書の検証では、信頼チェーン、有効期間、ホスト名が要件を満たすかも確認します。そのため、アドレスに接続できてもTLS検証に成功するとは限らず、TLS検証に成功してもPasswordが正しいとは限りません。
この記事では、一般的なTrojan over TLSを前提に説明します。パラメータにWebSocket、Host、Pathが指定されている場合は、それぞれサーバー側の設定に従ってください。この記事の基本例で既存の設定をそのまま上書きしないでください。Typeだけを変更しても、別のプロトコルを使うサーバーがTrojanサーバーに変わるわけではありません。
設定前の準備:接続情報とTLS情報を分けて整理する
以下は、利用者がすでにサービスとサブスクリプションを利用していることを前提としています。本サイトではノードやサブスクリプションを提供・販売・推奨していません。開始前に必要なパラメータをすべて入手し、サーバーアドレスだけから他の項目を推測しないでください。Password、サブスクリプションURL、共有リンク全体には接続情報が含まれる場合があります。公開スクリーンショットやトラブル記録には載せないでください。
基本的な接続設定例
- Type
- Trojan
- Address
edge.example.com- Port
443- Password
demo-only-not-valid
いずれも説明用の仮の値です。実際には、利用者が入手済みのパラメータを入力してください。
TLSの確認例
- SNI
tls.example.com- 証明書の識別情報
- 証明書の名前に、検証対象のホスト名が含まれている必要があります
- 証明書の信頼性
- 信頼チェーンと有効期間の検証が必要です
- Allow Insecure
- この項目がある場合、通常はオフのままにします
SNIとAddressは異なっていても構いませんが、サーバー側の設定に基づく必要があります。
AddressがIPアドレスで、サーバーがドメイン名の証明書を使っている場合、通常は指定されたドメイン名をSNIに入力します。IPアドレスをそのままSNIにコピーして「一致」させたり、よく知られたWebサイトのドメイン名に置き換えたりしないでください。その名前は、サーバーのTLS設定と証明書の識別情報の両方に合致している必要があります。
- Addressにはホスト名またはIPアドレスのみを入力します。
https://、パス、末尾のスラッシュは付けません。 - Portには数字だけを入力します。たとえば、サーバーの実際の待ち受けポートが
8443なら、入力する値も8443です。TLSを有効にしたからといって443に変更してはいけません。 - Passwordは大文字・小文字や特殊文字を変えずに入力し、コピー時に空白や改行が混入していないか確認します。
- SNIにはホスト名を入力します。プロトコルの接頭辞、ポート番号、パスは付けません。値が分からない場合は、推測せず元のパラメータを確認してください。
Add Serverの操作:入力して保存し、接続を選択する
Shadowrocketでは、Homeで接続を管理・選択し、Configで設定ファイルやルールを扱い、Settingsでアプリの設定を変更します。Trojan接続を個別に追加するには、Homeの追加ボタンからAdd Serverを開きます。AddressやPasswordをConfigのルール一覧に入力するものではありません。
- Homeを開き、右上の追加ボタンをタップしてAdd Serverを開き、Typeを
Trojanに設定します。 - 元のパラメータに従ってAddressとPortを入力します。アドレスが「ホスト名:ポート」の形式で示されている場合は、2つの項目に分けて入力します。
- Passwordを入力します。ここで使うのはサーバーから指定されたTrojanのパスワードです。App Storeの購入情報や証明書ファイルの内容ではありません。
- TLS関連の設定を確認し、元のパラメータに従ってSNIを入力します。Allow Insecureが表示される場合は、通常オフのままにしてください。追加のトランスポート設定もサーバー側と一致させます。
- 保存してHomeに戻り、追加した接続を選択して接続スイッチをオンにします。初回にシステムのVPN構成許可が表示されたら、アプリ名を確認して許可します。
- Global Routingを確認してから、この接続を通す必要がある宛先にアクセスし、結果とエラーメッセージを記録します。
既存のサブスクリプションからインポートした場合は、インポート後にType、Address、Port、TLSパラメータがすべて設定されているか確認します。サブスクリプションの更新で、管理対象の項目が再度書き込まれることがあります。一時的な切り分けの前に変更内容を記録し、「端末上で手動変更した値」と「サブスクリプションから返された値」を区別してください。サブスクリプション項目の変更を、配信元の誤設定を恒久的に直す方法として使わないでください。
項目とエラーの症状:遅延ではなく、失敗した段階から確認
接続テストの結果は、テスト対象と方法における状態を示すにすぎません。遅延時間が表示されても、すべての宛先にアクセスできることや、認証・DNS・ルールが正しいことの証明にはなりません。トラブルの切り分けでは、まず失敗した段階を記録し、対応する項目を確認してください。以下はよくある手がかりであり、エラーと原因が必ず一対一で対応するわけではありません。
| 項目または段階 | よくある症状 | 優先して確認する項目 |
|---|---|---|
| Address | ホスト名を解決できず、接続が確立しない | ドメイン名の入力ミス、現在のネットワークのDNS、URLのパスが誤って含まれていないか |
| Port / TCP | 接続がタイムアウトする、または拒否される | 実際の待ち受けポート、ネットワークの到達性、サーバーが接続を受け付けているか |
| SNI / TLS | 証明書名が一致しない、またはTLSハンドシェイクに失敗する | SNI、証明書に記載された名前、サーバー側のTLS設定、端末の日時 |
| Password | 接続後にリクエストが失敗する、またはすぐ切断される | Passwordの大文字・小文字、空白文字、サーバー側の認証記録 |
| ルールと宛先 | 一部のWebサイトは使えるが、特定の宛先にアクセスできない | Global Routing、適用されるポリシー、宛先のDNS、接続先自体の状態 |
まとめ:証明書エラーではまずSNIを確認し、検証を無効にして解決しようとしない
証明書名が一致しない場合は、SNIとサーバーから指定された証明書のドメイン名を一文字ずつ照合します。有効期間のエラーが出る場合は、端末の日付と証明書の状態を確認してください。Allow Insecureをオンにして長期的に対処するのは避けてください。
証明書検証をスキップすると、サーバーの身元確認が弱まります。誤ったポートやパスワード、到達できないサーバーの問題は解決しません。検証をオフにして症状が変わっても、TLSの身元確認が切り分けの対象かもしれないと分かるだけで、接続の安全性が確認できたことにはなりません。カスタムの信頼情報が必要な環境では、サービス管理者から確認可能な設定説明を入手してください。
接続後もアクセスできない場合:Global RoutingとTrojanのパラメータを切り分ける
Trojanのパラメータは選択したサーバーへの接続方法を決め、Global Routingはリクエストのルーティング方法を決めます。Proxy、Direct、Config、Sceneは4種類のプロトコルではありません。Proxyはプロキシ経由、Directは直接接続、Configは設定ファイルのルールに基づくポリシー、Sceneは設定したシーンに応じた処理を意味します。個別の接続を調べる際は、まず現在のルーティング方法を確認してからアクセス結果を判断してください。
- プロキシ経由の通信を一時的に確認するには、HomeでGlobal RoutingをProxyに設定し、テスト対象のTrojan接続が選択されていることを確認します。テスト後は元の設定に戻してください。
- ProxyではアクセスできるのにConfigでは失敗する場合は、現在有効なConfigと適用されたポリシーを確認します。すぐにPasswordを再入力しないでください。
- ルールは上から順に照合され、最初に一致したルールのポリシーが適用されます。
DIRECTは選択中のTrojan接続を経由せず、REJECTはリクエストを拒否します。 FINALは、それ以前のルールに一致しなかったリクエストを処理するため、通常はルールの末尾に置きます。特定のドメインに対する例外は、より広い範囲を対象とするルールより前に記述します。
以下はルールの順序だけを示す例です。ドメイン名は説明用の仮の値であり、利用可能なサービスではありません。1つ目のルールでは、より具体的なドメインを直接接続にし、2つ目ではそのドメインのサブドメインに対する他のリクエストをPROXY経由にします。最後にFINALで、それまで一致しなかったリクエストを処理します。適用前に、現在の設定でPROXYが想定したプロキシ選択に対応していることも確認してください。
DOMAIN,local.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
FINAL,PROXY
Settings → On Demandは、条件に応じて接続を開始するための設定です。TrojanのAddress、SNI、Passwordを修正するものではありません。手動接続がまだ成功していない場合は、手動で制御できるテスト手順を維持してください。基本の接続が正常になってから、On Demandの条件が想定どおりか確認します。VPNの自動接続と、宛先にPROXYが適用されることは別々の判定です。
Trojanの設定に関するよくある質問
AddressがIPアドレスの場合、SNIは空欄でもいいですか?
まず、入手済みのパラメータを確認してください。サーバーがTLSサービスの選択にドメイン名を使う場合や、ドメイン名の証明書を使用する場合は、指定されたSNIを入力します。IPアドレスしか分からず、TLSの識別情報が不足している場合は、ドメイン名を片っ端から試さず、サービス管理者に確認してください。
Portには必ず443を入力しますか?
いいえ。443はよく使われるポートですが、実際の値はサーバーの待ち受けポートと一致させます。指定されたポートが8443なら、Portに8443と入力し、Addressにポート番号を重ねて付けていないことを確認してください。
Passwordは事前にエンコードや変換が必要ですか?
手動で入力する場合は元のPasswordを使い、独自にハッシュを計算しないでください。共有リンク内のエスケープされた文字列を、そのままPasswordとして使うのも避けてください。リンクをインポートした後に認証に失敗する場合は、解析されたPasswordを元のパラメータと照合し、特に特殊文字や余分な空白を確認します。
サブスクリプション更新後に接続できなくなった場合、最初に何を確認しますか?
まずHomeで対象項目の編集画面を開き、Type、Address、Port、SNIが更新されていないか確認します。現在選択されている項目が変わっていないことも確認してください。サブスクリプションの配信元が誤った値を返し続ける場合は、配信元のパラメータを修正する必要があります。サブスクリプションを更新しただけでは、接続可能であることは確認できません。
TLSエラーのスクリーンショットを、そのまま他の人に送ってもいいですか?
個人情報を隠したエラーメッセージ、失敗した段階、発生条件を共有することはできます。ただし、Password、サブスクリプションURL全体、共有リンクに含まれる認証情報は隠してください。通常の切り分けでは、Port、SNI、証明書名が一致しているかを伝えれば十分で、接続情報全体を公開する必要はありません。
設定後は、正しい項目が選択されていること、Global Routing、宛先へのアクセスを順に確認し、最後に通常使うルールと自動接続条件に戻します。プロトコルやルールについて詳しく調べる場合は、技術リファレンスをご覧ください。特定のネットワークでだけ失敗する場合は、Wi-Fiとモバイル通信での違いを記録し、ネットワークの到達性の問題をPasswordの誤りと取り違えないようにしてください。