GitHubからコードを取得する、Docker Hubからイメージを取得する、npmから依存パッケージをインストールする。これらはすべて開発作業に欠かせない通信ですが、実際の速度はサービス名だけでなく、DNS解決、国際経路、プロキシの適用範囲、ターミナルやDockerデーモンの設定に左右されます。ブラウザーだけVPNに接続しても、Git、Docker、npm、CIツールの通信が同じ経路を通るとは限りません。

この記事では、開発者がVPNを利用してGitHub・Docker Hub・npm関連の通信を整理する方法を説明します。Windows、macOS、Linuxの公式クライアントを使う場合だけでなく、Clash Verge、sing-box、Shadowrocketなどの互換クライアントでサブスクリプションを読み込む場合にも応用できる考え方をまとめます。重要なのは、すべての通信を無条件にVPNへ送ることではなく、開発に必要な通信だけを確実に対象へ含め、ローカル開発環境は分離しておくことです。

開発者の通信を最初に分類する

設定を始める前に、どのプログラムがどの通信を行っているかを分けて考えます。GitHubのウェブ画面やAPIはブラウザーだけでなく、Gitコマンド、GitHub CLI、エディターの拡張機能からもアクセスされます。Dockerでは、ターミナルのDocker CLIが命令を送り、実際にイメージを取得するのはローカルまたはリモートのDockerデーモンです。npmでは、npm CLIがレジストリへ接続し、設定ファイルに保存されたregistry、proxy、証明書の指定が動作を決めます。

この違いを理解しないままブラウザーで接続を確認すると、「ウェブサイトは開くのにgit cloneが失敗する」「npm installだけが止まる」「docker pullがタイムアウトする」といった状態になります。原因はVPNそのものではなく、対象プロセスが別のDNS、別のプロキシ、別のネットワーク名前空間を使っていることがあります。

90+

接続可能な国・地域

200+

利用可能な回線

不限

同時利用デバイス

ツールごとに確認する項目

また、リポジトリの取得だけでなく、DNS問い合わせ、認証サーバーへの接続、コンテナのベースイメージ取得、パッケージの依存先へのアクセスまで確認対象に含めます。トップレベルのURLだけが通っても、依存パッケージやリダイレクト先が別ドメインであれば、そこだけ失敗する可能性があります。

クライアントとプロトコルを開発環境に合わせる

VPNクライアントは、サブスクリプションに含まれるノード設定を読み込み、OSの仮想ネットワークインターフェースまたはローカルプロキシを作成するアプリです。PeeVPNではWindows、macOS、iOS、Android、Linuxに対応しており、公式クライアントを使う場合はパネルから対象OSの案内を確認できます。Clash Verge、sing-box、Shadowrocketなどを使う場合は、クライアントがサブスクリプションの形式とノードのプロトコルを解析できるかを先に確認してください。

Shadowsocksは比較的シンプルな暗号化プロキシとして利用され、ルール型クライアントで扱われることが多い方式です。VMessやVLESSはXray系の設定でよく使われますが、VLESS自体が暗号化方式のすべてを表すわけではなく、TLSやREALITYなどのトランスポート設定と組み合わせて評価する必要があります。Trojanは通常TLSと組み合わせ、サーバー名、証明書検証、ポートなどが一致していなければ接続できません。Hysteria2はQUICやUDPを利用するため、ネットワーク側でUDPが制限される環境では別方式の回線も検討します。

開発用途では、接続速度の表示だけでなく、ルール分岐、DNS処理、ログの見やすさ、システムプロキシとTUNモードの違いを確認することが重要です。システムプロキシは対応アプリだけが設定を参照しますが、TUNモードは仮想インターフェースを通じて、より広い通信を捕捉できます。ただし、Dockerの仮想ネットワーク、企業内アドレス、ローカルホストまで対象にすると、開発環境に予期しない影響が出ることがあります。

クライアントを選ぶときは、対応プロトコルの多さだけで決める必要はありません。Git、Docker、npmを同時に扱うなら、アプリごとのルールを確認しやすく、DNSモードを変更でき、接続ログから失敗箇所を追えるクライアントのほうが実用的です。接続後にIPアドレスだけを確認するのではなく、DNSの応答、対象ドメインの名前解決、実際のコマンド実行まで順番に検証しましょう。

GitHubとGitの通信を安定させる

GitHubの操作では、HTTPSとSSHを別の通信として扱います。HTTPSのリポジトリURLを使う場合、Gitは通常、OSのシステムプロキシやGit自身のhttp.proxy設定を参照します。一方、SSHは専用ポートと鍵認証を使うため、ブラウザーのプロキシ設定だけでは経路が変わらないことがあります。VPNのTUNモードでOS全体を処理するのか、SSHクライアントに個別のプロキシ設定を行うのかを決めてから設定してください。

まず、現在の設定を確認します。ターミナルでは次のような確認ができます。

git config --global --get http.proxy
git config --global --get https.proxy
git remote -v
ssh -T [email protected]

不要な古いプロキシが残っている場合、VPN接続後もGitだけが以前のアドレスへ接続しようとして失敗します。特定のネットワークでだけプロキシを使う構成にしていたなら、現在のVPNクライアントが提供するローカルプロキシのアドレスとポートを確認し、Gitの設定と一致させます。設定を削除してTUNモードへ任せる方法もありますが、クライアントの動作モードを理解せずに両方を有効にすると、二重プロキシや接続ループの原因になります。

SSHでは、鍵を作り直す前にネットワーク経路を確認します。認証が失敗しているように見えても、実際にはホスト名の名前解決、ポート到達性、プロキシ未対応が原因かもしれません。SSHの詳細ログは原因の切り分けに役立ちますが、秘密鍵の内容や認証トークンをログ共有に含めないでください。HTTPSとSSHのどちらを使う場合でも、最初は小さな公開リポジトリの取得や既存リポジトリへの接続確認から始めると、変更の影響を把握しやすくなります。

Docker Hubとnpmを個別に確認する

Dockerで特に注意したいのは、Docker CLIとDockerデーモンが同じ場所で動いているとは限らないことです。Docker Desktopでは、CLIからの命令を受けたバックエンドがイメージレイヤーを取得します。Linuxでリモートデーモンを使っている場合、端末側のVPNだけを有効にしても、実際のpull通信はリモートホスト側のネットワークを通ります。まずデーモンの実行場所を確認し、そのホストが必要な経路とDNSを利用できる状態にします。

DockerデーモンにHTTPプロキシを設定する場合は、Dockerの公式ドキュメントと利用中のOSのサービス管理方式に従います。シェルでexportした環境変数が、そのままバックグラウンドのデーモンへ引き継がれるとは限りません。反対に、クライアント側だけへプロキシを設定しても、レジストリからのレイヤー取得には影響しない場合があります。変更後はデーモンを再起動し、設定が反映されたか、対象レジストリへの認証情報が壊れていないかを確認してください。

npmでは、グローバル設定とプロジェクト内設定の優先順位に注意します。次のコマンドで現在の値を確認できます。

npm config get registry
npm config get proxy
npm config get https-proxy
npm config get strict-ssl

registryを変更した経験がある場合、意図せず古いミラーや社内レジストリを参照していることがあります。VPNを導入する前に、パッケージの取得先、認証トークンの保存場所、プロジェクトの.npmrcを確認してください。TLS検証を無効にする設定は、接続を通すための一般的な解決策ではありません。証明書エラーが出た場合は、DNS、システム時刻、企業プロキシの証明書、クライアントの中間者検査設定を確認し、strict-sslを安易にfalseへ変更しないでください。

要点: GitはGit自身、Dockerはデーモン、npmはregistryと設定ファイルを確認する。3つを同じ「VPN速度」の問題として扱わないことが、最短の切り分けにつながります。

実際に設定して順番に検証する

ここでは、設定変更を一度に増やさず、段階ごとに結果を記録します。最初にVPNクライアントへサブスクリプションを追加し、近い地域の回線、または案内で開発用途に適するとされる回線を選びます。TUNモードを使う場合は、ローカル開発サービスのアドレスや社内ネットワークを除外できるルールがあるか確認してください。

  1. VPN接続前に、Gitのremote、npmのregistry、Dockerデーモンの実行場所を記録します。
  2. VPNクライアントでサブスクリプションを更新し、選択したノードのプロトコルと接続ログを確認します。
  3. ブラウザーだけでなく、ターミナルからGitHub関連ドメインの名前解決とHTTPS接続を確認します。
  4. 小さなリポジトリでgit fetchまたはgit cloneを実行し、認証エラーとネットワークエラーを区別します。
  5. Dockerデーモンのログを確認し、イメージ取得時のDNS、TLS、認証、タイムアウトのどこで止まるか調べます。
  6. npm config getでregistryとプロキシの値を確認してから、依存パッケージの取得を実行します。
  7. VPNを切断して同じ検証を行い、改善した項目と変化しなかった項目を分けます。

この比較では、速度テストの単発結果よりも、同じ操作を複数回行ったときの再現性を重視します。GitHubだけが遅いならGitの認証やプロキシ設定、Dockerだけが失敗するならデーモンの経路、npmだけがエラーになるならregistryや証明書を優先して確認します。すべてのツールが同時に失敗する場合は、VPNクライアントのDNS、TUN設定、ノードの到達性、ローカルファイアウォールを上位の原因として見直します。

CIでは実行環境を別に扱う

ローカルPCでVPNを有効にしても、クラウド上のCIランナーや社内ビルドサーバーの通信は自動的にVPN経由になりません。CIでGitHubからソースを取得し、Dockerイメージやnpmパッケージをダウンロードする場合は、ジョブを実行するホスト側にクライアント、ルーティング、DNS、認証情報を用意する必要があります。共有ランナーへ個人のサブスクリプションURLを環境変数として無制限に渡すのは避け、CIのシークレット管理機能を使い、ログへ値が出力されないようにします。

CIの設定では、プロキシ環境変数を設定しただけでDockerデーモンやサービスコンテナまで対象になるとは限りません。ジョブ、Dockerソケット、リモートデーモン、ビルドステージのそれぞれがどこから外部へ接続するかを確認します。依存パッケージのキャッシュやコンテナレイヤーの再利用を適切に行えば、毎回同じデータを取得する回数を減らせますが、キャッシュへ認証情報や機密ファイルを保存しないように注意してください。

通信分離とトラブルシューティング

開発環境では、GitHub・Docker Hub・npmなどの外部通信をVPNへ送りながら、localhost、プライベートアドレス、社内Git、データベース、Dockerのブリッジネットワークは直接接続にする構成が扱いやすいことがあります。ただし、分割ルールの書式はクライアントごとに異なります。Clash系のルール、sing-boxのroute、システムプロキシの除外設定は互換ではないため、別クライアントへ設定をそのまま貼り付けないでください。

接続後も名前解決が不安定な場合は、OSのDNSキャッシュ、VPNクライアントのDNSモード、ブラウザーの安全なDNS、Docker内部DNSを別々に確認します。ブラウザーが独自のDNS over HTTPSを使っていると、ブラウザーだけが別の名前解決結果になることがあります。逆に、ターミナルやDockerの名前解決がVPN側へ切り替わっていない場合は、TUNモード、システムプロキシ、デーモンの設定を確認します。

原因をサポートへ伝えるときは、使用OS、クライアント名、接続モード、再現するコマンド、エラーの種類、発生時刻を整理します。完全なサブスクリプションURL、アクセストークン、秘密鍵、npmの認証トークン、社内ホスト名は伏せてください。必要であれば一部をマスキングしたログを用意し、どの設定を変更した後に症状が変わったかを説明すると、調査が進みやすくなります。

最終チェック: 開発向けのVPN設定は、接続ボタンを押して終わりではありません。クライアント、DNS、Git、Dockerデーモン、npm、CIの経路を個別に確認し、必要な通信だけを安定したルートへ送ることが完成形です。