この記事では、v2rayNのウィンドウは開いているのに、Xrayの子プロセスが起動しない場合の対処法を解説します。まず起動ログをすべて保存し、実際に使われているコアで設定をテストした後、待ち受けポートとプログラムファイルを確認します。例ではWindows PowerShellを使用し、説明用のポート番号として10808を使います。実際に操作する際は、現在の設定にあるポート番号に置き換えてください。
1. 起動ログを確認する:コアの終了と接続エラーを見分ける
v2rayNは管理画面、Xrayは通信を処理するコアです。ウィンドウが開いても、コアがローカルポートで正常に待ち受けているとは限りません。一方、Webページがタイムアウトしても、コアの起動失敗とは限りません。リモートサーバーに接続できない、ルーティングが想定どおりでない、アプリがシステムプロキシを使用していないなどの問題は、コアが正常に動作した後にも起こります。
まずv2rayNのメイン画面にある情報欄やログ欄で、今回の起動記録を探します。画面のバージョンによって項目名は異なるため、現在の画面にあるログへの入口を確認してください。起動時刻、コア名、実行ファイルのパス、設定ファイルのパス、終了直前に最初に出たエラーを記録します。「起動に失敗しました」という最後の一文だけでは、原因が分からないことがほとんどです。
| 症状・ログの内容 | 優先して確認 | 後回しでよい項目 |
|---|---|---|
failed to load config files が表示される | 設定ファイルのパス、JSON構文、フィールド値 | リモートサーバーの速度測定結果 |
failed to listen TCP が表示される | 待ち受けアドレス、ポートの競合、システムの制限 | サブスクリプションの更新頻度 |
プロセスは動作中だが、リクエスト時に i/o timeout が表示される | リモート接続、DNS、ルーティング、トランスポート設定 | すべての問題を起動失敗として扱うこと |
| プログラムを実行できないというシステムメッセージ | アーキテクチャ、ファイルパス、アクセス権限 | 最初にノードのパスワードを変更すること |
2. 実際の設定をテストする:まずJSON、次にXrayのフィールドを確認
v2rayNの画面上の設定と、コアに渡される実行時設定は別のものです。起動ログで実際に使われている設定ファイルの場所を確認し、コピーを作ってトラブルシューティングに使います。自動生成された実行用ファイルを直接編集すると、ノードの切り替えや再起動で変更が上書きされる場合があります。原因を特定したら、カスタム設定、ルーティングルール、または該当する設定項目に戻って、元の設定を修正してください。
- 今回の起動操作を中止し、エラーログを保存して、関連する現在の設定をバックアップします。
- 起動パラメーターで指定されたファイルを探します。ファイル名から推測したり、サブスクリプションのテキストをコア用JSONと取り違えたりしないでください。
- v2rayNが実際に呼び出しているものと同じXray実行ファイルを使い、コピーした設定をテストします。
- 一度に変更するのは1項目だけにし、そのつどテストします。先のエラーが解消してから次のエラーに対処してください。
以下では、xray.exeとテスト用にコピーしたconfig.jsonがあるフォルダーに移動済みとします。このファイル名は例であり、v2rayNが必ずこのパスを使うわけではありません。1つ目のコマンドで実行ファイルのバージョンを確認し、2つ目のコマンドで設定だけをテストします。プロキシサービス全体は起動しません。
.\xray.exe version
.\xray.exe run -test -config ".\config.json"
$LASTEXITCODE
テストコマンドが正常終了しても、その段階の設定チェックを通過したことしか分かりません。ポートを必ずバインドできることや、リモートサーバーに接続できることを保証するものではありません。使用中のコアがコマンドのパラメーターを認識しない場合は、出所不明の実行ファイルを試すのではなく、そのプログラムのヘルプを確認して正しい起動方法を調べてください。
エラー:invalid character '}' looking for beginning of object key string
原因:オブジェクトの最後の項目の後に余分なカンマがあるなど、構文に問題があります。キー名が必要な箇所で、パーサーが右中括弧を読み込んでいます。
対処法:エラー位置の直前にある項目を確認し、末尾の余分なカンマを削除します。キー名が半角の二重引用符で囲まれていることも確認してください。
エラー:unexpected EOF
原因:読み込みが続くはずの位置で設定ファイルが終わっています。コピーが途中で切れている、閉じ中括弧がない、文字列の引用符が閉じていない場合によく発生します。
対処法:エディターで中括弧、角括弧、二重引用符の対応を確認します。まず完全なバックアップから復元してください。末尾に手当たり次第に括弧を追加しないでください。
エラー:json: cannot unmarshal string into Go value of type uint16
原因:数値が必要なフィールドに文字列が渡されています。エラーの詳細には、構造名やフィールドへのパスが含まれることもあります。
対処法:エラー全文から該当フィールドを特定し、使用中のコアが求める型に修正します。すべての数値について、引用符を一律に追加または削除しないでください。
構文が正しくても、意味上の誤りが残る場合があります。Xrayのフィールド名は大文字と小文字を区別します。outboundTagはoutboundtagとは異なります。また、ルーティングのフィールドで指定する出力タグは、実際に定義されているものと一致させる必要があります。不明なフィールドが無視され、起動エラーにならない場合もあるため、「構文エラーがない」だけでは、フィールド名が正しいとは判断できません。
{
"type": "field",
"domain": ["full:example.com"],
"outboundTag": "proxy"
}
3. ローカルポートの競合を確認する:待ち受けポートから使用プロセスを特定
設定テストに通っても、待ち受けソケットのバインド中に起動が終了する場合は、ポートを確認します。実行時設定のinboundsからlisten、port、プロトコルを探してください。TUNインターフェースと通常のローカルプロキシの待ち受けは別のものです。以下では、競合しているのがTCP 10808だと仮定します。この番号がすべての環境での標準値というわけではありません。
Get-NetTCPConnection -State Listen -LocalPort 10808 -ErrorAction SilentlyContinue |
Select-Object LocalAddress, LocalPort, OwningProcess
# 次の 1234 を直前の出力にある OwningProcess に置き換えてください
Get-Process -Id 1234 |
Select-Object Id, ProcessName, Path
プロセスのパスが空欄の場合は、タスクマネージャーでPIDを確認してください。必要に応じて、適切な権限のターミナルで詳細を確認します。プロセスの正体を確認する前に終了させないでください。ポートを使用しているのは、別のv2rayN、終了せずに残ったXrayプロセス、またはまったく別のローカルサービスかもしれません。
| 確認結果 | 説明 | 対処 |
|---|---|---|
| 10808を別のプロキシインスタンスが使用中 | 2つのインスタンスが同じアドレスとポートを要求している | 使用していないインスタンスを正常終了してから、現在のインスタンスを起動する |
| 同じ設定に重複したインバウンドがある | 2つの待ち受けが同じエンドポイントを使用している | 重複項目を削除するか、別のポートを割り当てる |
| 待ち受けの記録がないのに、アクセス権限エラーが表示される | ポートの予約範囲やセキュリティポリシーによる制限の可能性がある | システムの制限を確認し、プロセスの強制終了を繰り返さない |
待ち受けアドレスが0.0.0.0または:: | ワイルドカードアドレスでのバインドが、ほかの待ち受けと競合する場合がある | 具体的なアドレスとIPv4・IPv6それぞれの待ち受け記録も確認する |
エラー:Only one usage of each socket address (protocol/network address/port) is normally permitted.
原因:Windowsが、重複または競合するソケットのバインドを拒否しています。エラーの詳細には通常、待ち受けアドレスとポートも含まれます。
対処法:エラーに記載されたポート番号からPIDを調べ、競合しているインスタンスを終了します。インバウンドが重複している場合は、設定元を修正して設定を再生成してください。
エラー:An attempt was made to access a socket in a way forbidden by its access permissions.
原因:システムがバインド要求を拒否しています。予約ポート、排他的バインド、セキュリティポリシーなどが関係している可能性があり、通常のプロセスによるポート使用中とは異なります。
対処法:まずポートの予約範囲とセキュリティログを確認し、使用可能なポートを選びます。常に管理者権限で実行する方法を一般的な解決策と考えないでください。
netsh interface ipv4 show excludedportrange protocol=tcp
netsh interface ipv6 show excludedportrange protocol=tcp
ポートを変更する必要がある場合は、v2rayNの「設定」→「パラメーター設定」で、使用中のバージョンにあるローカル待ち受けポートの設定を探してください。画面上の分類名はバージョンによって異なる場合があるため、設定の出力内容も確認します。たとえばテストポートを10808から10818に変更する前に、10818が空いていて制限されていないことを確認してください。コアを再起動した後は、手動で設定したブラウザーのプロキシ、ターミナルのプロキシ環境変数、その他の接続元も同じポートに変更します。
確認:ポート変更後は接続元の設定も確認する
新しいポートで待ち受けが始まっても、アプリが古いポートに接続している場合は、接続元の設定が同期されていません。新たなコアの起動エラーではありません。まず実際の待ち受け先を確認し、次にシステムプロキシとターミナルの環境変数を確認します。2つの問題の間で設定を何度も変更しないようにしてください。
4. コアファイルを確認する:パス、アーキテクチャ、依存リソース
設定テストそのものを実行できない場合は、プログラムファイルを重点的に確認します。まずログに記載された完全なパスにファイルが存在するかを調べ、次にプログラムからバージョン情報を直接表示できるか確認してください。v2rayNの画面があるフォルダーとコアのフォルダーは、同じとは限りません。別のフォルダーから同名のプログラムを実行すると、別のXrayをテストしてしまうことがあります。
- パス:PowerShellでは、空白を含むフルパスを呼び出し演算子
&と組み合わせて実行します。設定ファイルのパスも引用符で囲んでください。 - アーキテクチャ:選択したインストーラーが、OSとプロセッサーに対応しているか確認します。プログラムを読み込めない場合は、まずアーキテクチャやシステムの互換性を確認してください。
- ファイルの状態:セキュリティソフトの隔離・ブロック履歴を確認し、実際にブロックされたファイルを特定します。セキュリティ保護全体を無効にしないでください。
- リソース:
geosite:またはgeoip:を使うルールには、対応するリソースファイルが必要です。リソースの不足とJSON構文エラーは分けて対処してください。
ログにfailed to open fileまたはThe system cannot find the file specified.と表示されたら、その後に続く具体的なファイル名を確認します。実行ファイル、設定ファイル、ルール用リソースのどれが見つからないのかによって、対処法は異なります。相対パスを使っている場合は、起動時の作業フォルダーとリソースの検索場所も確認してください。「どこかのフォルダーにファイルがある」ことだけでは不十分です。
5. 再テストの手順:設定テストの後、ローカルリクエストを確認
トラブルシューティングの最後には、画面の状態が変わっただけで終わらせず、再現可能な手順で一連の動作を確認します。ノード、ルーティング、プロキシモードはそのままにし、直前に修正した箇所だけをテストしてください。以下のリクエスト例は、10808がHTTPプロキシ、またはHTTPに対応した混合インバウンドとして待ち受けていることを確認済みの場合に限り使用できます。SOCKSのみのインバウンドでは、対応するプロキシプロトコルを指定してください。
# HTTPプロキシ、またはHTTPに対応した混合インバウンド
curl.exe --proxy http://127.0.0.1:10808 --connect-timeout 10 --max-time 20 https://example.com/
# SOCKSのみのインバウンド:宛先ドメインの名前解決をプロキシ側で行う
curl.exe --proxy socks5h://127.0.0.1:10808 --connect-timeout 10 --max-time 20 https://example.com/
- 設定:同じ実行時設定がコアのテストに通ることを確認し、修正後の設定元を保存します。
- 起動:コアがすぐに終了しないこと、起動ログに元のエラーが表示されなくなったことを確認します。
- 待ち受け:対象ポートを再確認し、今回起動したコアのプロセスがポートを使用していることを確かめます。
- リクエスト:指定したプロキシの接続先にリクエストを1回送信し、ログに記録された宛先とアウトバウンドを照合します。
例にある接続タイムアウト10秒、全体の制限時間20秒はテスト用の値であり、性能基準ではありません。ローカル接続が拒否された場合は待ち受け先を再確認してください。プロキシへの接続後にリモート側でタイムアウトする場合は、ノード、DNS、ルーティングを引き続き確認します。リクエストが1回成功しても、すべてのルーティングが想定どおりとは限りませんが、「コアが起動しない」問題と「特定の通信が失敗する」問題は切り分けられます。
6. よくある質問:サブスクリプション、設定テスト、再インストール
サブスクリプションを更新したら起動しなくなりました。まず削除すべきですか?
現在のグループとエラーログは残してください。同じグループの別の設定に切り替えてテストし、特定のノードだけで失敗するか比較します。次に、新しく追加されたトランスポートのフィールドと選択中のコアが対応しているか確認してください。グループ全体を削除すると比較に必要な情報が失われ、原因の特定にはなりません。
JSONチェッカーでは問題なしなのに、Xrayが終了するのはなぜですか?
一般的なJSONチェッカーが確認するのは主に構文で、コア固有のフィールドや実行時の依存関係をすべて理解しているわけではありません。実際に使うXrayで設定テストを行い、起動時にポートの競合やリソースの不足が原因で終了していないか確認してください。認証情報を含む設定をオンラインの検査サービスに送信しないでください。
修正した設定が再起動すると元に戻ります。どう保存すればよいですか?
一時的に生成されたファイルを編集した可能性があります。カスタム設定、ルーティングルール、または「設定」→「パラメーター設定」にある該当項目を探してください。設定元を修正してから起動し、新たに生成された設定に変更内容が反映されていることを確認します。
インストーラーを再ダウンロードすれば、ポートの競合は解決しますか?
それだけでは解決しません。まず10808など、実際に使われているポートのPIDを確認してください。ポートを使用中のプロセスが残っていれば、新しくインストールしたコアでもバインドに失敗する場合があります。ファイルの欠落、実行不能、アーキテクチャの不一致が確認できた場合に限り、設定をバックアップしてから対応するインストーラーを選び直してください。