コンテンツへスキップ
ネットワークセキュリティ

検証済みクローラー IP リスト: 公式 19 フィードで作る良性ボットの許可リスト

10 の運営元が公開する 19 の公式ファイルから作る検証済みクローラー IP リスト。ファイルの日付、プレフィックス数、許可リストのコード、そして review と判定された検証済みボットを紹介します。

著者GeoIPHub チーム公開日読了時間34 分で読めます
3 つのガラス製サーバーノードが青いガラスのゲートを通って光線を送り、ガラスパネル上の対応するバーに届く。4 つ目のノードは赤く光り、小さな障壁で止まる。運営元が公開するレンジファイルと照合されるクローラーのアドレスを表している

ホスティングネットワークからのトラフィックにチャレンジをかけるファイアウォールルールは、通したいクローラーまで捕まえてしまいます。2026 年 10 月 29 日に照会した検証済みクローラーのアドレスは、すべてホスティングネットワーク上にありました。ClaudeBot は Amazon、DuckDuckGo は Microsoft、AhrefsBot は OVH、Googlebot は Google 自身のネットワークです。そこで User-Agent でルールを緩めると、ヘッダーに「Googlebot」と書くだけのスクレイパーがすべて通り抜けてしまいます。

運営元は証拠を無料で公開しています。ただし、10 の異なるウェブサイトに 19 のファイルとして散らばり、日付もまちまちで、更新スケジュールも明示されていません。しかも 2 つのファイルは同じリストです。トラフィックは現実のものです。Imperva の 2026 年版 Bad Bot レポートの発表にあたり、Thales は次のように書いています。「ボットは今やインターネットを支配しており、ウェブトラフィック全体の 53% 超を占め、そのうち 40% が悪意のあるものに分類される」(原文: "Bots now dominate the internet, accounting for over 53% of all web traffic, with 40% classified as malicious.")

以下では、各ファイルについて 2026 年 10 月 29 日時点の日付、そこに含まれる実在のアドレスに対して GeoIPHub の IP ルックアップ API が返す内容、許可リストを作るスクリプト、共有ファイルで誤作動しないポリシーチェック、そしてどのファイルにもカバーされていないボットを紹介します。

青いガラスのタブが細い光線で、すりガラスのファイルボックスの手前のカードとつながっている。ボットが名乗った名前を運営元自身のファイルと照合することを表している
名前は主張にすぎません。運営元のファイルが証拠です。

良性ボットと悪性ボット: 違いは名前ではなく証明にある

良性ボットとは、通すと決めたボットのうち、その IP が運営元のものだと証明できるものです。悪性ボットはこのどちらかを満たしません。最もよくあるのは、良性ボットの User-Agent を名乗るスクレイパーです。

良性ボットには、検索クローラー、AI 検索やユーザー起点のフェッチャー、SEO ツール、ウェブアーカイブが含まれます。悪性ボットには、スクレイパー、クレデンシャルスタッフィング、クリックボット、スパムボットが含まれます。用語集の多くは、良性ボットは「自ら名乗る」としています。しかし悪性ボットも同じことをします。身元をそのままコピーするのです。これが、スクレイパーがクローラーの名前を借りる理由そのものです。

したがって、本当に役立つ問いは「これは良性ボットか?」ではなく、「このリクエストは、名乗っている運営元から来たものか?」です。後者には機械的に答えが出ます。これがIP によるボット検出の核心です。IP レンジを管理しているのは運営元であり、ほかの誰でもありません。そのうえで、証明されたボットを通すかどうかはポリシーの問題であり、サイトごとに異なってかまいません。

検証済みクローラー IP リスト: 10 の運営元による公式 19 ファイル

これは検索エンジンボットの IP リストとして使えるだけでなく、それ以上のものです。GeoIPHub が読み込む 19 のレンジファイルは 10 の運営元のもので、検索エンジンや AI 企業から、アーカイブや SEO ツールまで含まれます。以下は各ファイルのプレフィックス数と、ファイル内に記載された日付です。取得は 2026 年 10 月 29 日 04:41 から 04:42 UTC の間でした。19 すべてが HTTP 200 で応答し、ipv4Prefix または ipv6Prefix のエントリを持つ prefixes 配列という共通の構造をしています。

運営元ボット(ファイル)ファイル URLプレフィックス数(IPv4 / IPv6)ファイル内の日付API の crawler.name
Google一般クローラー(Googlebot を含む)common-crawlers.json170 / 1472026 年 10 月 28 日Googlebot
Google特殊用途クローラー(AdsBot を含む)special-crawlers.json136 / 1362026 年 10 月 28 日GoogleSpecialCrawler
Googleユーザー起点のフェッチャーuser-triggered-fetchers.json534 / 5342026 年 10 月 28 日GoogleUserTriggeredFetcher
Googleユーザー起点のフェッチャー(google.com)user-triggered-fetchers-google.json252 / 2522026 年 10 月 28 日GoogleUserTriggeredFetcherGoogle
Googleユーザー起点のエージェント(Google-Agent)user-triggered-agents.json12 / 82026 年 10 月 28 日GoogleUserTriggeredAgent
MicrosoftBingbotbingbot.json28 / 02024 年 1 月 3 日Bingbot
AppleApplebotapplebot.json24 / 02026 年 9 月 15 日Applebot
DuckDuckGoDuckDuckBotduckduckbot.json486 / 02026 年 9 月 1 日DuckAssistBot(後述)
DuckDuckGoDuckAssistBotduckassistbot.json486 / 02026 年 9 月 1 日DuckAssistBot
OpenAIGPTBotgptbot.json18 / 02026 年 9 月 22 日GPTBot
OpenAIChatGPT-Userchatgpt-user.json235 / 02026 年 10 月 27 日ChatGPTUser
OpenAIOAI-SearchBotsearchbot.json39 / 02026 年 1 月 2 日OAISearchBot
AnthropicClaudeBot、Claude-User、Claude-SearchBotbots.json14 / 02026 年 10 月 20 日ClaudeBot
PerplexityPerplexity-Userperplexity-user.json10 / 02026 年 10 月 28 日PerplexityUser
PerplexityPerplexityBotperplexitybot.json13 / 02026 年 10 月 28 日PerplexityBot
MistralMistralAI-Usermistralai-user-ips.json4 / 02025 年 2 月 19 日MistralAIUser
MistralMistralAI-Indexmistralai-index-ips.json2 / 02026 年 4 月 19 日MistralAIIndex
Common CrawlCCBotccbot.json4 / 12026 年 8 月 11 日CCBot
AhrefsAhrefsBotcrawler-ip-ranges81 / 0ファイル内に日付なしAhrefsBot

GeoIPHub のスキャナーは、毎日すべてのファイルを再取得しています。2026 年 10 月 27 日に各ファイルから 1 つずつアドレスを照会したところ、19 すべてが検証済みで返りました。ただし Perplexity の 2 つのアドレスは、10 月 28 日に差し替えられる前のファイルのものです。

プレフィックスは合計 3,626 件で、そのうち Google の 5 つのファイルが 2,181 件を占めます。また、実質的に異なるリストは 18 個しかありません。取得時点で、DuckDuckGo の 2 つのファイルはバイト単位で同一でした(MD5 ハッシュが同じ)。Perplexity の 2 つのファイルは 10 月 27 日から 28 日にかけて、プレフィックスが 4 件と 8 件から 10 件と 13 件に変わりました。誰かの表を、この記事の表も含めて、手作業で設定ファイルに写してはいけないという好例です。

補足が 4 点あります。Google の旧パス developers.google.com/search/apis/ipranges/googlebot.json は、現在は common-crawlers.json への 301 リダイレクトで応答するため、これを紹介している古いガイドも、コードがリダイレクトに従えば動作します。Microsoft のファイルの日付は 2024 年 1 月です。Perplexity のドキュメントは今も www.perplexity.com の URL にリンクしていますが、これは上記の www.perplexity.ai のファイルにリダイレクトされます。そして www.gstatic.com/ipranges/goog.json は Google の全アドレスを対象としているため、クローラーのリストではありません。Google の 5 つのファイルがクローラーグループにどう対応するかについては、Googlebot ガイドをご覧ください。

一致すると何が返るか: 実際の 4 件のルックアップ

GeoIPHub の API で一致すると、threat.crawler.verified: true、運営元、ファイルのラベル、verification_method: "ip_range_list" が返ります。どのファイルにも含まれないアドレスは verified: false を返しますが、これは「未検証」という意味にすぎません。以下は ClaudeBot のアドレスについて、実際のレスポンス(2026 年 10 月 29 日 04:42:21 UTC)を要約したものです。

GeoIPHub API
{ "asn": { "asn": 16509, "org": "AMAZON-02 - Amazon.com, Inc." }, "threat": { "is_crawler": true, "crawler": { "verified": true, "name": "ClaudeBot", "operator": "Anthropic", "category": "ai", "verification_method": "ip_range_list" } }, "scoring": { "fraud_score": 0, "recommended_action": "allow", "detection_methods": ["datacenter_ip", "no_ptr_datacenter", "verified_crawler"] } }

2026 年 10 月 29 日の dig -x 216.73.216.10 では PTR レコードが返らなかったため、このアドレスを逆引き DNS で裏付けることはできません。裏付けられるのは Anthropic のファイルだけです。ほかの 3 つのアドレスは、04:42:28 から 04:42:44 UTC の間に照会しました。

IP出典verifiedoperatornamecategoryスコア、アクション
216.73.216.10Anthropic のファイルtrueAnthropicClaudeBotai0、allow
107.178.192.1Google のユーザー起点フェッチャーのファイルtrueGoogleGoogleUserTriggeredFetcherfetcher0、allow
104.43.54.127DuckDuckGo の両方のファイルtrueDuckDuckGoDuckAssistBotai0、allow
31.13.64.1Meta のネットワーク、AS32934falseMetaFacebook-Botsocial_preview0、allow

ここで 1 件のリクエストをたどってみましょう。104.43.54.127 から DuckDuckBot を名乗るリクエストが来たとします。このアドレスは DuckDuckGo の両方のファイルに /32 として載っています。ルックアップは verified: true と operator: "DuckDuckGo" を返しますが、name は "DuckAssistBot"、category は "ai" です。「検索ボットは許可し、AI ボットはレート制限する」というポリシーを、名前やカテゴリをキーにして書くと、DuckDuckGo の本物の検索クローラーを絞ってしまいます。名乗られたボットとその運営元をキーにすれば、通ります。想定していた名前は DuckDuckBot でしたが、返ってきたのは DuckAssistBot でした。name フィールドが教えてくれたのは、どのファイルが最後に読み込まれたかであって、どのボットが来たかではありません。

Meta も落とし穴です。Meta のネットワーク(AS32934)は ASN で照合しているため、is_crawler は true ですが verified は false、verification_method は "none" です。未検証として扱ってください。クローラーのフィールドとそれぞれの意味は、ドキュメントに載っています。

1 つのファイルが複数のボットをカバーするため、ポリシーは運営元をキーにする

名乗られた User-Agent を運営元に対応づけ、verified: true かつ同じ運営元であることを要求してください。crawler.name や category をスイッチに使ってはいけません。1 つのファイルが複数のボットを表すことがあるからです。

  • DuckDuckGo: 2 つのファイルで 1 つのリストです。当社のスキャナーは duckassistbot.json を後から読み込むため、後勝ちとなり、DuckDuckGo のすべてのアドレスに DuckAssistBot のラベルが付きます。
  • Anthropic: ClaudeBot、Claude-User、Claude-SearchBot で 1 つのファイルです。Anthropic のクローラーに関するヘルプページには、「クローラーの送信元 IP アドレスがこのリストにあれば、そのクローラーは Anthropic から来ていることを示す」(原文: "If a crawler has a source IP address on this list, it indicates that the crawler is coming from Anthropic.")とあります。つまり一致すれば Anthropic として検証済みであり、どのボットかは User-Agent で分かります。
  • Google: common-crawlers ファイルは、Googlebot という 1 つのラベルの下で複数の Google クローラーをカバーしています。

is_crawler だけでも許可リストの根拠としては弱すぎます。Meta の未検証の一致でも true になるからです。また、API はリクエストヘッダーを見ません。受け取るのは IP だけなので、名乗りの側のチェックは常に自社のコードで行います。

クローラー許可リストを 4 ステップで作る方法

作り方は 4 ステップです。許可する User-Agent ごとに運営元を対応づけ、その運営元のファイルを読み込み、IP をファイルと照合し、失敗した名乗りはすべてレートリミッターに回します。

  1. 名乗りのマップ。 許可する User-Agent のトークン(古い WAF ではホワイトリストと呼ばれます)と、その IP を含んでいるべきファイルの運営元を一覧にします。
  2. ファイル。 以下のスクリプトで自前の統合リストを作るか、新しい IP ごとにルックアップを 1 回呼び出して、判定を数週間ではなく数時間だけキャッシュします。レンジは変わるためです。
  3. 照合。 IP を、名乗られた運営元のプレフィックスだけと照合します。
  4. 未検証の場合の処理。 403 で応じてはいけません。検証できないものはブロックせずレート制限することで、新しいプレフィックスから来た本物のクローラーは、消えてしまうのではなく速度が落ちるだけで済みます。

なぜファイル単位ではなく運営元単位なのでしょうか。運営元によっては、ファイルごとの固定が不可能だからです。Anthropic の 3 つのボットは 1 つのファイルを共有し、DuckDuckGo の 2 つのボットは 1 つのリストを共有しているため、「Claude-SearchBot 専用のファイル」を要求するチェックには照合する相手がありません。運営元単位の照合は、ファイルが別々の Google、OpenAI、Perplexity、Mistral では精度がわずかに落ちますが、その代わりに共有ファイルで誤作動することがありません。

ルールは 2 つあります。ASN ではなく、公開されている正確なプレフィックスで照合すること。当社のルックアップでは、Microsoft の AS8075 が Bingbot、GPTBot、ChatGPT-User、DuckDuckGo を収容しているため、これを許可すると Azure のすべての顧客を通してしまいます。そして、User-Agent だけで許可リストに入れないこと。ファイルのないボットには、運営元が文書化している場合に限り、正引き確認付きの逆引き DNSを使ってください。

ビルダーは 19 のファイルをすべて取得し、プレフィックスを運営元ごとにまとめて、ファイルごとの取得時刻を付けた allowlist.json を書き出します。ファイルのダウンロードやパースに失敗した場合、空で返ってきた場合、または最後に正常だったコピーの半分未満に縮小した場合は、そのファイルについて前回のプレフィックスを保持します。GeoIPHub のスキャナーも、ファイルごとに固定の最小プレフィックス数を設けて同じ処理をしています。

GeoIPHub API
// build-allowlist.mjs: Node 18+, no dependencies. Run once a day. import fs from "node:fs"; const FEEDS = { Google: [ "https://developers.google.com/static/crawling/ipranges/common-crawlers.json", "https://developers.google.com/static/crawling/ipranges/special-crawlers.json", "https://developers.google.com/static/crawling/ipranges/user-triggered-fetchers.json", "https://developers.google.com/static/crawling/ipranges/user-triggered-fetchers-google.json", "https://developers.google.com/static/crawling/ipranges/user-triggered-agents.json", ], Microsoft: ["https://www.bing.com/toolbox/bingbot.json"], Apple: ["https://search.developer.apple.com/applebot.json"], DuckDuckGo: [ "https://duckduckgo.com/duckduckbot.json", "https://duckduckgo.com/duckassistbot.json", ], OpenAI: [ "https://openai.com/gptbot.json", "https://openai.com/chatgpt-user.json", "https://openai.com/searchbot.json", ], Anthropic: ["https://claude.com/crawling/bots.json"], Perplexity: [ "https://www.perplexity.ai/perplexity-user.json", "https://www.perplexity.ai/perplexitybot.json", ], Mistral: [ "https://mistral.ai/mistralai-user-ips.json", "https://mistral.ai/mistralai-index-ips.json", ], CommonCrawl: ["https://index.commoncrawl.org/ccbot.json"], Ahrefs: ["https://api.ahrefs.com/v3/public/crawler-ip-ranges"], }; const OUT = "allowlist.json"; const previous = fs.existsSync(OUT) ? JSON.parse(fs.readFileSync(OUT, "utf8")) : { files: {} }; const files = {}; for (const [operator, urls] of Object.entries(FEEDS)) { for (const url of urls) { try { const res = await fetch(url, { signal: AbortSignal.timeout(15000) }); if (!res.ok) throw new Error(`HTTP ${res.status}`); const body = await res.json(); const prefixes = (body.prefixes || []) .map((p) => p.ipv4Prefix || p.ipv6Prefix) .filter(Boolean); if (prefixes.length === 0) throw new Error("no prefixes in file"); const last = previous.files[url]; // A real shrink this large is rare: check it by hand before you trust it. if (last && prefixes.length < last.prefixes.length / 2) { throw new Error(`${prefixes.length} prefixes, last good copy had ${last.prefixes.length}`); } files[url] = { operator, prefixes, file_date: body.creationTime || null, fetched_at: new Date().toISOString(), }; } catch (err) { // Fail safe: a broken fetch keeps yesterday's prefixes for that file. if (previous.files[url]) files[url] = previous.files[url]; console.error(`${url}: ${err.message}; ${files[url] ? "kept previous prefixes" : "no previous copy"}`); } } } fs.writeFileSync(`${OUT}.tmp`, JSON.stringify({ built_at: new Date().toISOString(), files }, null, 1)); fs.renameSync(`${OUT}.tmp`, OUT); console.log(`${Object.keys(files).length} files written to ${OUT}`);

cron の 1 行で実行をスケジュールします。たとえば 20 5 * * * cd /srv/bots && node build-allowlist.mjs です。ポリシーチェックはそのファイルかルックアップのレスポンスのどちらかを読み、どちらの経路でも、名乗られたボットの運営元をキーにします。

GeoIPHub API
// check-claim.mjs: decide whether a bot claim is proven. import net from "node:net"; // Claimed User-Agent token, and the operator whose file must contain the IP. // Not exhaustive; add the bots you allow. const CLAIMS = [ ["googlebot", "Google"], ["adsbot-google", "Google"], ["google-agent", "Google"], ["bingbot", "Microsoft"], ["applebot", "Apple"], ["duckduckbot", "DuckDuckGo"], ["duckassistbot", "DuckDuckGo"], ["gptbot", "OpenAI"], ["oai-searchbot", "OpenAI"], ["chatgpt-user", "OpenAI"], ["claudebot", "Anthropic"], ["claude-searchbot", "Anthropic"], ["claude-user", "Anthropic"], ["perplexitybot", "Perplexity"], ["perplexity-user", "Perplexity"], ["mistralai-user", "Mistral"], ["mistralai-index", "Mistral"], ["ccbot", "CommonCrawl"], ["ahrefsbot", "Ahrefs"], ]; function findClaim(userAgent) { const ua = (userAgent || "").toLowerCase(); return CLAIMS.find(([token]) => ua.includes(token)) || null; } // Path 1: your own allowlist.json from build-allowlist.mjs. export function loadLists(allowlist) { const lists = {}; for (const file of Object.values(allowlist.files)) { lists[file.operator] ||= new net.BlockList(); for (const cidr of file.prefixes) { const [addr, len] = cidr.split("/"); lists[file.operator].addSubnet(addr, Number(len), net.isIPv6(addr) ? "ipv6" : "ipv4"); } } return lists; } export function checkWithLists(userAgent, ip, lists) { const claim = findClaim(userAgent); if (!claim) return { claimed: null, verified: false }; const family = net.isIPv6(ip) ? "ipv6" : "ipv4"; return { claimed: claim[0], verified: lists[claim[1]]?.check(ip, family) === true }; } // Path 2: one lookup per new IP, using the API's crawler fields. export async function lookup(ip, apiKey) { try { const res = await fetch(`https://api.geoiphub.com/v1/lookup/${ip}`, { headers: { "x-api-key": apiKey }, signal: AbortSignal.timeout(2000), }); return res.ok ? await res.json() : null; } catch { return null; // a failed lookup proves nothing: treat it as unverified } } export function checkClaim(userAgent, result) { const claim = findClaim(userAgent); if (!claim) return { claimed: null, verified: false }; const c = result?.threat?.crawler; return { claimed: claim[0], verified: c?.verified === true && c?.operator === claim[1] }; }

2026 年 10 月 29 日のファイルとルックアップに対して両方の経路を実行し、失敗ケースも試しました。GPTBot のケースでは 45.33.32.156 を使っています。これは Nmap の公開テスト用ホストで、そのようなリクエストを送ったことはありません。チェックはボット単位ではなく運営元単位です。Google のフェッチャーのファイルにあるアドレスから Googlebot を名乗った場合も、Google として通ります。

GeoIPHub API
PASS ClaudeBot UA, 216.73.216.10 verified (name ClaudeBot) PASS Claude-SearchBot UA, 216.73.216.10 verified as Anthropic (name ClaudeBot) PASS DuckDuckBot UA, 104.43.54.127 verified (name DuckAssistBot) PASS AhrefsBot UA, 5.39.1.230 verified PASS Googlebot UA, 66.249.66.1 verified PASS GPTBot UA, 45.33.32.156 not verified (no file match) PASS ChatGPT-User UA, 66.249.66.1 not verified (operator is Google) PASS facebookexternalhit UA, 31.13.64.1 no claim in the map PASS Browser UA, 216.73.216.10 no claim PASS Lookup error, ClaudeBot UA not verified 10/10 passed, lookup path and allowlist path agree builder, bots.json forced to fail: kept previous prefixes (14) builder, bingbot.json returns HTML: kept previous prefixes (28) builder, applebot.json returns []: kept previous prefixes (24) builder, chatgpt-user.json shrinks to 1: kept previous prefixes (235)

このコードは許可する側です。ボットごとのブロックポリシーを実装するには、AI クローラーガイドの nginx と Express の設定をご覧ください。

検証済みのボットが悪性ボットということはあるか? AhrefsBot の答えは「ある」

あります。検証で証明されるのは、そのアドレスを誰が運用しているかであり、アドレスがクリーンであることや歓迎されることではありません。AhrefsBot の 5.39.1.230 は、その両方を同時に示しています(2026 年 10 月 29 日 04:42:51 UTC)。

フィールド値
threat.crawler.verifiedtrue
threat.crawler.operatorAhrefs
threat.crawler.categoryseo
threat.is_spammertrue
threat.dnsbl_sourceszen.spamhaus.org
scoring.fraud_score35
scoring.recommended_actionreview
scoring.detection_methodsdatacenter_blocklisted, no_ptr_datacenter, verified_crawler, known_spammer

検証済みクローラーのシグナルは 28.5 ポイントを差し引きます(信頼度 0.95 でマイナス 30)。ただしブロックリストへの登録を打ち消すことはありません。その計算はリスクスコアの理由に関するガイドで確認できます。このアドレスについては、過去の値を 2 つ保存していました。10 月 19 日は 59、step_up で、このときは不正利用の登録も作動していました。10 月 22 日以降は 35、review です。10 月 19 日にこのアドレスを調査した際、RIPE のレジストリでは、OVH のブロック内にある /27 が Ahrefs に登録されていました。

AhrefsBot を通すかどうかを決めるのは許可リストです。スコアが伝えるのは、そのレンジに前歴があるということです。SEO クローラーを必要としないサイトも多く、必要とするサイトも多いので、その判断はあなたに委ねられています。

設計上 robots.txt を無視する良性ボット

「robots.txt に従う」ことは、良性ボットかどうかを判断する基準にはなりません。運営元自身が、ユーザー起点のフェッチャーは従わない場合があると述べているからです。

  • Google: 「ユーザーがリクエストしたフェッチであるため、これらのフェッチャーは通常、robots.txt のルールを無視する」(原文: "Because the fetch was requested by a user, these fetchers generally ignore robots.txt rules.")(Google のユーザー起点フェッチャー)
  • OpenAI、ChatGPT-User について: 「これらの動作はユーザーが開始するため、robots.txt のルールが適用されない場合がある」(原文: "Because these actions are initiated by a user, robots.txt rules may not apply.")(OpenAI のボット)
  • Perplexity、Perplexity-User について: 「ユーザーがフェッチを要求したため、このフェッチャーは通常、robots.txt のルールを無視する」(原文: "Since a user requested the fetch, this fetcher generally ignores robots.txt rules.")(Perplexity のクローラー)

3 社とも理屈は同じです。フェッチは 1 人のユーザーの代わりに行われるため、それをブロックすることは、そのユーザーのリクエストをブロックすることになります。robots.txt をスキップする検証済みフェッチャーは、文書どおりに動作しているのであり、不正を働いているわけではありません。

robots.txt はお願いであり、許可リストは強制です。ユーザー起点のフェッチャーを締め出したいなら、必要なのはテキストファイルの 1 行ではなく、エッジでのルールです。各 OpenAI ボットの役割と、それぞれをブロックした場合のコストについては、OpenAI の比較記事をご覧ください。

リストの鮮度は? ファイルの日付、毎日の取得、2 日の遅延

リストの鮮度は、運営元の最後の編集と、こちらの取得によって決まります。GeoIPHub の API では、毎日の取得と、変更が反映されるまでの最大でおよそ 2 日がそれにあたります。

仕組みは次のとおりです。2026 年 10 月 29 日に確認した GeoIPHub のスキャナーのコードと設定に基づきます。クローラーのステップは、各ファイルを 1 日に最大 1 回取得します。取得に失敗した場合、またはそのファイルの最小プレフィックス数を下回った場合、スキャナーは最後に正常だったレンジを保持します。運営元が削除したプレフィックスは、次の正常な取得とその後の日次の再構築を経て、検証されなくなります。その後、ルックアップデータベースは毎日 00:00 UTC に再構築され、04:00 UTC ごろには利用可能になります。

実用上のルールは、検証済みの判定を数時間キャッシュし、ファイルは毎日再取得し、新しく追加されたプレフィックスは最大でおよそ 2 日間、検証に失敗しうると想定することです。未検証の経路をブロックではなくレートリミッターに回す理由のひとつでもあります。

今回確認した運営元のうち、更新の頻度についてドキュメントで触れているのは Perplexity だけです。「これらのアドレスは定期的に更新されており、WAF 設定の信頼できる情報源とすべきである」(原文: "These addresses are updated regularly and should be the source of truth for your WAF configurations.")。Google の検証ページには頻度の記載がありません。2026 年 10 月 29 日に取得したファイルの日付は、2024 年 1 月(Microsoft)から 2026 年 10 月 28 日(Google と Perplexity)まで幅があります。日付が変わらないのはエラーではありません。動きのない運用もあるからです。

当社側の不足点がひとつあります。API は、どのファイルに一致したか、いつ取得したかを返しません。その監査証跡が必要なら、ビルダーを実行して fetched_at の値を保管してください。

公開リストのないボットと、その対処法

通したいボットの中には、GeoIPHub が読み込むファイルを公開していないものがあり、このリストでは検証できません。

  • OAI-AdsBot: OpenAI は文書化しており、adsbot.json も公開していますが、当社のスキャナーはまだ読み込んでいません。ChatGPT で広告を配信している場合は、自前のビルダーに追加してください。
  • Amazonbot: Amazon はレンジをWeb ページの中に掲載しており、ダウンロードできるファイルはありません。当社では読み込んでいません。
  • Meta: Meta のクローラーのページには「クローラーが使用する User-Agent 文字列、または IP アドレス(こちらのほうが安全)のいずれかを許可リストに追加してください」(原文: "Add to your allow list either the user agent strings or the IP addresses (more secure) used by the crawler")とありますが、レンジファイルは提供されていません。当社はそのネットワークを ASN のみで照合しており、未検証です。
  • Yandex と Baidu: 逆引き DNS のみです。Yandex のガイドがそのチェックを説明しています。逆引きした名前が yandex.ru、yandex.net、yandex.com のいずれかで終わり、その名前を正引きすると同じ IP が返る必要があります。
  • Bytespider: ByteDance のレンジファイルは見つかりませんでした。
  • 稼働監視ツールと決済の Webhook: 多くが独自のリストを公開しています。Stripe は Webhook の IP を JSON で公開しており、IP アドレスのページに記載されています。ベンダー自身のリストを使ってください。これらはクローラーではなく、当社のフィードにも含まれていません。
  • リクエストに署名するボット: Web Bot Auth を使うと、ボットは IP ではなく暗号署名によって自身を証明できます。詳しくはクローラー検証ガイドをご覧ください。Cloudflare の検証済みボットのディレクトリは、Web Bot Auth か、安定した User-Agent を伴う公開 IP リストのどちらかで検証されたボットを受け付けています。

対処法は、逆引き DNS の方法が存在するなら運営元のそれを使い、サービスにはベンダー自身のリストを使い、それ以外はすべてレートリミッターに任せることです。

今夜ビルダーを実行するか、ログにある IP を IP ルックアップに貼り付けて、Crawler の行が「Verified crawler」と「Unverified crawler」のどちらになるか確認してください。ヘッダーの名前は主張にすぎません。運営元のファイルが証拠です。

よくある質問

検証済みクローラー IP リストとは何ですか?

ボットの運営元が自社のクローラー用に公開している IP レンジファイルから作成するリストです。GeoIPHub は Google、Microsoft、Apple、OpenAI、Anthropic など 10 の運営元から 19 のファイルを読み込んでいます。OpenAI は 20 個目の adsbot.json も公開していますが、まだ読み込んでいません。User-Agent がボット名を名乗り、かつその IP が当該運営元のファイルに含まれているとき、そのリクエストは検証済みクローラーです。

IP ルックアップは User-Agent を見ますか?

いいえ。GeoIPHub のルックアップが受け取るのは IP だけです。そのアドレスが Anthropic や Google のファイルに含まれているかどうかは分かりますが、その運営元と User-Agent が名乗るボットを突き合わせる処理は、自社のコードで行います。

検証済みのボットが悪性ボットということはありますか?

あります。AhrefsBot の 5.39.1.230 は Ahrefs が公開しているレンジに一致していましたが、同時に Spamhaus ZEN にも登録されており、2026 年 10 月 29 日時点の GeoIPHub API ではスコア 35、review と判定されました。検証で分かるのはそのアドレスを誰が運用しているかであり、通してよいかどうかではありません。

クローラーの IP レンジはどのくらいの頻度で変わりますか?

運営元によって異なり、多くは明示していません。2026 年 10 月 29 日時点のファイル日付は、2024 年 1 月(Microsoft)から 2026 年 10 月 28 日(Google と Perplexity)まで幅がありました。GeoIPHub は毎日すべてのファイルを再取得しており、変更が API に反映されるまで最大でおよそ 2 日かかります。

クローラーを ASN で許可リストに入れてもよいですか?

いいえ。多くのクローラーは共有クラウド上で動いています。Microsoft のネットワークは Bingbot、GPTBot、DuckDuckGo のボットを収容しているため、これを許可すると、そのクラウドを利用するすべての顧客を通してしまいます。各運営元のファイルにある正確なプレフィックスで照合してください。

IP リストでは検証できないボットは何ですか?

Yandex や Baidu のようにファイルを公開せず逆引き DNS で確認する運営元のボット、Meta(レンジファイルなし。GeoIPHub はそのネットワークを ASN で照合しており、未検証)、Bytespider などです。Amazon は Amazonbot のレンジを Web ページ内にしか掲載していません。検証できないものはレート制限してください。

執筆者

GeoIPHub チーム

GeoIPHub API を支えるチーム

GeoIPHub IP インテリジェンス API とそのスキャナーを開発している GeoIPHub チームが執筆しています。下書きは AI の支援を受けて作成し、チームが編集しています。API の例は、「説明用」と明記したものを除き、本番 API に対する実際のルックアップです。

この記事をシェア
その他の記事

関連 記事