ブログに戻る

GitHubとnpmのためのプロキシ:GitHubがブロックされている国や遅い国からリポジトリやパッケージにアクセスする方法

GitHubがブロックされているか、遅い場合は、プロキシが10分で問題を解決します。VPNなしでリポジトリやnpmパッケージへのアクセスを設定する方法を説明します。

📅2026年4月4日
```html

GitHubがブロックされている、10~30秒の遅延がある、またはnpm installが途中で止まるという状況は、ロシア、イラン、中国、その他の国の開発者にとって馴染みのあるものです。解決策はあり、それは思ったよりも簡単です:正しく設定されたプロキシは、VPNなしでリポジトリ、パッケージ、GitHubのAPIへの安定したアクセスを提供します。

なぜGitHubとnpmがブロックまたは遅延するのか

プロキシを設定する前に、何に直面しているのかを理解することが重要です。GitHubとnpmへのアクセスの問題は3つのタイプがあり、それぞれに異なるアプローチが必要です。

国家レベルでの完全なブロック

中国、イラン、北朝鮮、そして2022年以降は時折ロシアも、DNSレベルまたはIPによってGitHubをブロックしています。これは、github.comへのリクエストが全く通らないか、接続エラーを返すことを意味します。この場合、npmレジストリ(registry.npmjs.org)は正常に動作するか、ブロックされている可能性があります。

企業のファイアウォールとネットワーク制限

国家によるブロックがなくても、企業ネットワークはしばしば外部リポジトリへのアクセスを制限します。これは銀行、政府機関、大企業での標準的な慣行です:IT部門はポート443へのアウトバウンド接続を閉じるか、特定のドメインをブロックします。このようなネットワーク内の開発者は、回避策なしではgit clonenpm installを行うことができません。

地理的要因による遅い速度

技術的にはGitHubにアクセス可能ですが、500MBのリポジトリをクローンするのに40分かかり、npmを介して依存関係をインストールするのに永遠にかかります。これはルーティングの問題です:パッケージは混雑したノードや長いルートを通過します。アメリカやヨーロッパにあるプロキシサーバーは、ルートを短縮し、3~10倍の速度向上を実現します。

理解しておくべきこと:

プロキシはこれら3つの問題をすべて解決します:ブロックを回避し、許可されたポートを通じてトラフィックをトンネルし、地理的に近い出口ノードによって速度を向上させます。このプロキシは、特定のアプリケーション(Git、npm、ブラウザ)レベルで機能し、マシン上の他のトラフィックには影響を与えません。

プロキシ vs VPN:コード作業にどちらを選ぶべきか

多くの開発者は習慣的にVPNを選びます。これは理解できます—VPNは設定が簡単で、システム全体に対してすぐに機能します。しかし、GitHubやnpmを使用する場合、プロキシの方が便利なことが多いです。違いを見てみましょう。

基準 プロキシ VPN
トラフィックの範囲 特定のアプリケーションのみ(Git、npm) システム全体のトラフィック
CI/CDでの設定 環境変数を通じて、簡単 クライアントのインストールが必要、難しい
Dockerでの動作 ENVを通じて渡され、問題なし 特権モードが必要
速度 高速(全トラフィックの暗号化なし) 暗号化のため遅い
企業ネットワークとの衝突 最小限 頻繁(IT部門によってブロックされる)
サーバーでの使用 env変数を通じてネイティブに デーモンのインストールが必要

結論は簡単です:チームにGitHubとnpmへのアクセスを提供することが目的であれば、プロキシは一度設定すれば、各マシンのシステム設定に干渉することなく動作します。特にCI/CDパイプラインでは、VPNを物理的に立ち上げるのが難しいため、重要です。

GitHubとnpmに適したプロキシの種類

すべてのプロキシがGitとnpmで同じように機能するわけではありません。選択は、ブロックを回避する、ダウンロードを高速化する、または企業ネットワークから作業するというあなたの目的によって異なります。

HTTP/HTTPSプロキシ

最もシンプルなオプションです。Gitとnpmは、標準の環境変数を通じてHTTPプロキシをネイティブにサポートしています。リポジトリのクローン、パッケージのインストール、GitHub APIとの作業など、ほとんどのタスクに適しています。プロキシプロバイダーがHTTPアドレスを提供している場合は、そこから始めましょう。

SOCKS5プロキシ

より柔軟なプロトコルで、TCPレベルで機能します。SSH接続を含むあらゆるタイプのトラフィックをサポートします。GitをHTTPSではなくSSHを介して使用している場合、SOCKS5の方が好ましいです。Gitは、構成でsocks5://パラメータを通じてSOCKS5をサポートしています。

レジデンシャルプロキシ

レジデンシャルプロキシは、実際の家庭ユーザーのIPアドレスを使用します。GitHubにとって特に重要なのは、厳しいブロックがある国から作業している場合です:これらのIPは非常にまれにしかブラックリストに載らず、通常のユーザートラフィックのように見えます。データセンターのIPがプロバイダーのレベルでブロックされている状況に適しています。

データセンタープロキシ

データセンタープロキシは、ほとんどの開発者にとって最適な選択です。レジデンシャルプロキシよりも速く、安価で、安定した接続を提供します。GitHubが単に遅いだけでブロックされていない場合、アメリカやヨーロッパのデータセンタープロキシは、クローンやパッケージのダウンロード時に最大の速度向上を提供します。

プロキシの種類 速度 ブロック回避 最適な用途
データセンターHTTP ⭐⭐⭐⭐⭐ 中程度 ダウンロードの高速化、npm install
データセンターSOCKS5 ⭐⭐⭐⭐⭐ 中程度 SSH経由のGit、柔軟な設定
レジデンシャル ⭐⭐⭐ 高い 厳しいブロック(イラン、中国)
モバイル ⭐⭐⭐ 非常に高い 最大の回避、稀なケース

Gitのためのプロキシ設定:ステップバイステップの指示

Gitは、組み込みの設定と環境変数を通じてプロキシをサポートしています。両方の方法を示しますので、あなたの作業プロセスに合った方を選んでください。

方法1:git configを通じて(推奨)

これは、マシン上のすべてのGit操作に適用される永続的な設定です。ターミナルを開いて、次のコマンドを実行します:

# HTTP/HTTPSプロキシの場合
git config --global http.proxy http://username:password@proxy-host:port
git config --global https.proxy http://username:password@proxy-host:port

# SOCKS5プロキシの場合
git config --global http.proxy socks5://username:password@proxy-host:port
git config --global https.proxy socks5://username:password@proxy-host:port

# 設定が適用されたか確認
git config --global --list | grep proxy

username:password@proxy-host:portをあなたのプロキシのデータに置き換えてください。プロキシが認証なしの場合は、username:password@を削除してください。

方法2:環境変数を通じて

一時的な使用やスクリプトで便利です。Gitは標準の環境変数HTTP_PROXYHTTPS_PROXYを自動的に取得します:

# Linux / macOS — ~/.bashrcまたは~/.zshrcに追加
export HTTP_PROXY="http://username:password@proxy-host:port"
export HTTPS_PROXY="http://username:password@proxy-host:port"
export NO_PROXY="localhost,127.0.0.1,::1"

# Windows (PowerShell)
$env:HTTP_PROXY="http://username:password@proxy-host:port"
$env:HTTPS_PROXY="http://username:password@proxy-host:port"

# ターミナルを再起動せずに適用(Linux/macOS)
source ~/.bashrc

GitHub専用のプロキシ設定

GitHubへのリクエストのみをプロキシ経由で送信したい場合は、セクション設定を使用します:

# github.com専用のプロキシ
git config --global http.https://github.com.proxy http://username:password@proxy-host:port

# プロキシ経由でのクローン確認
git clone https://github.com/username/repo.git

SOCKS5経由のSSHでのGit

GitHubをSSH経由で使用している場合(HTTPSではなく)、設定は少し異なります。~/.ssh/configファイルを編集する必要があります:

# ~/.ssh/config

Host github.com
    HostName github.com
    User git
    # Linux/macOSではnc(netcat)を使用
    ProxyCommand nc -X 5 -x proxy-host:port %h %p
    
    # またはconnect-proxyを使用(インストールが必要)
    # ProxyCommand connect -S proxy-host:port %h %p
    
    # WindowsではGit Bashを使用
    # ProxyCommand connect -S proxy-host:port %h %p

これにより、git clone [email protected]:user/repo.gitgit pushのコマンドが自動的にSOCKS5プロキシを通過するようになります。

プロキシ設定をリセットする方法

# グローバル設定からプロキシを削除
git config --global --unset http.proxy
git config --global --unset https.proxy

npm、yarn、pnpmのためのプロキシ設定

各パッケージマネージャーには独自のプロキシ設定方法があります。npm、yarn、pnpmの3つを具体的なコマンドとともに説明します。

npm

npmは、組み込みの設定を通じてプロキシをサポートしています:

# npmのためのプロキシを設定
npm config set proxy http://username:password@proxy-host:port
npm config set https-proxy http://username:password@proxy-host:port

# 設定を確認
npm config get proxy
npm config get https-proxy

# テスト:プロキシ経由でパッケージをインストール
npm install lodash

# プロキシをリセット
npm config delete proxy
npm config delete https-proxy

設定は~/.npmrcファイルに保存されます。直接編集することもできます:

# ~/.npmrc
proxy=http://username:password@proxy-host:port
https-proxy=http://username:password@proxy-host:port
strict-ssl=false

strict-ssl=falseパラメータ

プロキシがSSLトラフィックを傍受する場合(例えば、企業のプロキシ)、npmは証明書に対して警告を出すことがあります。strict-ssl=falseパラメータは検証を無効にします。企業ネットワーク内でのみ使用し、プロキシを信頼できる場合に限ります—公共のネットワークでは安全ではありません。

Yarn (v1 Classic)

# Yarn Classic (v1)
yarn config set proxy http://username:password@proxy-host:port
yarn config set https-proxy http://username:password@proxy-host:port

# 確認
yarn config get proxy

# リセット
yarn config delete proxy
yarn config delete https-proxy

Yarn Berry (v2+)

# Yarn Berryは環境変数を使用
# プロジェクトのルートにある.yarnrc.ymlに追加:
httpProxy: "http://username:password@proxy-host:port"
httpsProxy: "http://username:password@proxy-host:port"

# または環境変数を通じて
export HTTP_PROXY="http://username:password@proxy-host:port"
export HTTPS_PROXY="http://username:password@proxy-host:port"

pnpm

# pnpmはnpmと同じ.npmrcを使用
# npmがすでに設定されている場合、自動的に適用されます

# またはpnpm configを通じて明示的に
pnpm config set proxy http://username:password@proxy-host:port
pnpm config set https-proxy http://username:password@proxy-host:port

代替案:npmレジストリのミラー

npmレジストリが遅いがGitHubが利用可能な場合、ミラーに切り替えることができます。人気のオプション:Taobao(中国向け)、Verdaccio(セルフホスティング)。ただし、ミラーはパッケージのバージョンが遅れることが多いため、プロキシの方が信頼性があります:

# レジストリをミラーに切り替える(ブロック回避ではなく、速度向上のため)
npm config set registry https://registry.npmmirror.com

# 公式レジストリに戻す
npm config set registry https://registry.npmjs.org

CI/CDにおけるプロキシ:GitHub Actions、Docker、Jenkins

ローカルマシンでプロキシを設定することは半分の仕事です。真の課題は、隔離されたネットワークで動作するCI/CDパイプラインにGitHubとnpmへのアクセスを提供することです。最も一般的な3つのシナリオを見てみましょう。

GitHub Actions

GitHub Actionsでは、プロキシはworkflowファイル内の環境変数を通じて設定されます。リポジトリの設定(Settings → Secrets)にシークレットを追加し、その後workflow内で使用します:

# .github/workflows/build.yml
name: Build

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest
    
    env:
      HTTP_PROXY: ${{ secrets.PROXY_URL }}
      HTTPS_PROXY: ${{ secrets.PROXY_URL }}
      NO_PROXY: "localhost,127.0.0.1"
    
    steps:
      - uses: actions/checkout@v3
      
      - name: Node.jsのセットアップ
        uses: actions/setup-node@v3
        with:
          node-version: '18'
      
      - name: npmプロキシの設定
        run: |
          npm config set proxy ${{ secrets.PROXY_URL }}
          npm config set https-proxy ${{ secrets.PROXY_URL }}
      
      - name: 依存関係のインストール
        run: npm ci

Docker

Dockerでは、プロキシは2つのレベルで必要です:イメージのビルド時(docker build)とコンテナ内です。これらは異なる設定です:

# --build-argを通じてビルド時にプロキシを渡す
docker build \
  --build-arg HTTP_PROXY=http://user:pass@proxy-host:port \
  --build-arg HTTPS_PROXY=http://user:pass@proxy-host:port \
  -t myapp .

# Dockerfile内でプロキシのためにARGを使用
# Dockerfile
ARG HTTP_PROXY
ARG HTTPS_PROXY
ENV HTTP_PROXY=$HTTP_PROXY
ENV HTTPS_PROXY=$HTTPS_PROXY

RUN npm ci

# 依存関係のインストール後—プロキシをリセット(イメージに保存しない!)
ENV HTTP_PROXY=""
ENV HTTPS_PROXY=""

Dockerデーモンのためのグローバルプロキシ設定(docker pull用):

# /etc/docker/daemon.json
{
  "proxies": {
    "http-proxy": "http://user:pass@proxy-host:port",
    "https-proxy": "http://user:pass@proxy-host:port",
    "no-proxy": "localhost,127.0.0.1"
  }
}

# 変更後にDockerを再起動
sudo systemctl restart docker

Jenkins

Jenkinsでは、プロキシはエージェントレベルでJenkinsfile内の環境変数を通じて設定されるか、システム設定でグローバルに設定されます:

// Jenkinsfile
pipeline {
    agent any
    
    environment {
        HTTP_PROXY  = credentials('proxy-url')
        HTTPS_PROXY = credentials('proxy-url')
        NO_PROXY    = 'localhost,127.0.0.1'
    }
    
    stages {
        stage('インストール') {
            steps {
                sh 'npm config set proxy $HTTP_PROXY'
                sh 'npm config set https-proxy $HTTPS_PROXY'
                sh 'npm ci'
            }
        }
        stage('ビルド') {
            steps {
                sh 'npm run build'
            }
        }
    }
}

よくあるエラーとその修正方法

プロキシが正しく設定されていても、何かがうまくいかないことがあります。最も一般的なエラーとその解決方法をまとめました。

エラー:ECONNREFUSEDまたはConnection refused

プロキシが応答していません。原因:不正なアドレスまたはポート、プロキシサーバーが利用できない、資格情報の有効期限が切れています。

解決策:次のコマンドでプロキシの可用性を確認してください:

curl -v --proxy http://user:pass@proxy-host:port https://github.com

エラー:SSL certificate problem / UNABLE_TO_VERIFY_LEAF_SIGNATURE

プロキシがSSLトラフィックを傍受し、自分の証明書を挿入していますが、Gitまたはnpmはそれを信頼していません。

Gitの解決策:

git config --global http.sslVerify false
# またはプロキシのルート証明書を追加:
git config --global http.sslCAInfo /path/to/proxy-ca.crt

エラー:npm ERR! code ENOTFOUND

npmがレジストリのDNS名を解決できません。プロキシは設定されていますが、DNSリクエストはそれを通過していません。

解決策:HTTPプロキシの代わりにSOCKS5を使用してください—DNSリクエストをトンネルします:

npm config set proxy socks5://user:pass@proxy-host:port
npm config set https-proxy socks5://user:pass@proxy-host:port

エラー:407 Proxy Authentication Required

プロキシが認証を要求していますが、資格情報が渡されていないか、不正確です。

# URL内のログインとパスワードが正しくエンコードされていることを確認してください
# パスワードに特殊文字(@、:、#)が含まれている場合は、それらをエンコードしてください:
# @ → %40, : → %3A, # → %23

# 例:パスワード "p@ss:word" → "p%40ss%3Aword"
npm config set proxy http://user:p%40ss%3Aword@proxy-host:port

Git cloneは動作するが、git pushは動作しない

Clone(読み取り)とpush(書き込み)は異なるプロトコルを使用する場合があります。プロキシがHTTPとHTTPSの両方に設定されていることを確認してください。pushにSSHを使用している場合は、上記のように~/.ssh/configに別の設定が必要です。

チェックリスト:すべてが機能しているか確認する

プロキシを設定した後、このチェックリストを確認して、すべてが正しく機能していることを確認してください。

✅ GitHubとnpmのためのプロキシ設定チェックリスト

  • プロキシが利用可能:curl -v --proxy PROXY_URL https://github.comが200を返す
  • Git configが設定されている:git config --global --list | grep proxyがあなたのプロキシを表示する
  • クローンのテスト:git clone https://github.com/torvalds/linux.git --depth=1が動作する
  • npmプロキシが設定されている:npm config get proxyがあなたのプロキシを表示する
  • npm installのテスト:npm install lodashが成功する
  • SSHを使用している場合:ssh -T [email protected]が挨拶を返す
  • CI/CD:環境変数がシークレットに追加され、パイプラインが通過する
  • Docker:docker buildが--build-argでネットワークエラーなしで完了する
  • 速度:クローンがプロキシなしよりも明らかに速い
  • プロキシの資格情報がコード内に平文で保存されていない(シークレットのみに)

1つのコマンドでの迅速な診断

何かがうまくいかず、問題の所在が不明な場合は、この診断スクリプトを実行してください:

#!/bin/bash
# GitHub/npmのためのプロキシ診断

PROXY="http://user:pass@proxy-host:port"

echo "=== 1. GitHubへの直接アクセス ==="
curl -s -o /dev/null -w "%{http_code}" https://github.com && echo " OK" || echo " FAIL"

echo "=== 2. プロキシ経由のアクセス ==="
curl -s -o /dev/null -w "%{http_code}" --proxy "$PROXY" https://github.com && echo " OK" || echo " FAIL"

echo "=== 3. プロキシ経由のnpmレジストリへのアクセス ==="
curl -s -o /dev/null -w "%{http_code}" --proxy "$PROXY" https://registry.npmjs.org && echo " OK" || echo " FAIL"

echo "=== 4. 現在のGitプロキシ設定 ==="
git config --global --list | grep proxy || echo "Gitプロキシが設定されていません"

echo "=== 5. 現在のnpmプロキシ設定 ==="
npm config get proxy
npm config get https-proxy

結論

GitHubとnpmのためのプロキシ設定は、正しい手順を知っていれば難しい作業ではありません。要点をまとめましょう:

  • 遅いGitHubの高速化のために — アメリカやヨーロッパのデータセンタープロキシが適しています:速く、安定しており、安価です。
  • ブロック回避のために — 実際のユーザーのIPを持つレジデンシャルプロキシが最大の信頼性を提供します。
  • HTTPS経由のGitのために — git configでhttp.proxyを設定してください。
  • SSH経由のGitのために~/.ssh/configでProxyCommandを使用してください。
  • npm/yarn/pnpmのために — configまたは環境変数を通じてプロキシを設定してください。
  • CI/CDのために — プロキシのデータをシークレットを通じて渡し、コード内にハードコーディングしないでください。

一度10~15分を設定に費やすことで、インターネット接続の状態やブロックポリシーに依存せずに、GitHubとnpmへの安定したアクセスを得ることができます。チームは遅いダウンロードを待つ時間を失い、CI/CDパイプラインはネットワークエラーなしで通過し、異なる国の開発者が同じ条件で作業できるようになります。

制限されたアクセスのある国からGitHubとnpmを使用するための安定したプロキシを探している場合は、データセンタープロキシを検討することをお勧めします—これらは高い速度と接続の安定性を提供し、リポジトリのクローンや依存関係のインストール時に重要です。厳しいブロックのある地域には、レジデンシャルプロキシが最適です—これらのIPはほとんど制限にかかりません。

```