1. ポートを確認し、システムプロキシとVPNによる通信制御を区別する

クライアントの「設定」を開き、「ポート」「インバウンド」「混合ポート」などの項目を探します。実際のポート番号を控え、コアが起動しているかも確認してください。メニュー名はクライアントによって異なるため、解説記事に記載されたポート番号をそのままシステムに設定しないでください。ここでは 127.0.0.1:7890 を例にします。HTTPポートまたは混合ポートが実際に7890の場合に限り、そのまま実行できます。

システムプロキシは、設定を参照するアプリにプロキシアドレスを渡すもので、すべての通信を強制的に中継するスイッチではありません。ブラウザは通常この設定を参照しますが、コマンドラインツールの動作はそれぞれ異なります。「ターミナルは環境変数を使う」というのは、よくある確認方法を指しています。厳密には、リクエストを送信するのはcurlやGit、パッケージマネージャーなどのプログラムで、コマンドライン引数や個別の設定ファイルを参照する場合もあります。

設定項目役割よくある誤解
システムHTTPプロキシシステム設定に従うアプリにプロキシアドレスを提供する有効にすればすべてのアプリがプロキシを使う
HTTP/混合ポートアプリからのプロキシリクエストを受け付ける。混合ポートはHTTPとSOCKSに対応SOCKS専用ポートをHTTPプロキシ欄に設定する
TUNモード仮想ネットワークインターフェースとルーティングで、条件に合う通信を取り込む有効にすればルーティング、DNS、ルールの確認は不要
Android VPNサービスAndroidのVpnServiceを使って端末の通信を受け取るデスクトップのシステムプロキシスイッチと同じものとして扱う

2. プロキシを明示したリクエストで、問題の発生箇所を切り分ける

ノードを何度も切り替える前に、ターミナルでcurlのプロキシ指定オプションを使い、「アプリがシステムプロキシを参照しているか」という条件を切り離して確認します。以下のURLはテスト用であり、速度測定用のノードではありません。リクエストがクライアントに届くか、どの段階で失敗するかを確認してください。

macOS/Linux

curl -v --connect-timeout 10 --max-time 20 \
  --noproxy "" \
  --proxy http://127.0.0.1:7890 \
  https://example.com/

Windows PowerShell

curl.exe -v --connect-timeout 10 --max-time 20 --noproxy "" --proxy http://127.0.0.1:7890 https://example.com/

Windowsでは curl.exe を使い、Windows PowerShell 5.1の curl エイリアスが別のコマンドを呼び出すのを避けます。接続タイムアウトは10秒、全体の制限時間は20秒です。テストがいつまでも待ち続けないための設定であり、ノードの性能基準ではありません。--noproxy "" は、今回のリクエストでバイパスリストを空にします。

  • ローカル接続が拒否される:まずコアが起動しているか、ポート番号が正しいか、そのポートが別のプロキシプロトコル専用ではないかを確認してください。
  • HTTP 407が返る:ローカルプロキシで認証が必要です。実際の設定に応じて認証情報を指定してください。パスワードを公開ログに貼り付けないでください。
  • CONNECTの成功応答がある:HTTPプロキシがトンネルリクエストを受け付けたことを示します。ただし、その後のTLSハンドシェイクや接続先からの応答が失敗する可能性はあります。
  • 接続先サイトから応答がある:この宛先へのリクエストではローカルプロキシ経由で通信できています。ただし、すべてのノード、ドメイン、ルールが正常だとは限りません。

同時にクライアントの「接続」または「ログ」画面を開き、リクエストのドメイン、適用ルール、プロキシグループ、最終的な送信先を確認します。リクエストに DIRECT と表示される場合、通信はすでにコアに届いていて、ルールによって直接接続に振り分けられている可能性があります。これは「システムプロキシが機能していない」状態とは異なります。

3. ブラウザで開けない場合:システム設定、拡張機能、個別設定を確認

Chrome/Edge:システムプロキシを確認し、プロキシ拡張機能を無効にする

  1. Windows 11では「設定」→「ネットワークとインターネット」→「プロキシ」を開き、「手動プロキシ セットアップ」のアドレスとポートを確認します。クライアントが自動構成スクリプトを管理している場合は、スクリプトの参照先も確認してください。
  2. macOSでは「システム設定」→「ネットワーク」→接続中のネットワーク→「詳細」→「プロキシ」の順に開きます。Webプロキシ、安全なWebプロキシ、自動プロキシ構成が、クライアントの設定方法と一致しているか確認してください。
  3. Chromeでは「設定」→「システム」からパソコンのプロキシ設定を開きます。Edgeでは通常、「システムとパフォーマンス」に同様の項目があります。前述のOS側の設定画面から開くこともできます。
  4. 拡張機能の管理画面を開き、プロキシ設定を変更できる拡張機能をすべて一時的に無効にして、同じテストURLにアクセスします。元の拡張機能の設定を控えておき、テスト後に必要に応じて戻してください。

プロキシ拡張機能が別のポートを固定で使っていたり、PACによって一部のドメインを直接接続にしたりする場合があります。PACとは、URLに応じて接続先のプロキシを選ぶ自動構成スクリプトです。ブラウザに「組織によって管理されています」と表示される場合は、ブラウザのポリシーを確認するか管理者に問い合わせてください。クライアントのスイッチを何度も切り替えて、組織の設定を上書きしようとしないでください。

Firefox:プロキシの設定元を明確にする

「設定」→「一般」→「ネットワーク設定」→「設定」を開きます。OSの設定に従う場合は「システムのプロキシ設定を使用する」を選択します。個別にテストする場合は「手動でプロキシを設定する」を選び、実際のHTTPプロキシのアドレスとポートを入力して、HTTPSにも同じプロキシを使う設定か確認してください。「プロキシーを使用しない」を選びながら、システムプロキシだけを変更することのないようにしてください。

SOCKS v5を使う場合は、プロキシ欄とポートがSOCKSまたは混合インバウンドに対応している必要があります。ドメイン名の解決をプロキシ側で行うには、FirefoxのSOCKS v5向けDNSプロキシ設定を確認してください。セキュアDNS、キャッシュ、プロキシの種類によって名前解決の経路は変わります。ブラウザでセキュアDNSが有効だからといって、ClashのDNSが必ず機能していないとは限りません。

4. ターミナルでプロキシを使わない場合:実際に通信するプログラムに環境変数を設定

プロキシを明示したテストは成功するのに、通常のターミナルでのリクエストが失敗する場合は、プログラムがプロキシ設定を参照しているか確認してください。環境変数は現在のプロセスと、そこから起動する子プロセスにのみ引き継がれます。あるウィンドウで設定しても、すでに開いている別のウィンドウには反映されません。まずはセッション内でテストし、すぐに起動ファイルへ書き込まないようにしましょう。

Bash/Zsh:まずHTTPプロキシの環境変数を設定

export http_proxy="http://127.0.0.1:7890"
export https_proxy="http://127.0.0.1:7890"
export no_proxy="localhost,127.0.0.1,::1"

curl -v --connect-timeout 10 --max-time 20 https://example.com/

https_proxy の値に http:// を使うのは間違いではありません。ここで示すのはローカルプロキシへの接続プロトコルであり、HTTPSの接続先には通常HTTP CONNECTトンネルを使います。接続先がHTTPSだからといって、ローカルプロキシのアドレスを https://127.0.0.1:7890 に変更しないでください。

HTTPプロキシの場合、curlは小文字の http_proxy を使います。他のツールでは大文字・小文字の扱いが異なることがあります。no_proxy はプロキシを経由しない接続先のリストです。テスト対象のドメインが含まれていると、プログラムが直接接続する場合があります。確認時は大文字・小文字の環境変数が競合していないか注意し、認証情報を含む変数を公開しないでください。

PowerShell:変数は現在のセッションでのみ有効

$env:http_proxy = "http://127.0.0.1:7890"
$env:https_proxy = "http://127.0.0.1:7890"
$env:no_proxy = "localhost,127.0.0.1,::1"

curl.exe -v --connect-timeout 10 --max-time 20 https://example.com/

PowerShellのコマンドやアプリが、すべてcurlと同じように環境変数を参照するわけではありません。curlでは成功して別のツールで失敗する場合は、そのツールのプロキシ設定のドキュメントを確認してください。それだけでシステム全体のネットワーク設定を変更する必要はありません。sudo を使うと環境変数が引き継がれない場合もあるため、権限昇格後のプログラムが実際にどの設定を受け取っているか確認してください。

SOCKSとアプリごとの設定

ローカルでSOCKSまたは混合インバウンドを実際に公開している場合は、以下のように単発のリクエストを実行し、名前解決経路を比較できます。socks5h はドメイン名の解決をプロキシ側に任せる指定です。通常の socks5 では、多くの場合まずローカルで名前解決します。ここでも7890は実際のポート番号に置き換えてください。

curl -v --noproxy "" --proxy socks5h://127.0.0.1:7890 \
  --connect-timeout 10 --max-time 20 https://example.com/

ALL_PROXY は一部のツールで共通プロキシ用の環境変数として使えますが、対応状況や優先順位はシステム全体で統一されていません。Gitには http.proxy、npmには個別のプロキシ設定がある場合もあります。設定元を先に確認し、環境変数と古い設定が重複しないようにしてください。

git config --show-origin --get-regexp '.*proxy.*'
npm config get proxy
npm config get https-proxy

5. TUNモードに切り替えるタイミング

システムプロキシを参照しない複数のアプリの通信を取り込みたい場合や、アプリにプロキシ設定がない場合は、TUNモードを検討できます。TUNは仮想ネットワークインターフェースで、mihomoなどのコアがIP通信を受け取るために利用します。解決できるのは通信の取り込み口の問題であり、無効なサブスクリプション、誤ったノード、証明書の問題、不適切なルールまで自動で直るわけではありません。

  1. まずHTTPまたはSOCKSプロキシを明示したリクエストでノードへの経路が使えることを確認し、その後クライアントの「TUNモード」または「仮想ネットワークインターフェース」を有効にします。
  2. クライアントの案内に従ってシステムサービスをインストールまたは起動し、必要な権限を付与します。Windows、macOS、Linuxでは権限の仕組みが異なるため、別のOSの手順を流用しないでください。
  3. デフォルトルートの競合を避けるため、テスト中は他のVPNや仮想ネットワークの制御ツールを一時的に停止してください。会社管理の端末では、まず組織のルールに従ってください。
  4. 明示的なプロキシ設定とTUNが同時に動作して原因の特定が難しくならないよう、テスト中はブラウザの手動プロキシ設定とターミナルのプロキシ環境変数を解除してください。
  5. リクエストを再実行し、クライアントの接続ログと適用ルールを確認します。あわせて、ローカルネットワーク、プリンター、社内ネットワークに引き続き接続できるかも確認してください。

Androidでは通常、VPNサービスを通じてこのような通信制御を行います。デスクトップ向けの仮想ネットワークドライバーのインストール手順をそのまま適用しないでください。アプリ別プロキシで対象アプリが除外されていないか確認しましょう。同じAndroidユーザーや仕事用プロファイルで使っている別のVPNが、接続に影響することもあります。

6. テスト結果を確認し、再現できる設定を残す

テスト結果まず確認する項目次の手順
プロキシを明示してもローカルポートに接続できないコア、リッスンアドレス、ポート、インバウンドプロトコルまずローカル接続を直し、サブスクリプションの更新は後にする
プロキシを明示すると成功するが、ブラウザでは失敗するシステムプロキシ、プロキシ拡張機能、Firefoxの個別設定プロキシの設定元を一つに絞って再試行する
ブラウザでは成功するが、ターミナルでは失敗する環境変数、プログラムの設定、コンテナのネットワーク実際にリクエストを送るプログラムに個別設定する
リクエストはコアに届くがDIRECTになるルール、モード、プロキシグループ対象ドメインに適用されたルールを確認する
TUN使用後も一部のアプリで失敗するルーティング、DNS、アプリの除外設定、UDP対応対象アプリから実際にリクエストを送り、ログを確認する

調査が終わったら一時的な環境変数を削除してください。テスト前からプロキシ設定があった場合は、削除せず元の値に戻します。以下のコマンドは、テスト前にこれらの環境変数が設定されていなかった場合に使えます。永続設定は、シェルの起動ファイルまたはシステムの環境変数設定画面で別途変更してください。

# Bash / Zsh:今回のセッションで設定した一時プロキシを解除
unset http_proxy https_proxy all_proxy no_proxy
unset HTTP_PROXY HTTPS_PROXY ALL_PROXY NO_PROXY
# PowerShell:今回のセッションで設定した一時プロキシを解除
Remove-Item Env:http_proxy, Env:https_proxy, Env:all_proxy, Env:no_proxy -ErrorAction SilentlyContinue

最後に、実際のインバウンドポート、ブラウザのプロキシ設定元、ターミナルのプログラムのプロキシ設定、リクエストの送信先の4点を記録してください。この4点がわかれば、「システムプロキシを有効にしているのに効かない」とき、ブラウザ、ターミナル、ノードの問題を混同せず、該当する層から調査を再開できます。ログを外部に共有する前に、サブスクリプションURL、認証情報、個人のアクセス履歴を隠してください。