Reverse Proxy · Privacy · Claude Code

CC Gateway

Claude Code と Anthropic API の間に置くリバースプロキシ。デバイス指紋・環境情報・テレメトリを単一の正規プロファイルに正規化し、マルチデバイス利用時のアカウントリスクを制御する。

640+
テレメトリイベント型
40+
環境指紋ディメンション
~85%
プロンプトキャッシュ削減
v0.2
alpha / Node 22+

なぜ必要か

Claude Code は API リクエストごとに 640 以上のテレメトリイベントを 3 並列チャンネルで送信し、40 以上の環境ディメンションでデバイスを識別する。5 秒ごとに device ID・メール・OS バージョン・シェル種別・CPU アーキテクチャ・物理 RAM をベンダーへ送り続けている。

複数マシンでログインすると、それぞれが異なる永続 ID を持つ。公式にはデバイスを管理する手段がなく、アカウント停止のリスクがある。

CC Gateway が解決すること

CC Gateway はリバースプロキシとして Claude Code と Anthropic API の間に入り、デバイス ID・環境フィンガープリント・プロセスメトリクスをすべて 単一の正規プロファイルに正規化する。Anthropic からは「1 人の人間が 1 台のマシンから利用している」ように見える。

免責:本プロジェクトは教育・調査目的のみ。アカウントの共有・レート制限の回避・ToS 違反への利用は禁止。

アーキテクチャ

%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#e8eef8", "primaryTextColor": "#1a2540", "primaryBorderColor": "#6b87c7", "lineColor": "#6b87c7", "secondaryColor": "#f0f3fa", "tertiaryColor": "#faf5e8", "fontFamily": "Plus Jakarta Sans, system-ui, sans-serif", "fontSize": "14px"}}}%% flowchart TD CC1["cc-alice\n(launcher)"] --> GW CC2["cc-bob\n(launcher)"] --> GW CC3["cc-admin\n(launcher)"] --> GW GW["CC Gateway\n:8443"] GW --> AUTH["Auth\nclient token → name"] AUTH --> RW["Rewriter\nbody + headers"] RW --> OA["OAuth\ninject real token"] OA --> API["api.anthropic.com"] GW --> REFRESH["platform.claude.com\n(token refresh only)"] classDef client fill:#e8f4f0,stroke:#4a8f7a,color:#1a3a2f classDef gateway fill:#e8eef8,stroke:#4a6fa8,color:#1a2a4a classDef inner fill:#f0f3fa,stroke:#6b87c7,color:#2a3a5a classDef external fill:#fdfcf5,stroke:#b89a4a,color:#3a2a00 classDef oauth fill:#faf5e8,stroke:#c8a840,color:#3a2a00 class CC1,CC2,CC3 client class GW gateway class AUTH,RW,OA inner class API external class REFRESH oauth

Defence in depth(3 層)

仕組み防ぐもの
Launcher env vars ANTHROPIC_BASE_URL + DISABLE_NONESSENTIAL + ATTRIBUTION_HEADER=false CC が自発的にゲートウェイへルーティング、サイドチャネル無効化、billing ハッシュ省略
Clash(任意) ドメインベース REJECT ルール 将来の新エンドポイントや偶発的な直接接続をブロック
Gateway Body + header + prompt rewriting 40 以上の指紋ディメンションをすべて正規化

リライト対象

各リクエストは src/rewriter.ts を通過し、以下のフィールドを正規プロファイルに差し替える。

カテゴリフィールド処理
Identity metadata.user_id 内の device_id → 正規 device ID
email → 正規メールアドレス
Environment env オブジェクト(40+ フィールド) → オブジェクト丸ごと置換。platform・arch・node_version・terminal・runtimes・CI フラグ等
Process constrainedMemory(物理 RAM) → 正規値に固定
rss, heapTotal, heapUsed → 現実的な範囲内でランダム化
Headers User-Agent → 正規 CC バージョン文字列
x-api-key → ゲートウェイが管理する本物の OAuth トークンを注入
x-anthropic-billing-header → 完全削除(セッション間プロンプトキャッシュ共有を実現)
Prompt text <env> ブロック内の Platform / Shell / OS Version → 正規値に書き換え
Working directory → 正規パスに書き換え
/Users/xxx/, /home/xxx/ → 正規ホームプレフィックスに置換
Billing x-anthropic-billing-header system ブロック → system prompt から削除
Leak fields baseUrl(ANTHROPIC_BASE_URL) → analytics イベントから削除
gateway(プロバイダ検出) → 削除
billing header 戦略:x-anthropic-billing-header を完全削除することで、公式の CLAUDE_CODE_ATTRIBUTION_HEADER=false env var と同等の効果を得る。これによりセッション間のプロンプトキャッシュが共有され、システムプロンプトコストを約 85% 削減できる。

クイックスタート

Alpha:非プライマリアカウントで試験してから本番利用すること。Node.js 22+ 必須。
git clone https://github.com/motiful/cc-gateway.git
cd cc-gateway
npm install
bash scripts/quick-setup.sh
  1. STEP 1
    資格情報抽出
    macOS Keychain からアクセストークン・リフレッシュトークン・有効期限を取得
  2. STEP 2
    正規 ID 生成
    正規デバイス ID とクライアントトークンを生成して config.yaml に書き込む
  3. STEP 3
    ランチャー生成
    ./clients/cc-<hostname> を生成。ブラウザ OAuth 不要
  4. STEP 4
    ゲートウェイ起動
    http://localhost:8443 で起動完了。既存トークンを即時利用

クライアントを使う

./clients/cc-<hostname>   # ゲートウェイ経由で Claude Code 起動

複数クライアントの追加

# 管理者がクライアントごとにランチャーを生成(送付するだけ)
bash scripts/add-client.sh alice
bash scripts/add-client.sh bob

# 受け取った側
chmod +x cc-alice
./cc-alice install    # 'ccg' コマンドとしてインストール
ccg                   # Claude Code 起動

全コマンド

コマンド説明
ccgゲートウェイ経由で Claude Code 起動
ccg install'ccg' システムコマンドとしてインストール
ccg uninstall'ccg' を削除してクリーンアップ
ccg hijack'claude' コマンドも ccg 経由にエイリアス
ccg release'claude' をネイティブに戻す
ccg native [args]ゲートウェイをバイパスして native claude を実行
ccg statusゲートウェイ接続と hijack 状態を表示
ccg helpヘルプ表示

OAuth ライフサイクル

%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#e8eef8", "primaryTextColor": "#1a2540", "primaryBorderColor": "#6b87c7", "lineColor": "#6b87c7", "fontFamily": "Plus Jakarta Sans, system-ui, sans-serif", "fontSize": "13px", "actorBkg": "#e8eef8", "actorBorder": "#4a6fa8", "activationBkgColor": "#f0f3fa", "activationBorderColor": "#4a6fa8", "noteBkgColor": "#faf5e8", "noteBorderColor": "#c8a840"}}}%% sequenceDiagram participant GW as CC Gateway participant KC as macOS Keychain participant PC as platform.claude.com participant API as api.anthropic.com Note over GW: 起動時 GW->>KC: アクセストークン読み取り KC-->>GW: access_token + expires_at Note over GW: 有効なら即時利用(ネット通信なし) Note over GW: 有効期限 5 分前 GW->>PC: refresh_token でリフレッシュ PC-->>GW: 新しい access_token Note over GW: クライアントリクエスト時 GW->>GW: クライアントトークン認証 GW->>GW: body + header 書き換え GW->>API: OAuth token 注入して転送 API-->>GW: レスポンス(SSE passthrough)
即時起動 — Keychain に有効なアクセストークンがあればネットワーク通信なしで起動。
自動リフレッシュ — 有効期限の 5 分前にバックグラウンドでサイレントリフレッシュ。リフレッシュトークンも自動ローテーション。
失敗リカバリ — リフレッシュ失敗時は 30 秒おきにリトライ。リフレッシュトークン自体の失効(数ヶ月)時のみ extract-token.sh の再実行が必要。
クライアント分離 — クライアントは platform.claude.com に一切接触しない。リアル OAuth トークンはゲートウェイが一元管理し、クライアントには見えない。

デプロイメント

ローカル(開発)
npm run dev    # tsx watch, 自動リロード
Docker(本番)
bash scripts/admin-setup.sh

インタラクティブスクリプトが資格情報抽出 → config 生成 → Docker ビルド → 起動まで一括実行。

マルチマシン
Mac-A ──┐
Mac-B ──┼──→ gateway-server:8443 ──→ api.anthropic.com
Mac-C ──┘

管理者マシンも含め 全マシンがゲートウェイ経由で接続すること。管理者が直接接続すると、2 つ目のデバイス指紋が Anthropic に見える。

Tailscale 利用時:メッシュ内のどのマシンでも稼働可能。TLS・パブリック IP・ポート開放不要(Tailscale がトンネルを暗号化)。

TLS 設定(リモートデプロイ時)

mkdir certs
openssl req -x509 -newkey rsa:2048 \
  -keyout certs/key.pem -out certs/cert.pem \
  -days 365 -nodes -subj "/CN=cc-gateway"

# config.yaml の tls セクションをアンコメントし、
# クライアントランチャーにサーバーアドレスを指定して生成
bash scripts/add-client.sh alice "" <gateway-ip>:8443 https

注意事項

MCP サーバー:mcp-proxy.anthropic.com はハードコードされており ANTHROPIC_BASE_URL に従わない。公式 MCP サーバーを使うクライアントのリクエストはゲートウェイを迂回する。Clash で当該ドメインをブロックすることで防げる。
CC アップデート:新しい Claude Code バージョンで新しいテレメトリフィールドやエンドポイントが追加される可能性がある。アップグレード後は Clash の REJECT ログで予期しない接続試行を監視すること。
トークンライフサイクル:ゲートウェイは OAuth アクセストークンを自動リフレッシュする。リフレッシュトークン自体が失効した場合(まれ)、管理者マシンで extract-token.sh を再実行する必要がある。

Clash オプショナルルール

ネットワーク層の安全弁として任意で設定可能。

rules:
  - DOMAIN,gateway.your-domain.com,DIRECT    # ゲートウェイを許可
  - DOMAIN-SUFFIX,anthropic.com,REJECT        # 直接 API 接続をブロック
  - DOMAIN-SUFFIX,claude.com,REJECT           # OAuth をブロック
  - DOMAIN-SUFFIX,claude.ai,REJECT            # OAuth をブロック
  - DOMAIN-SUFFIX,datadoghq.com,REJECT        # テレメトリをブロック

ヘルスチェック・検証エンドポイント

エンドポイント認証説明
GET /_health不要OAuth 状態・正規 device ID・クライアント一覧を返す
GET /_verify必要サンプルリクエストのリライト結果を before/after で表示