開発者向けClash設定術:Git・SSH・Homebrewを安定化

コードを書いている途中でGitHubの取得やnpmのインストールが止まると、開発の流れは大きく乱れます。本記事では、ClashをGit・SSH・Homebrewなどの開発ツールと組み合わせ、ターミナル作業を安定させる具体的な設定と切り分け方法をまとめます。

開発用通信をClashで分ける基本設計

Gitでリモートリポジトリを取得する、SSHでサーバーへ接続する、Homebrewでパッケージを導入する、npmで依存関係を解決する。この4つはすべて「ターミナルから実行する通信」ですが、同じ方法でプロキシを設定できるわけではありません。GitのHTTPS通信はHTTPプロキシ設定で処理できますが、SSHは別途プロキシコマンドが必要です。Homebrewとnpmは環境変数を参照する場合があり、GUIクライアントでシステムプロキシをオンにしただけでは動作しないこともあります。

最初に決めるべきなのは、Clashのどのポートを開発ツールに使うかです。Clash VergeやClash Verge Rev、Mihomo系クライアントでは、設定画面の「ポート」「混合ポート」「Mixed Port」などに、HTTPとSOCKS5の両方を受け付けるポートが表示されます。例として 127.0.0.1:7890 を使いますが、実際の番号はクライアントの画面に表示されている値へ置き換えてください。別のVPNやプロキシが同じポートを使っている場合、接続拒否や意図しない経路になるため、先に競合を解消します。

作業推奨経路主な設定場所確認方法
Git over HTTPSHTTPまたはMixedポートgit configgit ls-remote
Git over SSHSOCKS5またはHTTP CONNECT~/.ssh/configssh -T
HomebrewHTTP・HTTPS環境変数シェル設定ファイルbrew update
npmHTTP・HTTPS環境変数またはnpm設定npm confignpm ping

まずローカルポートを確認する

以下の例で使う 7890 は説明用の値です。クライアントの「設定」または「General」にあるHTTPポート、SOCKSポート、Mixedポートを確認し、実際の番号へ変更してください。ポートが開いていない状態でGitやHomebrewの設定だけを変更しても、通信は成功しません。

Git HTTPSを安定させる:プロキシ設定と解除

リモートURLが https:// で始まるGitリポジトリなら、GitのHTTPプロキシを設定するだけでClashを利用できます。設定はユーザー単位で保存されるため、複数のリポジトリに同じ動作を適用したい場合はグローバル設定が便利です。Mixedポートを 127.0.0.1:7890 で待ち受けている場合は、次のように指定します。

git config --global http.proxy http://127.0.0.1:7890
git config --global https.proxy http://127.0.0.1:7890
git config --global --get http.proxy
git config --global --get https.proxy

HTTPSリポジトリでも、設定値のスキームは http:// で問題ありません。これはリモート先への通信がHTTPになるという意味ではなく、ローカルのプロキシサーバーへHTTP CONNECT方式で接続する指定です。ClashのHTTPまたはMixedポートがHTTPS接続を中継します。設定後は実際のリポジトリを変更する前に、読み取りだけのコマンドで経路を確認できます。

git ls-remote https://example.invalid/sample/project.git
GIT_CURL_VERBOSE=1 git ls-remote https://example.invalid/sample/project.git

上の example.invalid は存在しないドメインを使った説明用の値です。実際には利用中のリモートURLを指定してください。Clashのログに対象ドメインが現れ、選択したプロキシグループへ接続されていれば、GitからClashまでの経路は成立しています。認証エラーが表示される場合は、プロキシではなくリポジトリの権限、トークン、またはSSH鍵の問題である可能性があります。

グローバル設定とリポジトリ単位設定

社内リポジトリやLAN内のGitサーバーまで外部プロキシへ送る必要はありません。その場合はグローバル設定を使わず、対象リポジトリのディレクトリでローカル設定を登録します。反対に、すでにグローバルプロキシを設定していて一部のホストだけ直接接続にしたい場合は、Gitのno_proxy相当の除外設定を追加します。

git config --local http.proxy http://127.0.0.1:7890
git config --local https.proxy http://127.0.0.1:7890

git config --global --unset http.proxy
git config --global --unset https.proxy
git config --global --list --show-origin | grep -E 'http.*proxy|https.*proxy'

Windowsでは最後の grep が使えないため、git config --global --list --show-origin を実行して一覧から確認します。設定を解除したのに通信がプロキシへ送られる場合は、環境変数の HTTP_PROXYHTTPS_PROXYALL_PROXY、またはリポジトリ内のローカル設定が残っていないか確認してください。

Git SSHを通す:~/.ssh/configで接続方式を固定する

SSHはGitのHTTP設定を参照しません。SSHリモートを使う場合、GitはSSHクライアントを起動して通常は宛先の22番ポートへ直接接続します。そのため、ブラウザやGit over HTTPSが正常でも git clone だけが停止することがあります。ClashのSOCKS5ポートを利用するなら、SSHの ProxyCommand にプロキシ経由の接続コマンドを設定します。

macOSとLinuxでは、まず ~/.ssh/config を作成または編集します。WindowsのOpenSSHでも通常は %USERPROFILE%\.ssh\config を使用できます。SOCKS5対応の nc が利用できる環境では、次のような設定が基本形です。

Host code-host
  HostName example.invalid
  User git
  Port 22
  IdentityFile ~/.ssh/id_ed25519
  ProxyCommand nc -x 127.0.0.1:7891 -X 5 %h %p
  ServerAliveInterval 30
  ServerAliveCountMax 3

ここで 7891 はSOCKSポートの例です。Host code-host は設定上の別名で、実際のGitリモートURLではこの別名を使います。例えば既存のURLを [email protected]:sample/project.git のように指定すると、Host名が一致して設定が適用されます。すでに標準のホスト名を使っている場合は、Host にそのホスト名を記述しても構いません。

ssh -vT git@code-host
git clone git@code-host:sample/project.git

-v を付けたSSHの詳細ログでは、どの設定ファイルが読み込まれたか、ProxyCommandが実行されたか、どの段階で停止したかを確認できます。Clashの接続ログにホスト名が出ない場合は、SSH設定のHost名が一致していないか、nc のオプション形式が環境に合っていない可能性があります。

HTTPポートしか使えない場合の選択肢

SOCKSポートを公開していない構成では、HTTP CONNECTに対応した中継コマンドを使います。ただし、macOS、Linux、Windowsで利用できるコマンドが異なるため、無理に一つの設定を全OSへコピーしないでください。最もトラブルが少ない方法は、GitリモートをHTTPSへ変更することです。SSH鍵を使う必要があるサーバーでは、SOCKSポートを有効にするか、クライアントが提供するSSHプロキシ機能を利用します。

SSHの接続先ポートを無条件に443番へ変更する方法もありますが、相手側サーバーが443番でSSHを待ち受けていなければ接続できません。ポート番号を変えるだけではClash経由にならない点にも注意が必要です。鍵のパスフレーズ入力が表示されない、または接続が長時間停止する場合は、まず ssh -G code-host で最終的に適用された hostnameportproxycommand を確認します。

Homebrewとnpmの設定:シェル環境を揃える

HomebrewはFormulaやCaskの情報を取得し、必要なソースやバイナリをダウンロードします。npmもレジストリへのHTTPS通信、依存パッケージの取得、Gitリモートへのアクセスなど複数の経路を使います。GUIクライアントでシステムプロキシを有効にしても、ターミナルから起動したプロセスがその設定を継承するとは限りません。シェルから明示的に環境変数を設定すると、ツール間の挙動を揃えやすくなります。

macOSとLinuxでbashまたはzshを使う場合は、~/.zshrc~/.bashrc、またはログインシェルが読み込む設定ファイルへ追加します。HTTPとHTTPSの大文字・小文字を両方用意しておくと、ツールごとの参照方法の違いを吸収できます。

export HTTP_PROXY="http://127.0.0.1:7890"
export HTTPS_PROXY="http://127.0.0.1:7890"
export http_proxy="$HTTP_PROXY"
export https_proxy="$HTTPS_PROXY"
export NO_PROXY="localhost,127.0.0.1,::1,.local"

source ~/.zshrc
env | grep -i proxy

NO_PROXY はプロキシを使わない宛先の一覧です。ローカル開発サーバー、Dockerのバインドアドレス、社内ネットワークを追加する場合は、組織のアドレス範囲を確認してから記述します。広すぎる除外指定は、意図せず直接接続を増やすため避けてください。Windows 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"
Get-ChildItem Env:*proxy*

Homebrewでは、まず更新処理を試し、失敗した場合だけ詳細ログを確認します。npmは設定ファイルに保存する方法もありますが、共有端末や複数のネットワークを使う場合は、シェル環境変数のほうが切り替えやすいことがあります。

brew update
brew doctor

npm config set proxy http://127.0.0.1:7890
npm config set https-proxy http://127.0.0.1:7890
npm config get proxy
npm config get https-proxy
npm ping

プロキシ設定をリポジトリへ保存しない

npmの設定をプロジェクト単位で保存すると、.npmrc がリポジトリへ混入することがあります。認証情報を含むURLを設定ファイルへ直接書かず、不要になった設定は npm config delete proxynpm config delete https-proxy で削除してください。社内レジストリなど例外的な宛先は、組織の運用ルールに従って分離します。

止まったときの切り分け:Clash・OS・ツールを分離する

「Gitが使えない」という症状だけで設定を何度も変更すると、原因が見えにくくなります。Clash自体が接続できているか、プロキシポートが待ち受けているか、ツールがそのポートを使っているかを順番に分離して確認します。

  1. Clashのプロキシモードを確認します。開発対象のドメインが意図した策略グループへ入り、接続ログにリクエストが記録されることを確認します。ルール変更後は既存接続が残る場合があるため、必要に応じて接続を閉じてから再試行します。
  2. ローカルポートの待ち受けを確認します。macOSとLinuxでは lsof -nP -iTCP:7890 -sTCP:LISTEN、Windowsでは Get-NetTCPConnection -LocalPort 7890 を実行します。何も表示されなければ、ポート番号が違うか、ClashのHTTP/Mixedポートが無効です。
  3. Gitを使わずにプロキシの応答を確認します。例えば curl -v -x http://127.0.0.1:7890 https://example.invalid を実行し、Clashのログへ到達するかを確認します。ここで失敗する場合は、GitではなくClashまたはローカルネットワークの問題です。
  4. Gitの設定の出所を確認します。git config --show-origin --get-regexp '.*proxy' で、system、global、localのどこからプロキシ値が読み込まれているかを調べます。古いポート番号や別ツールの設定が残っていないか確認してください。
  5. SSHはHTTPSと別に確認します。ssh -G code-host でProxyCommandを確認し、次に ssh -vvT git@code-host で詳細ログを取得します。SSHだけClashログに現れないなら、GitのHTTP設定を調べても解決しません。
  6. 最後にDNSを確認します。開発用ドメインの名前解決が失敗している場合、プロキシ設定が正しくても接続できません。ClashのDNSログ、TUN設定、システムのDNS、IPv6経路を順番に確認します。
症状可能性が高い原因最初に見る場所
Git HTTPSが即座にconnection refusedポート番号違い、Clash未起動git configと待ち受けポート
Git HTTPSが長時間停止するルール、DNS、ノード経路の問題Clashの接続ログとDNSログ
HTTPSは動くがSSHだけ失敗するProxyCommand未設定またはHost不一致ssh -Gの出力
Homebrewだけ更新できないシェルが環境変数を読み込んでいないenv | grep -i proxy
npmの取得先が予期せず変わるnpmrcや環境変数の古い設定npm config list

原因を確認した後は、一度に一つだけ設定を変更します。例えばGitのプロキシを解除して環境変数だけで試す、あるいはSSHをHTTPSリモートへ一時的に切り替える、といった比較を行うと、どの層に問題があるかを特定できます。複数のVPN、企業プロキシ、コンテナ内プロキシを同時に重ねると、経路とログの対応が崩れやすいため、検証時はClash以外の中継を一時停止するのが安全です。

FAQ:開発ツールとClashに関するよくある質問

システムプロキシをオンにすればGitも自動で使えますか?

必ずしも使えるとは限りません。Gitは独自の設定、環境変数、またはlibcurlの挙動を参照するため、システムプロキシを継承しない環境があります。まず git config --get-regexp '.*proxy'env | grep -i proxy を確認し、Git HTTPSには明示的なプロキシ設定を追加してください。

GitのSSHとHTTPSはどちらを選ぶべきですか?

HTTPプロキシの環境が頻繁に変わる場合はHTTPSのほうが設定しやすく、SSH鍵を必須とするサーバーや自動化環境ではSSHが適しています。SSHを使う場合は、~/.ssh/config にProxyCommandを明示し、ssh -G と詳細ログで適用結果を確認してください。

Homebrewとnpmへ同じポートを設定しても問題ありませんか?

ClashのHTTPまたはMixedポートであれば、通常は同じポートを共有できます。ただしnpmの設定と環境変数に異なる値が残っていると、実行環境によって経路が変わります。npm config list と環境変数を確認し、不要な古い設定を削除してください。

設定後に直接接続へ戻すにはどうすればよいですか?

Gitのグローバル設定は git config --global --unset http.proxygit config --global --unset https.proxy で解除できます。npmは npm config delete proxynpm config delete https-proxy を使います。シェルの環境変数も設定ファイルから削除またはコメントアウトし、ターミナルを再起動して反映状態を確認してください。

動作確認を終えた後の運用

開発用のClash設定は、一度つながれば終わりではありません。ノードの切り替え、ネットワーク変更、OSアップデート、Clashクライアントの更新によって、ポート番号やTUN権限、DNS経路が変わることがあります。設定ファイルには実際のポート番号やプロキシ用の別名をコメントとして残し、チームで共有する設定と個人環境の設定を分離しておくと、再現性を維持できます。

まずGit HTTPS、次にSSH、最後にHomebrewとnpmという順序で動作確認し、各ツールのログとClashの接続ログを対応させてください。必要な通信だけをプロキシへ送り、LANやローカル開発サービスは適切に除外することが、速度と安定性の両立につながります。

Clashの導入と基本設定を確認する

開発ツールの設定を始める前に、利用中のOSに合ったクライアントと基本的なプロファイル設定を確認してください。

Clashクライアントをダウンロード

利用するプラットフォームに合ったクライアントを選び、インストール後に本記事の手順でDocker Engineとコンテナのプロキシ経路を設定してください。

Clashをダウンロード