v2rayNでサーバーを選択済みなのに、「ブラウザーは使えるがターミナルはタイムアウトする」、またはその逆でお困りの方向けです。まずプロキシを明示したコマンドでローカルの接続口を確認し、ブラウザーのプロキシ設定とターミナルの環境変数を個別に調べます。最後にルーティングとログから原因を特定します。例ではローカルの混合ポート10808を使用しています。実行前に、クライアントに表示されている実際のポートへ置き換えてください。
1. システムプロキシは設定を提供するだけで、すべての通信を制御するわけではない
v2rayNの「システムプロキシを設定」は、ローカルプロキシのアドレスをOSの関連設定に書き込みます。その設定を読み取るかどうかはアプリによって異なります。ブラウザーは通常システムプロキシを参照しますが、多くのコマンドラインツールは環境変数や独自の設定ファイルを参照します。そのため、ブラウザーで同じURLにアクセスできても、ターミナルの通信がプロキシを経由しているとは限りません。
この経路には、アプリがプロキシを使うか、ローカルポートがリクエストを受け付けるか、コアが最終的にどのアウトバウンドを選ぶかという、独立した3つの段階があります。V2RayまたはXrayがコアの処理を担い、v2rayNがデスクトップ上の設定と管理を担います。VMessやVLESSなどはサーバーへの接続プロトコルであり、ブラウザーのプロキシ種別として指定するものではありません。
| 接続口 | 主な利用アプリ | 確認ポイント |
|---|---|---|
| システムプロキシ | システム設定を参照するアプリ | 手動プロキシ、自動構成スクリプト、バイパスリスト |
| 環境変数 | curlなどのコマンドラインツール | 変数名、プロトコルの接頭辞、現在のプロセスへの継承 |
| アプリごとの設定 | ブラウザー拡張機能、開発ツール | システム設定や環境変数を上書きしていないか |
| TUNモード | 仮想ネットワークアダプターとルーティングで処理される通信 | システムルート、DNS、除外ルール |
この記事では、まずアプリのプロキシ設定を切り分けます。最初の対処としてTUNを有効にすることはしません。すでにTUNが有効な場合、直結テストの通信もTUNに取り込まれることがあります。接続経路を区別するには、元の設定を記録したうえで一時的にTUNを無効にし、結果を比較してください。
2. v2rayNの待ち受けポートを確認してから、プロキシを明示してテストする
まずv2rayNのメイン画面でローカルポートを確認し、「設定」→「パラメータ設定」でローカルの待ち受け設定を照合します。項目名や初期値はバージョンによって異なるため、古い解説を見てHTTPポートが必ず10809だと決めつけないでください。以下では、127.0.0.1:10808をHTTPに対応した混合接続口として扱います。実際の接続口がSOCKS専用の場合は、後述のSOCKS用コマンドを使ってください。
-
コアの起動を確認する
メイン画面で使用するサーバーを選び、ログに起動失敗やポート競合のメッセージがないか確認します。サブスクリプションの更新はサーバー情報を更新するだけで、接続が確立したことを意味しません。
-
ローカルポートを確認する
「設定」→「パラメータ設定」を開き、実際の待ち受けポートと対応する接続方式を記録します。変更を保存したら、コアが設定を再読み込みしたことを確認してください。
-
ポートの待ち受けを確認する
Windows PowerShellで次のコマンドを実行します。待ち受け状態が表示されない場合は、ブラウザーの設定を変更する前にコアの起動問題を解決してください。
-
プロキシを明示して指定する
curlの
--proxyオプションで接続口を直接指定します。これにより、ツールがどのプロキシ設定を読み取るかという不確定要素を除外できます。
# Windows PowerShell
Get-NetTCPConnection -State Listen -LocalPort 10808
curl.exe -v --connect-timeout 10 --max-time 25 --proxy http://127.0.0.1:10808 --noproxy "localhost,127.0.0.1" https://example.com/ -o NUL
Windowsではcurl.exeを使い、古いWindows PowerShellでcurlが別のコマンドとして解釈されるのを防ぎます。LinuxとmacOSではcurlを使い、出力先のNULを/dev/nullに置き換えてください。例のバイパスリストにはローカルアドレスのみを指定しています。既存のNO_PROXY設定によって接続先URLがプロキシを迂回しないようにするためです。
結論:プロキシを明示した接続が成功したら、アプリの設定を見直す
ログでcurlがローカルの10808ポートに接続し、接続先サイトから応答を得ている場合は、ターミナルの環境変数かブラウザーの上書き設定を優先して確認します。ローカルポートへの接続自体に失敗する場合は、待ち受けアドレスやポート、コアの起動状態を先に修正してください。Webページのステータスコードだけでは、最終的にリモートサーバー経由で接続したか判断できません。コアのルーティングログも確認しましょう。
3. ブラウザー側の確認:拡張機能、手動プロキシ、自動構成
ブラウザーでは接続できるのにターミナルで失敗する場合、ブラウザーだけでプロキシが設定されている可能性があります。逆に、明示的なcurl接続は成功するのにブラウザーで失敗する場合は、拡張機能が古いポートを参照していることもあります。まず同じURLをテスト対象に決め、現在のプロキシ設定元を記録してから、設定を一つずつ変更してください。複数箇所を同時に変えると比較できなくなります。
- v2rayN:トレイメニューの「システムプロキシ」から「システムプロキシを自動設定」を選び、OSに実際に設定されたアドレスとポートを確認します。自動構成スクリプトを使う場合は、そのスクリプトのルールも確認してください。
- Windows:「設定」→「ネットワークとインターネット」→「プロキシ」を開き、「セットアップスクリプトを使う」と「プロキシサーバーを使う」を確認します。ほかのネットワークツールに設定を繰り返し上書きされないよう、変更前の設定を記録してください。
- Chrome:「設定」→「システム」→「パソコンのプロキシ設定を開く」でシステム側の接続先を確認します。次に「拡張機能」→「拡張機能を管理」を開き、プロキシ切り替え系の拡張機能を一時的に無効にしてください。
- Firefox:「設定」→「一般」→「ネットワーク設定」→「接続設定」を開き、「システムのプロキシ設定を使用する」と「手動でプロキシを設定する」のどちらが選ばれているか確認します。手動設定の古いポートは、システム設定を変更しても自動では更新されません。
自動構成スクリプトは、URLに応じてプロキシ経由か直結かを切り替えます。システムのバイパスリストが特定のドメインを除外する場合もあります。「特定のサイトだけプロキシを使えない」ときは、サーバーを変更する前に、そのURLがルールに該当しないか確認してください。ブラウザーのセキュアDNS設定は一部のドメインの名前解決に影響しますが、プロキシの有効・無効とは別の設定です。
4. ターミナル側の確認:http_proxyとhttps_proxyを設定する
システムプロキシを有効にしても、コマンドラインツールが自動的にローカル接続口を使うとは限りません。まず現在のターミナルで環境変数を一時設定し、動作を確認してからユーザー設定への保存を検討してください。以下のアドレスはHTTPプロキシ、またはHTTP対応の混合接続口向けです。接続先がHTTPSでも、プロキシアドレスの接頭辞はhttp://で構いません。
Windows PowerShell:現在のセッションだけに設定
$env:http_proxy = "http://127.0.0.1:10808"
$env:https_proxy = "http://127.0.0.1:10808"
$env:no_proxy = "localhost,127.0.0.1"
Get-ChildItem Env: | Where-Object Name -Match 'proxy'
curl.exe -v --connect-timeout 10 --max-time 25 https://example.com/ -o NUL
$env:で設定した変数は、現在のPowerShellと、そこから起動した子プロセスに適用されます。別のターミナルをすでに開いている場合、そちらには反映されません。開発ツールに変数を引き継がせるには、このセッションからツールを起動するか、環境変数を永続設定に変更した後でツールを再起動してください。
Linux・macOS:現在のシェルに変数をエクスポート
export http_proxy='http://127.0.0.1:10808'
export https_proxy='http://127.0.0.1:10808'
export no_proxy='localhost,127.0.0.1'
env | grep -i proxy
curl -v --connect-timeout 10 --max-time 25 https://example.com/ -o /dev/null
https_proxyはHTTPSの接続先に使うプロキシを指定する変数であり、プロキシの接続口がTLSに対応している必要があるという意味ではありません。通常のHTTP接続口をhttps://127.0.0.1:10808と指定すると、ハンドシェイクエラーが発生することがあります。- curlでHTTPプロキシの環境変数を指定するときは、小文字の
http_proxyを使います。大文字のHTTP_PROXYだけを設定しないでください。大文字・小文字を区別する環境では、値が異なる重複設定も削除してください。 no_proxyまたはNO_PROXYに接続先が一致すると、プロキシは使われません。特に*が設定されていないか確認してください。すべての接続先が直結になる可能性があります。- GUIから起動したアプリ、管理者権限のプロセス、バックグラウンドサービスは、現在のシェルの環境変数を引き継がない場合があります。ツールによっては専用のプロキシ設定もあるため、各ツールの優先順位に沿って確認してください。
ここで指定する127.0.0.1は、v2rayNと同じネットワーク環境にある必要があります。コンテナ、リモートSSHセッション、一部の仮想化環境では、ループバックアドレスはそれぞれの環境自体を指し、デスクトップPCを指しません。その場合、このアドレスをそのまま流用しないでください。また、トラブル調査のためにプロキシポートをインターネットへ公開することも避けてください。
5. HTTP・SOCKS・DNSの問題を切り分ける
接続口がSOCKS5専用の場合、HTTPプロキシとして使うと接続リセットやプロトコルエラーが発生することがあります。まずローカルの接続方式を確認し、対応するコマンドを使ってください。以下のsocks5hは接続先のドメイン名をプロキシ側で解決します。通常のsocks5では、curlがローカルで接続先のドメイン名を解決することが一般的です。
# Windows:SOCKS5接続を使い、接続先のドメイン名をプロキシ側で解決
curl.exe -v --connect-timeout 10 --max-time 25 --proxy socks5h://127.0.0.1:10808 --noproxy "localhost,127.0.0.1" https://example.com/ -o NUL
# Linux / macOS
curl -v --connect-timeout 10 --max-time 25 --proxy socks5h://127.0.0.1:10808 --noproxy "localhost,127.0.0.1" https://example.com/ -o /dev/null
エラー:curl: (7) Failed to connect
原因:ローカルポートが待ち受けていない、アドレスが間違っている、またはリクエストが別のネットワーク環境から実行されている場合によく発生します。対処:まず待ち受け状態を確認し、コマンドのループバックアドレスがv2rayNを実行しているコンピューターを指していることを確かめてください。
エラー:curl: (5) Could not resolve proxy
原因:プロキシサーバーのアドレスを解決できないか、環境変数に設定したアドレスの書式が誤っています。対処:変数に余分な文字が含まれていないか確認し、ローカルでのテストにはhttp://127.0.0.1:10808を完全な形で指定してください。
エラー:curl: (6) Could not resolve host
原因:現在の名前解決経路で接続先ドメインを解決できていません。実際には直結しているか、SOCKSの名前解決がローカルで行われている可能性があります。対処:詳細出力でプロキシが使われているか確認し、socks5hでも比較テストを行って、コアのDNSログを確認してください。
エラー:curl: (60) SSL certificate problem
原因:TLS証明書の検証に失敗しています。システム時刻、信頼済み証明書、ネットワーク上での証明書の差し替えなどが原因として考えられます。対処:時刻を合わせて証明書チェーンを確認してください。証明書検証を恒久的に無効にすることを、プロキシの修復方法として使わないでください。
エラー行の末尾には、接続先のアドレスや詳しい原因が表示されることがあります。前後の情報も含めて記録してください。HTTPプロキシが200 Connection establishedを返した場合、確立したのはCONNECTトンネルだけです。その後のTLSハンドシェイクや接続先へのリクエストが成功したとは限りません。
6. リクエストがコアに届いたらルーティングとサーバーへのアウトバウンドを確認する
アプリがローカル接続口に接続しても、リクエストが必ずリモートサーバー経由になるとは限りません。v2rayNのルール設定により、一部のドメインやIPアドレスが直結する場合があります。ブラウザーとターミナルで異なるドメイン、アドレスファミリー、リダイレクト先にアクセスすると結果が変わることがあります。比較するときは完全なURLを統一してください。
| 確認できた結果 | 優先して確認する項目 | 次に行うこと |
|---|---|---|
| プロキシを明示すると成功するが、通常のcurlは失敗する | 環境変数とバイパスリスト | 現在のセッションの変数を表示し、no_proxyとアプリ設定を確認する |
| curlは成功するが、ブラウザーは失敗する | ブラウザー独自のプロキシ設定 | プロキシ拡張機能を無効にし、システム設定と手動ポートを確認する |
| 接続口には記録があるが、アウトバウンド接続がタイムアウトする | サーバーへの接続性と接続パラメーター | ノードのアドレス、ポート、トランスポート設定、リモートサービスの状態を確認する |
| リクエストが直結アウトバウンドにマッチする | ルーティングのマッチ結果 | ドメインまたはIPのルールと、ルールの優先順位を確認する |
| ローカルポートが待ち受けていない | コアの起動状態とポート競合 | 起動ログを確認し、設定または待ち受けポートの競合を修正する |
テスト中は一時的にログレベルを上げても構いませんが、高いレベルでの記録は必要な時間に限定してください。ログを共有する前に、サブスクリプションURL、ユーザー識別情報、アクセス先ドメインなどの機密情報を削除します。リモート側とのハンドシェイクや認証の失敗がログに明記されている場合は、VMessやVLESSなどのノード設定を確認してください。こうしたエラーと、ターミナルがシステムプロキシを参照するかどうかは別の問題です。
結論:接続口とアウトバウンドの両方を確認する
同じリクエストのcurl詳細出力とコアのログを残し、「どのローカルポートに接続したか」と「どのアウトバウンドにマッチしたか」をそれぞれ確認します。両方を特定してから、アプリ設定、DNS、ルーティング、サーバーのどこに問題があるか判断してください。出口IPの変化だけを根拠に設定を何度も変更するのは避けましょう。
7. テストが終わったら一時設定を元に戻す
環境変数を一時設定したままにすると、v2rayNを終了した後も、コマンドラインツールが停止済みのポートへ接続しようとすることがあります。今回新たに設定した変数は、以下の方法で削除できます。以前から社内プロキシや開発環境の設定を使っている場合は、変数をそのまま消すのではなく、記録しておいた元の値に戻してください。
# Windows PowerShell:現在のセッションから一時変数を削除
Remove-Item Env:http_proxy, Env:https_proxy, Env:no_proxy -ErrorAction SilentlyContinue
# Linux / macOS:現在のシェルから一時変数を削除
unset http_proxy https_proxy no_proxy
- 同じURLでブラウザーとターミナルを再テストし、想定どおり動作することを確認します。
- テスト前に停止した拡張機能、TUN、自動構成スクリプトを元に戻します。項目を一つ戻すたびに、問題が再発しないか確認してください。
- プロキシを継続して使う必要がある場合は、動作確認済みの設定を対応するユーザー環境またはアプリ設定に保存し、ポートも記録しておきましょう。
- ローカルの待ち受けポートを変更したら、環境変数とブラウザーの手動設定も更新し、古い設定が残らないようにしてください。
クライアントとプラットフォームの選択
デバイスのOSに合ったクライアントを選び、デスクトップではv2rayNを使用します。インストール後、実際の待ち受けポートを確認してから、この記事の手順でブラウザーとターミナルを個別にテストしてください。初期設定は使い方ガイドから始められます。