なぜ必要か
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 台のマシンから利用している」ように見える。
アーキテクチャ
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(プロバイダ検出) |
→ 削除 |
x-anthropic-billing-header を完全削除することで、公式の CLAUDE_CODE_ATTRIBUTION_HEADER=false env var と同等の効果を得る。これによりセッション間のプロンプトキャッシュが共有され、システムプロンプトコストを約 85% 削減できる。
クイックスタート
git clone https://github.com/motiful/cc-gateway.git
cd cc-gateway
npm install
bash scripts/quick-setup.sh
-
STEP 1
資格情報抽出macOS Keychain からアクセストークン・リフレッシュトークン・有効期限を取得
-
STEP 2
正規 ID 生成正規デバイス ID とクライアントトークンを生成して
config.yamlに書き込む -
STEP 3
ランチャー生成
./clients/cc-<hostname>を生成。ブラウザ OAuth 不要 -
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 ライフサイクル
extract-token.sh の再実行が必要。
platform.claude.com に一切接触しない。リアル OAuth トークンはゲートウェイが一元管理し、クライアントには見えない。
デプロイメント
npm run dev # tsx watch, 自動リロード
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-proxy.anthropic.com はハードコードされており ANTHROPIC_BASE_URL に従わない。公式 MCP サーバーを使うクライアントのリクエストはゲートウェイを迂回する。Clash で当該ドメインをブロックすることで防げる。
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 で表示 |