Claude APIのIP許可リスト入門——Next.jsとCIの接続元を検証する
Anthropicが11月5日に公開したIP allowlistingベータを解説します。Next.js・Firestore・GitHub Actionsを使う架空の業務アプリで、通信の送信元を棚卸しし、組織全体の制限でアプリや定期ジョブを止めないための疎通確認と導入手順を紹介します。

はじめに
漏えいしたClaude APIの鍵が使える場所を絞りたい。一方、接続元の制限で開発端末や夜間ジョブを止めたくありません。
Anthropicは2026年11月5日、Claude Consoleで組織のIP許可リストを設定できるベータ機能を公開しました。対象サービスへの要求を送信元IPで制限します。公式リリースノート
架空の問い合わせ管理アプリ「ReplyDock」で、Next.jsからClaude APIへの疎通をFirestoreに記録します。設定変更前後を比較し、GitHub Actionsも含めた導入判定ができるようになります。情報は2026年11月7日時点です。
新機能の要点を押さえる
許可リストは組織全体に適用され、対象にはConsoleとMessages・ModelsなどのAPIが含まれます。IPv4・IPv6の単一アドレスまたはCIDR形式で、最大1,000件を登録できます。CIDRはIP範囲の表記です。
登録するのは、Anthropicから見える送信元の公開IPです。利用者のブラウザのIP、Next.jsの公開URL、内部ネットワークの私設IPとは区別します。別のクラウド経由で提供されるClaudeへの適用範囲も確認してください。公式設定ガイド
ハンズオン1:通信経路を棚卸しする
ReplyDockには問い合わせの要約、返信案、夜間の集計があります。GitHub Issue RD-101に呼び出し元と担当者を記録します。
| 呼び出し元 | 確認する内容 |
|---|---|
| Next.jsのサーバー | 配置先の送信元公開IPと固定化方法 |
| 開発端末 | VPN経由で出るか、IPv6も使うか |
| GitHub Actionsの評価ジョブ | runnerの送信元と変更頻度 |
| 定期実行ワーカー | 通常のWeb要求と同じ経路か |
| 管理者のConsole接続 | 設定を変更・復旧できる経路か |
Next.jsから外部APIへの通信経路はホスティング先で確認します。入口のドメイン設定だけで送信元を判断しないでください。
GitHubは、標準のGitHub-hosted runnerの広いIP範囲を許可リストに使うことを推奨せず、固定IPを持つlarger runnerやself-hosted runnerを案内しています。GitHub公式資料
この例ではサーバーとrunnerを固定送信元から外へ出します。self-hosted runnerも、自前運用だけでは固定IPになりません。
ハンズオン2:Next.jsで疎通結果を残す
Node.js 22以上、Next.js App Router、検証用Firestoreを用意します。Firebase Admin SDKを追加し、書き込み権限のある認証情報をApplication Default Credentialsで設定します。
yarn add firebase-admin
サーバーの秘密環境変数にANTHROPIC_API_KEYと、長いランダム値EGRESS_CHECK_TOKENを設定します。CHECK_PHASEは変更前がbefore、変更後がafterです。
下記は自作の管理APIです。Models APIで文章生成せずに確認します。ヘッダーは公式の認証仕様に合わせています。
// src/app/api/ops/claude-egress/route.ts
import { applicationDefault, getApp, getApps, initializeApp } from "firebase-admin/app";
import { FieldValue, getFirestore } from "firebase-admin/firestore";
export const runtime = "nodejs";
export async function POST(request: Request) {
const token = process.env.EGRESS_CHECK_TOKEN;
const key = process.env.ANTHROPIC_API_KEY;
if (!token || !key) {
return Response.json({ error: "Missing configuration" }, { status: 500 });
}
if (request.headers.get("authorization") !== `Bearer ${token}`) {
return Response.json({ error: "Unauthorized" }, { status: 401 });
}
let upstreamStatus: number | null = null;
try {
const response = await fetch("https://api.anthropic.com/v1/models?limit=1", {
headers: {
Authorization: `Bearer ${key}`,
"anthropic-version": "2026-10-21",
},
cache: "no-store",
signal: AbortSignal.timeout(10_000),
});
upstreamStatus = response.status;
await response.text();
} catch {
upstreamStatus = null;
}
try {
const app = getApps().length ? getApp() : initializeApp({
credential: applicationDefault(),
});
await getFirestore(app).collection("claudeEgressChecks").add({
phase: process.env.CHECK_PHASE ?? "before",
upstreamStatus,
checkedAt: FieldValue.serverTimestamp(),
});
} catch {
return Response.json({ error: "Audit write failed" }, { status: 503 });
}
const ok = upstreamStatus === 200;
return Response.json({ ok, upstreamStatus }, { status: ok ? 200 : 502 });
}
Route HandlerとFirestoreへのデータ追加の例です。nullは通信失敗、503は記録失敗です。鍵や応答本文は保存しません。管理APIは運用者だけが利用し、Firestoreの記録もクライアントから読み書きできない設定にします。
サーバーを起動し、手元にも同じ管理トークンを設定して実行します。
curl --fail-with-body --request POST \
--header "Authorization: Bearer $EGRESS_CHECK_TOKEN" \
http://localhost:3000/api/ops/claude-egress
期待値はHTTP 200、upstreamStatus: 200とFirestoreの記録です。配置先でも実行します。送信元IP自体は測定しません。
ハンズオン3:設定変更とCIを検証する
検証用組織で、ConsoleのIdentity and accessからIP allowlistを開きます。棚卸しした公開IPと管理者の接続元を登録し、保存します。管理者が設定ページへ戻れる救済設定も確認してください。反映には最大15分かかります。有効化と復旧の手順
本番と検証が同じ組織なら既存処理への影響も調べます。変更後はCHECK_PHASE=afterで再起動・再デプロイし、前節を再実行します。
| 検証 | 期待値と判断 |
|---|---|
| 登録済み経路のNext.js | 200、Firestoreに変更後の記録 |
| 未登録端末からClaudeへ直接接続 | IP制限による403 |
| 評価用runnerからClaudeへ直接接続 | 登録済み送信元なら200 |
| 実際の問い合わせ要約 | 正常終了し、業務テストも通過 |
外部からNext.jsの管理APIを呼んでも、検証されるのはNext.js側の送信元です。runner自身の経路は、そのrunner上で直接確認します。秘密変数を設定したジョブで実行します。
curl --fail-with-body --silent --show-error --output /dev/null \
--header "Authorization: Bearer $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2026-10-21" \
'https://api.anthropic.com/v1/models?limit=1'
GitHub Actionsでは信頼できる検証ジョブだけに鍵を渡し、シェルのトレース出力は無効にします。失敗時はジョブを止め、yarn buildと業務テストも維持します。
403だけで原因を断定せず、未登録端末の直接検証では公式ガイドにあるpermission_errorとIP範囲に関するメッセージを確認します。管理APIは上流の失敗を502へまとめるため、FirestoreのupstreamStatusを見て切り分けます。
24タスクに展開する順番
ReplyDockのAI処理が24件あるなら、RD-101で経路を整理し、RD-102で疎通記録、RD-103で検証用組織への設定を完了します。その後、4件ずつ業務テストを行い、週次ジョブまで確認してから本番の変更時間を決めます。
IP制限は鍵の寿命を短くしないため、期限と失効手順も整備します。APIキーの管理
まとめ
Claudeを呼ぶ場所と送信元を一覧にし、変更前後の疎通を記録しましょう。Next.js、runner、定期ジョブを確認してから組織全体へ適用してください。