こんなときに読む記事です
Clash(mihomo 系クライアント含む)は起動しており、ブラウザでは海外サイトも開ける。それでも PowerShell や Windows Terminal から実行した Git の git pull や npm のレジストリ取得だけが遅い、あるいはすぐにタイムアウトする——という相談は、開発者向けコミュニティでも非常に多いパターンです。
原因の多くは「プロキシが無い」のではなく、参照している入口が違う ことにあります。Windows の「プロキシ設定」やクライアントの「システムプロキシを有効化」は、主に WinHTTP/ブラウザ系のスタックに効きます。一方、今どきの Git や Node.js ツールチェーンは、起動したシェルの 環境変数(HTTP_PROXY など)や、ツール独自の設定ファイルを見に行きます。ここが空欄のままだと、画面上はプロキシオンでも ターミナルだけ直結 に見えてしまいます。
本稿では TUN モードを新たに開かない 前提で、既存の「ポートリスニング」型 Clash に対して、混合ポート(mixed port) と環境変数を軸にルートを通す手順を整理します。GUI の名称は Clash Verge Rev などで多少異なりますが、考え方は共通です。インストールの流れは Clash Verge Rev の Windows ガイド を参照してください。
システムプロキシと「ターミナルの環境変数」は別レイヤー
まず押さえたいのは、システムプロキシ と シェル環境変数 が同じ値を指す保証がない、という点です。クライアントが「システムプロキシを設定」してくれても、すでに開いていた PowerShell セッションには自動で変数が流れ込まないことがほとんどです。新しいウィンドウを開き直したり、明示的に $env:HTTP_PROXY をセットしたりしない限り、Git/npm は依然としてプロキシ無しの経路を選びます。
また、企業端末ではグループポリシーにより OS 側のプロキシが固定されている一方、開発用の Clash はローカルの 127.0.0.1 を指している——といった 二重構造 も珍しくありません。この場合、ブラウザはポリシー通りの社内プロキシへ向かい、ターミナルだけ別挙動になる、という切り分けが必要になります。
「ブラウザは通るが CLI だけダメ」なら、まず疑うべきは TUN ではなく 環境変数とツール個別設定 です。TUN 周りの切り分けは TUN トラブルシューティング記事 にまとめていますが、本稿の方針とは独立したオプションです。
混合ポート・HTTP 専用・SOCKS の違いと番号の確認
Clash 系では、だいたい次のようなポートが並びます。HTTP プロキシ専用、SOCKS5、そして両方を同一ポートで受ける 混合(mixed) です。環境変数で http:// スキームを使う場合、実体としては HTTP CONNECT を投げるツールが多く、ここに SOCKS 番号を書き間違えると黙って失敗したり、別のエラー文言になったりします。
実務的には、まずクライアントの設定画面か生成 YAML で mixed-port の値(例:7890)を確認し、それを HTTP/HTTPS 両方の出図口 として使うのがわかりやすいです。もし mixed が無効で HTTP と SOCKS が別ポートなら、Git や npm は原則 HTTP 側の番号 を http://127.0.0.1:ポート 形式で渡します。SOCKS を直接使わせたい場合は socks5://127.0.0.1:... ですが、TLS を挟むツールによっては挙動差が出るため、混合ポート一本に寄せるほうがトラブルが少ないです。
LAN 越しに別端末から同じ PC の Clash を使う話は LAN 共有とファイアウォールの記事 の領域です。本稿はあくまで 同一マシン上のローカル待受 を前提にします。
PowerShell での一時設定と永続化の注意点
検証では、まず現在のセッションだけに効く形で変数を入れるのが安全です。例として混合ポートが 7890 の場合、HTTP/HTTPS を次のように揃えます。ループバックで十分なので、ホストは 127.0.0.1 を明示します。
$env:HTTP_PROXY = "http://127.0.0.1:7890"
$env:HTTPS_PROXY = "http://127.0.0.1:7890"
$env:ALL_PROXY = "http://127.0.0.1:7890"
ALL_PROXY はライブラリによって解釈が分かれるため、必須ではありませんが、Go 製 CLI などでは効くことが多いです。設定後に git ls-remote https://github.com/... や npm ping など、軽いコマンドで到達性を確かめてください。
永続化する場合は「ユーザー環境変数」か、PowerShell プロファイルへの追記かを選びます。前者は OS 全体に広がるため、プロキシを常に挟みたくない 場面では NO_PROXY の整備が必須です。社内 Git や社内 npm ミラー、ローカルホスト系を除外しないと、逆に社内リソースが届かなくなるからです。
$env:NO_PROXY = "localhost,127.0.0.1,::1,.local,.yourcompany.internal"
Git 側の http/https プロキシ設定
環境変数だけでも多くの Git 操作は通りますが、HTTPS クローンで認証プロキシの挙動が不安定な場合は、Git 自身にプロキシを持たせる方法もあります。グローバル設定の例は次のとおりです(ポートは環境に合わせて置き換え)。
git config --global http.proxy "http://127.0.0.1:7890"
git config --global https.proxy "http://127.0.0.1:7890"
SSH リモート([email protected]:...)はこの設定の外側を通るため、SSH が直結のままだとタイムアウトが続くことがあります。その場合は SSH の ~/.ssh/config で ProxyCommand を用意する、あるいは HTTPS リモートへ切り替える、といった別の論点になります。本稿のスコープは HTTP(S) ベースの Git 操作が主です。
npm/yarn/pnpm のプロキシと npmrc
npm は環境変数を拾う一方で、.npmrc の proxy/https-proxy が優先される場面もあります。古い値が残っていると、画面上の Clash は正しくても npm だけ別の死んだプロキシ を見に行きます。npm config list で実効値を確認し、不要なら npm config delete proxy などで掃除してください。
Docker デーモンやコンテナ内からの docker pull は、ホストのシェル環境変数とは別物です。コンテナ経由の切り分けは Docker レジストリ分流の記事 を参照してください。混同すると「npm は直したのに pull だけダメ」という状態が長引きます。
よくある落とし穴:書き方・権限・別ユーザーのサービス
第一に、HTTP_PROXY=http://127.0.0.1:7890 のようにスキームを省略すると解釈されないケースがあります。必ず http:// を付けてください。第二に、SOCKS ポートを HTTP_PROXY に入れる ミスです。クライアントによっては互換動作しますが、Git/npm の組み合わせでは失敗しやすいです。混合ポートを使うほうが安全です。
第三に、Clash を「管理者として実行」しているのに、普段の PowerShell は通常ユーザー、という 権限とループバックの境界 です。稀にセキュリティソフトがユーザーコンテキストからの 127.0.0.1 接続だけを弾く構成もあるため、同じユーザー文脈で listen と CLI を揃えると切り分けが楽です。第四に、WSL から Windows 側の Clash を見る場合、127.0.0.1 は WSL 自身を指します。resolv.conf や $(hostname).local 経由のホスト IP を使うなど、WSL 固有のホスト到達 が別テーマになります。
プロキシ設定を恒久化するときは、機密リポジトリや社内 URL が意図せず外向きプロキシ経由になる リスクを理解したうえで NO_PROXY を設計してください。公開端末では画面共有中に変数が映らないよう注意することも忘れずに。
TUN を増やさない方針で足りるケース
TUN は強力ですが、企業ポリシーや他 VPN との競合、管理者権限の扱いなど、導入コストが重い 環境もあります。開発者が欲しいのは「GitHub とパッケージレジストリが安定して通ればよい」という局面なら、ローカル混合ポート+環境変数のほうが変更範囲が小さく、トラブル時の切り戻しも容易です。
すでに TUN を使っているのに CLI だけ不調、という場合でも、TUN が全トラフィックを握っていても ツールがプロキシ変数を無視して直結している パターンは残ります。まずは本稿の順で CLI 側を整え、その上で必要なら TUN 側のログやルールを見る、という二段構えが現実的です。
まとめ
Windows で Clash を動かしているのに Git/npm だけが直結に見えるときは、システムプロキシとターミナル環境変数のレイヤー差 を最初に疑ってください。混合ポートの番号を確認し、HTTP_PROXY/HTTPS_PROXY を http://127.0.0.1:その番号 に揃え、Git と npm の個別設定に古いプロキシが残っていないかを掃除すると、大半の事例は解消に近づきます。
クライアントの組み合わせやビルドを揃えたい場合は、OS 向けのパッケージを ダウンロードページ から選ぶと、GUI とコアの対応関係を追いやすくなります。オープンソースのリポジトリは挙動確認に役立ちますが、実行ファイルの入手は配布ページを主な入口にすると迷いが減ります。→ 無料で Clash をダウンロードし、快適な接続体験を試す