開発者の通信環境を改善する場合、GitHubのWebページだけを対象にしても十分ではありません。リポジトリのcloneやfetch、Docker Hubからのイメージ取得、npmパッケージのインストール、CIの依存関係ダウンロード、外部APIへの接続まで、開発作業は多くのサービスに分かれています。GitHubだけ開けるようになっても、Dockerイメージのレイヤー取得やnpmレジストリへのアクセスが遅ければ、ビルド全体の待ち時間は短くなりません。
開発環境でVPNを使うときの基本は、すべての通信を同じ経路に送ることではありません。ブラウザー、Git、Docker、npm、OSの更新、社内サービスなど、目的ごとに必要な経路を分け、認証情報を守りながら安定性を確認することが重要です。本稿では、GitHub・Docker・npmを個別に見た場合の注意点、分割トンネルの考え方、コマンドラインでの確認手順、接続できないときの切り分け方を順に説明します。
開発作業の通信をサービス別に分けて考える
最初に行うべき作業は、どの通信をVPN経由にするかを決めることです。開発端末では、ブラウザーでGitHubを閲覧する通信と、GitがHTTPSまたはSSHでリポジトリへ接続する通信が別の設定を使うことがあります。また、Docker CLIはDockerデーモンを経由するため、ターミナルに設定したプロキシがそのままイメージ取得へ適用されるとは限りません。npmも、シェルの環境変数、npmの設定、企業ネットワークの証明書設定がそれぞれ影響します。
90+
対応国・地域
200+
利用可能な回線
無制限
同時接続台数
たとえば、GitHubのリポジトリ一覧は表示できるのに、git cloneだけが失敗する場合があります。このとき、ブラウザーのプロキシ設定だけを変更しても、Git CLIは別の経路を使い続けます。反対に、OS全体をVPNへ接続した結果、社内Gitサーバーやクラウド管理画面まで別の出口を通り、アクセス制御に引っかかることもあります。
| 対象 | 主な通信 | 確認すべき設定 | 起こりやすい問題 |
|---|---|---|---|
| GitHub | Web、HTTPS、SSH、API | Gitのproxy設定、SSHの経路、DNS | cloneだけ失敗する、push時に認証が止まる |
| Docker Hub | レジストリ認証、マニフェスト、イメージレイヤー | Dockerデーモンのproxy、証明書、レジストリ設定 | ログインは成功するがpullが途中で止まる |
| npm | レジストリ、依存関係、パッケージメタデータ | registry、proxy、CA証明書 | 名前解決エラー、タイムアウト、整合性エラー |
| CI | ソース取得、依存関係、イメージ、API | Runner側の経路とシークレット管理 | 手元では成功するがCIだけ失敗する |
ここで大切なのは、速度を単一のダウンロード値で判断しないことです。開発では、接続開始、名前解決、認証、複数ファイルの取得、長時間の転送が連続して発生します。ピーク速度が高くても、接続の再確立が多い回線や、DNSの応答が不安定な回線では、依存関係のインストールやコンテナの取得が快適になるとは限りません。
GitHubのclone・push・APIを安定させる
GitHubでは、Webページの閲覧、Git over HTTPS、Git over SSH、REST APIやGraphQL APIが異なる接続として動作します。Webページが開くからといって、すべてのGit操作が同じように動くとは限りません。HTTPSを使うリポジトリではGitのHTTPプロキシ設定が関係し、SSHを使う場合はSSHクライアントの接続先とポート、鍵認証、ホスト鍵確認が関係します。
まず現在のGit設定を確認します。意図しない古いプロキシや、以前のネットワーク用に保存された認証情報があると、VPNへ接続した後も失敗が続くことがあります。
git config --global --get http.proxy
git config --global --get https.proxy
git remote -v
git ls-remote <repository-url>
不要なグローバル設定がある場合は、いきなり複数の項目を変更せず、現在の値を記録してから削除または一時的な設定へ切り替えます。社内リポジトリと公開リポジトリで必要な経路が異なる場合、すべてのGit通信を一律にVPNへ送るのではなく、ドメイン単位のルールを検討してください。ただし、GitHubのWebサイト、API、Gitの接続先を別々の経路へ振り分けると、認証セッションやアクセス制御の判断が不安定になることがあります。
SSHでは、秘密鍵をVPNクライアントや第三者のサービスへ入力する必要はありません。鍵はローカルのSSHエージェントで管理し、接続先ホストの確認を維持します。SSHの接続が不安定な場合、別プロトコルへ変更する前に、DNS解決、到達性、ファイアウォール、VPNクライアントのルールを順番に確認します。HTTPSへ切り替える場合も、アクセストークンをコマンド履歴や共有設定ファイルへ直接書かないようにしてください。
- ✅ Gitのproxy設定とシェルの環境変数を別々に確認する。
- ✅ clone、fetch、push、API呼び出しを個別にテストする。
- ✅ SSH鍵やアクセストークンをVPNの設定欄へ保存しない。
- ✅ リポジトリのホスト名と利用経路を分割トンネルのルールに明示する。
- ❌ Webページが表示できるだけでGit操作も正常だと判断しない。
- ❌ 接続エラーのたびに認証情報を作り直したり、鍵を再発行したりしない。
Dockerとnpmの取得経路を設定する
Dockerの通信で特に注意したいのは、Docker CLIとDockerデーモンが別のプロセスとして動く点です。ターミナルでHTTP_PROXYやHTTPS_PROXYを設定しても、デーモンが独立して動いている環境では、docker pullに反映されない場合があります。Docker Desktopを使う場合はアプリケーション側の設定、Linuxでsystemdのデーモンを使う場合はサービスの環境設定を確認します。
Docker Hubからの取得では、認証エンドポイント、レジストリのAPI、マニフェスト、複数のレイヤー配信が順番に発生します。ログインが成功しても、レイヤー取得の経路だけが失敗することがあります。エラーメッセージを見て、認証失敗なのか、名前解決なのか、タイムアウトなのか、証明書検証なのかを分けてください。社内ミラーやプライベートレジストリを利用している場合は、公開レジストリと同じルールへ無理にまとめないほうが安全です。
npmでは、現在使用しているレジストリを確認します。
npm config get registry
npm config get proxy
npm config get https-proxy
npm ping
npm view <package-name> version
npmのレジストリを変更する場合は、プロジェクトの.npmrc、ユーザーの設定、CIの環境変数を区別します。公開パッケージ用のレジストリと、社内パッケージ用のレジストリを混在させると、認証トークンが意図しないホストへ送信される危険があります。設定ファイルをリポジトリへコミットする場合は、トークンを含めず、CIのシークレット機能から注入する設計にしてください。
分割トンネルを使った実践手順
分割トンネルは、特定の通信だけをVPNへ送り、それ以外を通常のネットワークへ残す仕組みです。開発環境では、GitHubやDocker Hubなどの取得経路をVPNへ送る一方、ローカル開発サーバー、プリンター、社内ネットワーク、クラウド管理用の固定経路を通常接続に残す、といった設計が考えられます。ただし、VPNクライアントによってはアプリ単位、ドメイン単位、IP単位で対応範囲が異なります。自動ルールをそのまま信用せず、実際の接続先を確認してください。
接続前後を比較する手順
- VPN接続前に、Gitの現在設定、npmのregistry、Dockerの動作状態、名前解決の結果を記録します。
- VPNクライアントで目的地域の回線を選び、まず通常のWeb通信とDNS解決が正常か確認します。
- GitHubの公開リポジトリに対して、Web閲覧、git ls-remote、必要に応じてcloneを順番に試します。
- Dockerではログイン状態を確認した後、対象イメージのmanifest取得とpullを別々に確認します。
- npmではregistry、npm ping、パッケージ情報の取得、依存関係のインストールを順番に実行します。
- 問題がなければ、ローカル開発サーバーや社内サービスが意図せずVPN経由になっていないか確認します。
VPNクライアントは、公式クライアントのほか、Clash Verge、sing-box、Shadowrocketなど、購読リンクを取り込める互換クライアントでも利用できる場合があります。Windows、macOS、iOS、Android、Linuxでは、トンネルの作成方法やDNSの扱いが異なるため、同じ購読設定でも挙動が一致するとは限りません。設定を取り込んだ後は、モード、ルール、DNS、IPv6、システムプロキシの状態を確認します。複数のクライアントを同時に起動すると、ルーティングや仮想ネットワークインターフェースが競合するため、テスト時は一つだけを有効にしてください。
プロトコルにも役割の違いがあります。WireGuardは構成が比較的シンプルで、対応クライアントでは接続の再確立を確認しやすい方式です。ShadowsocksやVMess、Trojanは互換クライアントで利用されることが多く、設定形式やTLSの扱いは提供元とクライアントに依存します。Hysteria2はネットワーク条件によって適性が変わるため、名前だけで優劣を決めず、Git操作やパッケージ取得のような実際の用途で確認してください。プロトコルを変えるときも、同時に地域、DNS、分割ルールまで変更しないことが比較の基本です。
CIと認証情報を安全に扱う
ローカル端末でVPNを有効にしても、CIのRunnerが自動的に同じ経路を使うわけではありません。CIのビルドがGitHubからソースを取得し、npm依存関係やDockerイメージをダウンロードする場合、実際の接続元はRunnerのネットワークです。したがって、手元で成功した設定をそのままCIへコピーするのではなく、RunnerのDNS、外向き通信、プロキシ、証明書、レジストリ認証を個別に確認する必要があります。
CIでは、アクセストークン、npmトークン、Dockerレジストリのパスワードをログへ出力しないことが基本です。コマンドのデバッグ表示、環境変数一覧、失敗時のアーカイブに秘密情報が含まれないか確認してください。VPNの購読リンクも認証情報に相当するため、リポジトリ、Dockerイメージ、Issue、ビルドログへ貼り付けないでください。必要な設定はCIのシークレット管理へ登録し、利用先のホストと権限を限定します。
開発チームで共通設定を配布する場合は、接続先、プロトコル、ルール、DNS、証明書の扱いを文書化すると、端末ごとの差を減らせます。一方で、個人用の認証トークンや端末固有の秘密鍵まで共通ファイルへ含めるべきではありません。接続が遅いときは、回線を頻繁に切り替える前に、対象サービスの障害、ローカルネットワークの混雑、DNSの状態、CI側の制限を確認してください。
- ✅ CI Runnerが実際にどのネットワークとDNSを使うか確認する。
- ✅ npmやDockerの認証情報はCIのシークレットとして注入する。
- ✅ デバッグログ、キャッシュ、成果物にトークンが残っていないか点検する。
- ✅ 失敗を認証、名前解決、TLS、経路、レジストリの各層に分けて調査する。
- ❌ ローカル端末のVPN接続だけでCIの通信も改善したと考えない。
- ❌ 購読リンクや秘密鍵を設定例として公開リポジトリへ保存しない。
継続して使える開発環境を作る
安定した開発環境では、最速の回線を探し続けるより、用途に合う経路を固定し、問題が起きたときに戻せる状態を作ることが重要です。GitHubではリポジトリ操作とAPIの経路を確認し、Dockerではデーモンの設定を確認し、npmではレジストリと証明書を確認します。さらに、CIはローカルと別環境として扱い、Runner側の接続条件を記録します。
VPNサービスを選ぶ際は、ノード名の多さだけでなく、利用したい地域、対応クライアント、購読リンクの取り込みやすさ、公式クライアントの対応OSを確認してください。HBVPNではWindows、macOS、iOS、Android、Linuxに対応し、90+の国・地域と200+の回線を案内しています。同時接続台数に制限がないため、開発端末と検証用端末で同じアカウントを使う構成も検討できますが、各サービスのアカウント共有ルールは別途確認してください。料金や利用条件は料金プランで確認できます。
トラブルが解消しない場合は、回線を変更する前に、発生時刻、使用端末、クライアント、プロトコル、対象サービス、エラー全文、VPN接続前後の差分を整理すると、原因を伝えやすくなります。接続手順や対応クライアントの詳細は利用ガイドも参照してください。ネットワーク経路を変更しても解決しない認証エラーやパッケージ側の公開停止は、サービス提供元やレジストリ管理者へ確認する必要があります。