V2Rayのシステムプロキシが効かない原因と対処法|ブラウザーは接続できるのにターミナルで使えない場合

ブラウザーは拡張機能やプロキシ設定による上書きを確認し、ターミナルには http_proxy を設定。コマンドで順に動作を確かめます。

この記事の概要

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用コマンドを使ってください。

127.0.0.1
同じコンピューター内のループバックアドレス
10808
この記事で使用する混合ポート
10秒
例で指定する接続タイムアウト
  1. コアの起動を確認する

    メイン画面で使用するサーバーを選び、ログに起動失敗やポート競合のメッセージがないか確認します。サブスクリプションの更新はサーバー情報を更新するだけで、接続が確立したことを意味しません。

  2. ローカルポートを確認する

    「設定」→「パラメータ設定」を開き、実際の待ち受けポートと対応する接続方式を記録します。変更を保存したら、コアが設定を再読み込みしたことを確認してください。

  3. ポートの待ち受けを確認する

    Windows PowerShellで次のコマンドを実行します。待ち受け状態が表示されない場合は、ブラウザーの設定を変更する前にコアの起動問題を解決してください。

  4. プロキシを明示して指定する

    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をテスト対象に決め、現在のプロキシ設定元を記録してから、設定を一つずつ変更してください。複数箇所を同時に変えると比較できなくなります。

自動構成スクリプトは、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

ここで指定する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

クライアントとプラットフォームの選択

デバイスのOSに合ったクライアントを選び、デスクトップではv2rayNを使用します。インストール後、実際の待ち受けポートを確認してから、この記事の手順でブラウザーとターミナルを個別にテストしてください。初期設定は使い方ガイドから始められます。

v2rayN をダウンロードOSに合ったクライアントを選択