Zum Inhalt springen
Netzwerksicherheit

Sollten Sie KI-Crawler blockieren? Pro Bot entscheiden, per IP durchsetzen

KI-Crawler nach Aufgabe blockieren: Trainings-Bots stoppen, KI-Such-Bots behalten und gefälschten GPTBots per IP-Prüfung ein 403 liefern. Mit getestetem nginx- und Express-Code.

VonGeoIPHub-TeamVeröffentlichtLesezeit24 Min. Lesezeit
Ein Tor aus Licht mit einer Kontrolllinse, ein Knoten passiert, einer wird angehalten, als Sinnbild für die Prüfung der IP eines KI-Crawlers vor der Entscheidung, ihn zu blockieren

Ihr Access-Log zeigt GPTBot, ClaudeBot und ein paar Namen, die Sie nicht kennen. Die Leitfäden, die Sie finden, sagen alle dasselbe: Listen Sie die User-Agents in robots.txt auf und blockieren Sie dieselben Strings dann in Ihrer Serverkonfiguration.

Dieser Rat hat ein Loch. Ein User-Agent ist ein String, den der Client selbst eintippt, und „GPTBot“ einzutippen kostet nichts. Eine Blockliste aus Namen stoppt ehrliche Bots, die sich ohnehin an robots.txt gehalten hätten, und lässt jeden Scraper durch, der sich einen Namen leiht, den Sie zugelassen haben. Der Name ist eine Behauptung und die IP der Beweis, dasselbe Prinzip wie bei der Bot-Erkennung per IP allgemein.

Im Folgenden sortieren wir die Bots nach Aufgabe, zeigen, was robots.txt kann und was nicht, schicken vier echte Crawler-Adressen durch unsere API und geben Ihnen eine dreistufige Richtlinie mit getestetem nginx- und Express-Code. Ein gefälschter GPTBot bekommt ein 403. Ein echter Googlebot nie.

Drei gestapelte, durchscheinende Schichten, durch die ein Strahl dringt, abgelenkt und gebremst wird, als Sinnbild für eine dreistufige Crawler-Richtlinie aus robots.txt, verifizierter IP und Rate Limiting
Drei Stufen: höflich bitten, die IP verifizieren, den Rest drosseln.

Sollten Sie KI-Crawler blockieren? Es hängt von der Aufgabe des Bots ab

Sie sollten KI-Crawler blockieren, deren Aufgabe Sie ablehnen, und diejenigen behalten, die Ihnen Leser bringen. KI-Bots erledigen drei unterschiedliche Aufgaben, und das Blockieren kostet Sie jeweils etwas anderes.

  • Trainings-Crawler sammeln Seiten, mit denen künftige Modelle trainiert werden können. Laut OpenAI signalisiert ein Disallow für GPTBot, dass die Inhalte einer Website nicht zum Training generativer KI-Basismodelle verwendet werden sollen ("indicates a site's content should not be used in training generative AI foundation models"). Sie zu blockieren kostet in der Suche nichts.
  • KI-Such-Bots indexieren Seiten, damit ein Assistent sie zitieren kann. Laut OpenAI werden Websites, die OAI-SearchBot ausgeschlossen haben, nicht in den Suchantworten von ChatGPT angezeigt ("will not be shown in ChatGPT search answers"). Sie zu blockieren kostet Sie Zitate und die Klicks daraus.
  • Von Nutzern ausgelöste Fetcher laden eine Seite, weil eine Person einen Assistenten gebeten hat, sie zu lesen. Sie zu blockieren lässt die Anfrage dieser Person scheitern.

Ein Publisher mit Paywall hat einen klaren Grund, Training abzulehnen. Eine Marke, die von Assistenten empfohlen werden möchte, sollte die Such-Bots behalten. Die meisten Websites landen bei einer Aufteilung: Nein zum Training, Ja zur Suche, ein Tempolimit für Fetcher. Welchen OpenAI-Bot Sie blockieren sollten und was jede Wahl kostet, behandeln wir in einem eigenen Beitrag. Agenten, die im Auftrag eines Nutzers einkaufen, sind ein anderes Problem, behandelt in Betrug durch KI-Shopping-Agenten im Checkout.

Welche KI-Bots trainieren und welche Sie zitieren

Diese Tabelle sortiert die KI-Bots, die Ihnen am wahrscheinlichsten begegnen, nach Aufgabe, zusammen mit dem, was der jeweilige Betreiber zu robots.txt sagt. Jede Zelle stammt von der eigenen Seite des Betreibers, aufgerufen am 20. Oktober 2026.

BotBetreiberAufgaberobots.txt, in den Worten des Betreibers
GPTBotOpenAITrainingDisallow bedeutet, Inhalte sollen nicht zum Training verwendet werden ("should not be used in training")
OAI-SearchBotOpenAIKI-SucheAusgeschlossene Websites werden nicht in den Suchantworten von ChatGPT angezeigt
ChatGPT-UserOpenAIVon Nutzern ausgelöster Abrufrobots.txt-Regeln gelten möglicherweise nicht ("may not apply")
ClaudeBotAnthropicTrainingBefolgt robots.txt und Crawl-delay
Claude-SearchBotAnthropicKI-SucheBefolgt robots.txt und Crawl-delay
Claude-UserAnthropicVon Nutzern ausgelöster AbrufBefolgt robots.txt und Crawl-delay
Google-ExtendedGoogleToken für KI-Nutzung, kein CrawlerNur ein robots.txt-Token, ohne eigenen User-Agent
GooglebotGoogleSuche, kein zu blockierender KI-BotCommon Crawler befolgen beim automatischen Crawlen immer die robots.txt-Regeln ("always obey robots.txt rules when crawling automatically")
PerplexityBotPerplexityKI-SucheNicht angegeben; Perplexity empfiehlt, ihn zuzulassen
Perplexity-UserPerplexityVon Nutzern ausgelöster AbrufIgnoriert robots.txt-Regeln in der Regel ("generally ignores robots.txt rules")
CCBotCommon CrawlOffenes Webarchiv, das jeder herunterladen kannPrüft zuerst robots.txt; befolgt Crawl-delay
Applebot-ExtendedAppleToken für die Nutzung im KI-Training, kein CrawlerLaut Apple crawlt es keine Webseiten ("does not crawl webpages")
Meta-ExternalAgentMetaTraining und IndexierungNicht angegeben; Meta dokumentiert eine Disallow-Regel dafür
BytespiderByteDanceAuf keiner Seite dokumentiert, die wir öffnen konntenAuf keiner Seite dokumentiert, die wir öffnen konnten

Der Nachweis ist eine von der Richtlinie getrennte Frage. Ein Bot lässt sich nur verifizieren, wenn sein Betreiber veröffentlicht, von wo aus er crawlt:

BetreiberBereichsdateiPräfixe am 20. Oktober 2026Reverse DNS dokumentiertGeoIPHub verifiziert
OpenAIgptbot.json, dazu searchbot.json und chatgpt-user.json18, 39 und 234Nicht dokumentiertJa, alle drei
Anthropicbots.json, eine Datei für alle drei Bots38 (Datei vom 7. Oktober 2026)Nicht dokumentiertJa, ein Treffer heißt ClaudeBot
Googlecommon-crawlers.json und vier weitere317 bei den Common CrawlernJa: googlebot.com, google.com, googleusercontent.comJa
Perplexityperplexitybot.json und perplexity-user.json8 und 4Nicht dokumentiertJa
Common Crawlccbot.json5Ja, crawl.commoncrawl.org, nur IPv4Ja
Appleapplebot.json24Ja, applebot.apple.comJa, für Applebot
MetaNicht veröffentlichtNicht veröffentlichtNicht dokumentiertNur ASN-Abgleich, verified: false
ByteDanceWir haben keine gefundenKeine gefundenNicht dokumentiertNein

Bevor Sie eine Liste von einer anderen Website kopieren, prüfen Sie die Namen. Einige Leitfäden, die zu diesem Thema ranken, nennen noch anthropic-ai und Claude-Web, die auf Anthropics aktueller Seite nicht mehr stehen, und lassen Claude-SearchBot und Claude-User aus. Eine veraltete Liste blockiert Strings, die niemand sendet.

Was robots.txt kann und was nicht

robots.txt kann wohlerzogenen Bots mitteilen, was Sie wollen, aber es kann nichts aufhalten. RFC 9309, der Standard, der es definiert, sagt: „Diese Regeln sind keine Form der Zugriffsautorisierung.“ ("These rules are not a form of access authorization.") Ob es rechtliche Folgen hat, die Datei zu ignorieren, ist eine Frage für eine Anwältin oder einen Anwalt.

Trotzdem ist es die erste Stufe, denn die meisten namentlich bekannten Bots lesen es. Diese Datei lehnt Training ab, heißt KI-Suche willkommen und lässt die Google-Suche in Ruhe:

GeoIPHub API
# Training: no User-agent: GPTBot User-agent: ClaudeBot User-agent: CCBot User-agent: Google-Extended User-agent: Applebot-Extended User-agent: Meta-ExternalAgent User-agent: Bytespider Disallow: / # AI search: yes User-agent: OAI-SearchBot User-agent: PerplexityBot Allow: / # Anthropic honours Crawl-delay (seconds between requests) User-agent: Claude-SearchBot Allow: / Crawl-delay: 2

Vier Details entscheiden, ob diese Datei tut, was Sie denken:

  • Google-Extended und Applebot-Extended sind Tokens, keine Crawler. Googles Seite zu den Common Crawlern, aktualisiert am 15. Oktober 2026, sagt, Google-Extended habe keinen eigenen User-Agent-String für HTTP-Anfragen ("Google-Extended doesn't have a separate HTTP request user agent string") und habe keinen Einfluss auf die Aufnahme einer Website in die Google-Suche ("does not impact a site's inclusion in Google Search"). Von Google-Extended kommt nie eine Anfrage, daher kann keine IP-Regel es blockieren. Auch Apples Applebot-Seite sagt, Applebot-Extended crawle keine Webseiten ("does not crawl webpages").
  • Wer Googlebot blockiert, um KI-Nutzung zu verhindern, verliert die Suche. Das gilt auch für eine Gruppe User-agent: * mit Disallow: /.
  • Von Nutzern ausgelöste Fetcher ignorieren die Datei möglicherweise. OpenAI sagt über ChatGPT-User, dass robots.txt-Regeln möglicherweise nicht gelten ("robots.txt rules may not apply"). Perplexity sagt, Perplexity-User ignoriere robots.txt-Regeln in der Regel ("generally ignores robots.txt rules").
  • Änderungen wirken nicht sofort. OpenAI sagt, es könne nach einer Aktualisierung der robots.txt etwa 24 Stunden dauern, bis sich die Systeme anpassen ("it can take ~24 hours from a site's robots.txt update for our systems to adjust").

Neuere Dateien wie llms.txt und ai.txt sind Vorschläge. Wie robots.txt bitten sie, statt durchzusetzen.

Der umgekehrte Fehler ist, Such-Crawler auf eine „KI-Bot“-Blockliste zu setzen. Contentstacks Leitfaden zum Blockieren von KI-Crawlern zeigt eine Edge-Funktion, deren Bot-Liste googlebot und bingbot neben gptbot und claudebot enthält und allen mit "Forbidden: AI crawlers are not allowed." antwortet. Unverändert übernommen nimmt diese Regel eine Website aus der Google- und Bing-Suche. Wer sich als Googlebot ausgibt, ist ein gefälschter Googlebot, ein anderes Problem mit einer anderen Lösung.

Echter Crawler oder Fälschung: So funktioniert die Verifizierung

Einen echten Crawler unterscheiden Sie von einer Fälschung, indem Sie die verbindende IP mit dem abgleichen, was der genannte Betreiber veröffentlicht. Welche von drei Methoden funktioniert, hängt vom Betreiber ab.

  • Bereichsdateien. OpenAI, Anthropic, Perplexity, Common Crawl, Apple und Google veröffentlichen JSON-Listen ihrer Präfixe. Für OpenAI und Anthropic ist das die einzige Methode, weil ihre Adressen kein Reverse DNS haben.
  • Forward-Confirmed Reverse DNS. Googles Leitfaden zur Verifizierung lässt Sie die IP zu einem Namen auflösen, die Domain prüfen, den Namen dann zurückauflösen und bestätigen, dass er dieselbe IP liefert. Apple und Common Crawl dokumentieren dieselbe Methode.
  • Signierte Anfragen (Web Bot Auth). Ein Bot signiert jede Anfrage mit einem veröffentlichten Schlüssel. Das ist noch ein Entwurf, behandelt im Abschnitt zu Edge-Optionen weiter unten.

Unser Leitfaden, wie Sie einen KI-Crawler per IP verifizieren, behandelt alle drei im Detail. Wir haben am 20. Oktober 2026 um 04:37 UTC vier Crawler-Adressen ohne Schlüssel abgefragt. Dies ist die ClaudeBot-Adresse, gekürzt, mit beibehaltener Verschachtelung und unveränderten Werten:

GeoIPHub API
{ "ip": "216.73.216.10", "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"] } }

Die anderen drei aus demselben Durchlauf:

IPcrawler.name / Betreiber / KategorieVerifiziert, MethodeScore, Aktiondetection_methodsASN
132.196.86.1GPTBot / OpenAI / aitrue, ip_range_list0, allowdatacenter_ip, no_ptr_datacenter, verified_crawler8075 MICROSOFT-CORP-MSN-AS-BLOCK
66.249.66.1Googlebot / Google / search_enginetrue, ip_range_list0, allowdatacenter_ip, verified_crawler15169 GOOGLE
107.178.192.1GoogleUserTriggeredFetcher / Google / fetchertrue, ip_range_list0, allowdatacenter_ip, rdns_hosting, verified_crawler396982 GOOGLE-CLOUD-PLATFORM

Die GPTBot-Adresse ist der erste Host von 132.196.86.0/24, dem ersten Präfix in OpenAIs gptbot.json. Dann haben wir um 04:45 UTC das DNS nach Namen gefragt:

GeoIPHub API
$ dig -x 216.73.216.10 +short # ClaudeBot: NXDOMAIN, no name $ dig -x 132.196.86.1 +short # GPTBot: NXDOMAIN, no name $ dig -x 66.249.66.1 +short crawl-66-249-66-1.googlebot.com. $ dig crawl-66-249-66-1.googlebot.com +short 66.249.66.1

Das ist die Erkenntnis, die den meisten Leitfäden fehlt. ClaudeBot und GPTBot haben keinen PTR-Eintrag, daher kann Reverse DNS sie nicht verifizieren. Die Bereichsdatei ist die einzige Prüfung. no_ptr_datacenter löst bei beiden aus, doch der Score bleibt bei 0, weil verified_crawler ein entlastendes Signal ist. Bei diesen Betreibern ist ein fehlender PTR normal. Googlebot besteht beide Wege: Sein Name löst zurück auf dieselbe Adresse auf.

Zwei Einschränkungen gelten. Das Feld category sagt „ai“ für trainierende und nicht trainierende KI-Bots gleichermaßen, daher sollte Richtliniencode auf crawler.name basieren. Und die Abfrage sieht nur eine IP, nie den User-Agent, daher markiert die API nie eine Fälschung. Der Vergleich des behaupteten mit dem nachgewiesenen Namen findet in Ihrem Code statt. Dieselbe Prüfung können Sie von Hand in unserem IP-Lookup-Tool durchführen.

Eine dreistufige Richtlinie: bitten, verifizieren, drosseln

Eine Richtlinie, die standhält, hat drei Stufen: mit robots.txt bitten, jede Bot-Behauptung anhand ihrer IP verifizieren und alles Übrige per Rate Limit drosseln. Blockieren Sie nach Aufgabe, setzen Sie per IP durch und setzen Sie Googlebot nie auf eine KI-Blockliste.

Stufe 1: bitten. robots.txt enthält Ihre Entscheidung pro Bot, dazu Crawl-delay für Betreiber, die es befolgen.

Stufe 2: verifizieren. Wenn ein User-Agent einen Bot nennt, fragen Sie die verbindende IP ab und vergleichen die Namen. Gehört die IP nicht zu diesem Bot, erhält die Anfrage ein 403. Gehört sie dazu, wenden Sie Ihre Entscheidung aus Stufe 1 an, sodass ein verifizierter GPTBot, der Ihr Disallow ignoriert, trotzdem abgewiesen wird.

Stufe 3: drosseln. Alles andere erhält ein Rate Limit: Anfragen, die keinen Bot behaupten, Bots, die sich nicht verifizieren lassen, und Fetcher, die für eine Person handeln.

FallBeispielAktion
Verifizierter Bot, den Sie zulassenGooglebot von 66.249.66.1Normal ausliefern, kein Rate Limit
Verifizierter Bot, den Sie abgelehnt haben, der aber weiter kommtGPTBot von 132.196.86.1 bei per Disallow gesperrtem GPTBot403
Unverifizierte Behauptung: UA nennt einen Bot, IP passt nichtGPTBot-UA von 216.73.216.10, einer Anthropic-Adresse403, oder eine Challenge, wenn Ihnen das lieber ist
Bot, der sich nicht verifizieren lässtBytespider, Meta-ExternalAgentRate Limit; robots.txt ist Ihr einziger Hebel
Keine Bot-BehauptungBrowser und Scraper, die sich als Browser ausgebenRate Limit pro IP

Die dritte Zeile ist die lehrreichste. 216.73.216.10 ist ein verifizierter Crawler, nur nicht der, den die Anfrage nennt. Eine Prüfung, die nur fragt „ist das ein verifizierter Crawler?“, würde ihn also hereinlassen. Vergleichen Sie die Namen. Ebenso ist 107.178.192.1 ein verifizierter Google-Fetcher, aber eine Anfrage von dort, die sich als Googlebot ausgibt, ist nicht Googlebot.

Protokollieren Sie jedes Scheitern in Stufe 2. Eine Adresse außerhalb der veröffentlichten Bereiche bedeutet meist eine Fälschung, kann aber auch ein Präfix sein, das der Betreiber gerade erst hinzugefügt hat. Unsere Bereichsdateien werden täglich neu abgerufen und die Abfragedatenbank täglich neu aufgebaut, daher kann es bis zu etwa zwei Tage dauern, bis ein neues Präfix verifiziert wird.

Durchsetzung in nginx und Express, mit einem Test gegen einen gefälschten GPTBot

Die Durchsetzung besteht aus einem kleinen Express-Dienst, der die Abfrage durchführt, und einer nginx-Konfiguration, die ihn zu jeder Anfrage befragt, die behauptet, ein Bot zu sein. Ein Standard-nginx kann keine HTTP-API inline aufrufen, daher schickt das Modul auth_request eine Unteranfrage an den Verifizierer, und nginx speichert die Antwort im Cache. Ohne nginx schützt dieselbe Datei eine Express-App auch allein.

Der Verifizierer gleicht den User-Agent mit aktuellen Bot-Tokens ab, fragt die IP mit GET https://api.geoiphub.com/v1/lookup/{ip} und dem Header x-api-key ab, speichert das Ergebnis eine Stunde lang im Cache und vergleicht threat.crawler.name mit dem behaupteten Namen. Er braucht eine Namenszuordnung, weil die API einige Namen ohne Bindestrich schreibt: OAISearchBot, ChatGPTUser, PerplexityUser. Siehe die Crawler-Felder in der API-Dokumentation.

GeoIPHub API
// bot-gate.js: tier 2 (verify the IP behind a bot claim) and tier 3 (rate-limit the rest). // Tested with Node 24.20.0, Express 5.3.0 and express-rate-limit 8.7.1. const express = require('express'); const { rateLimit } = require('express-rate-limit'); const { BlockList, isIP } = require('node:net'); const API_KEY = process.env.GEOIPHUB_KEY; // production: always set a key const CACHE_MS = 60 * 60 * 1000; // one hour per IP const cache = new Map(); // ip: { at, crawler } // Your policy: User-Agent tokens you refuse even when verified. Everything verified and not listed passes. const BLOCKED = new Set((process.env.BLOCKED_BOTS || 'GPTBot,ClaudeBot,CCBot').split(',')); // Maps each User-Agent token to the crawler.name our API returns for that operator's range file. // Anthropic publishes one file for all three of its bots, so a match comes back as ClaudeBot. const EXPECTED = { 'GPTBot': 'GPTBot', 'OAI-SearchBot': 'OAISearchBot', 'ChatGPT-User': 'ChatGPTUser', 'ClaudeBot': 'ClaudeBot', 'Claude-User': 'ClaudeBot', 'Claude-SearchBot': 'ClaudeBot', 'PerplexityBot': 'PerplexityBot', 'Perplexity-User': 'PerplexityUser', 'CCBot': 'CCBot', 'Googlebot': 'Googlebot', 'bingbot': 'Bingbot', 'Applebot': 'Applebot', }; // Longest tokens first, so "Claude-SearchBot" is not read as a shorter token. const TOKENS = Object.keys(EXPECTED).sort((a, b) => b.length - a.length); // A real crawler never connects from a private or loopback address. const privateNets = new BlockList(); for (const [net, bits] of [['10.0.0.0', 8], ['172.16.0.0', 12], ['192.168.0.0', 16], ['127.0.0.0', 8], ['100.64.0.0', 10]]) privateNets.addSubnet(net, bits, 'ipv4'); privateNets.addSubnet('fc00::', 7, 'ipv6'); privateNets.addAddress('::1', 'ipv6'); function claimedBot(ua = '') { const lower = ua.toLowerCase(); return TOKENS.find((t) => lower.includes(t.toLowerCase())) || null; } async function lookupCrawler(ip) { const hit = cache.get(ip); if (hit && Date.now() - hit.at < CACHE_MS) return hit.crawler; const res = await fetch(`https://api.geoiphub.com/v1/lookup/${ip}`, { headers: API_KEY ? { 'x-api-key': API_KEY } : {}, // keyless only for a local test signal: AbortSignal.timeout(1500), }); if (!res.ok) throw new Error(`lookup ${res.status}`); const data = await res.json(); cache.set(ip, { at: Date.now(), crawler: data.threat.crawler }); return data.threat.crawler; } async function verifyBot(req, res, next) { const claim = claimedBot(req.get('user-agent')); if (!claim) return next(); // no bot claim: tier 3 handles it const ip = req.ip.replace(/^::ffff:/, ''); const family = isIP(ip) === 6 ? 'ipv6' : 'ipv4'; if (privateNets.check(ip, family)) { return res.status(403).send(`unverified ${claim} claim\n`); } let crawler; try { crawler = await lookupCrawler(ip); } catch (err) { // Fail mode: never fail open to "verified". Mark it and let the rate limiter decide. req.botUnverified = true; return next(); } // The API never flags a spoof: it sees only the IP, not the User-Agent. // The spoof check is this comparison, in your code. const verified = crawler.verified === true && crawler.name === EXPECTED[claim]; if (!verified) return res.status(403).send(`unverified ${claim} claim\n`); if (BLOCKED.has(claim)) return res.status(403).send(`${claim} is blocked by policy\n`); req.verifiedBot = crawler.name; return next(); } // Tier 3: everyone without a verified bot name, keyed per IPv4 address or per IPv6 /64. // nginx auth_request understands only 2xx, 401 and 403, so the verifier endpoint answers 403. const limiter = rateLimit({ windowMs: 60 * 1000, limit: 120, ipv6Subnet: 64, skip: (req) => Boolean(req.verifiedBot), handler: (req, res) => res.set('Cache-Control', 'no-store') .status(req.path === '/_verify_bot' ? 403 : 429).send('rate limited\n'), }); const app = express(); app.set('trust proxy', 'loopback'); // only nginx on this host may set X-Forwarded-For // Endpoint for nginx auth_request: 204 lets the request through, 403 stops it. // After a failed lookup, no-store keeps nginx from caching the 204, so the limiter sees every request. app.get('/_verify_bot', verifyBot, limiter, (req, res) => { if (req.botUnverified) res.set('Cache-Control', 'no-store'); res.sendStatus(204); }); // Standalone use without nginx: protect every route. app.use(verifyBot, limiter); app.get('/', (req, res) => res.send('ok\n')); app.listen(3000, '127.0.0.1');

Drei Entscheidungen sind bewusst getroffen. Schlägt die Abfrage fehl oder dauert sie länger als 1,5 Sekunden, wird die Anfrage nie als verifiziert behandelt; sie fällt an den Rate Limiter durch. Hinter nginx wird diese Antwort mit no-store gesendet, damit nginx sie nicht cacht und der Verifizierer jede Anfrage gegen dasselbe Limit zählt. Die Richtlinienliste enthält User-Agent-Tokens, sodass die Ablehnung von ClaudeBot nicht Claude-SearchBot ablehnt, obwohl beide aus der Abfrage als ClaudeBot zurückkommen. trust proxy gilt nur für Loopback, denn sonst könnte ein Client seinen eigenen X-Forwarded-For senden und die Adresse bestimmen, die Sie prüfen. Und es werden nur Bot-Behauptungen abgefragt, sodass das Volumen dem Bot-Traffic folgt, nicht den Seitenaufrufen. Der kostenlose Tarif umfasst mit Schlüssel 1.500 Abfragen pro Tag, alle Felder inklusive.

Die nginx-Seite ordnet den User-Agent einem behaupteten Bot zu, überspringt die Unteranfrage, wenn keine Behauptung vorliegt, und cacht das 204 oder 403 des Verifizierers pro Adresse und Bot für eine Stunde, außer bei Antworten, die mit no-store markiert sind:

GeoIPHub API
# Goes in the http {} block. Tested with nginx 1.30.6 built with --with-http_auth_request_module. # Which bot does the User-Agent claim? Empty means no claim. map $http_user_agent $claimed_bot { default ""; "~*(GPTBot|OAI-SearchBot|ChatGPT-User|ClaudeBot|Claude-User|Claude-SearchBot|PerplexityBot|Perplexity-User|CCBot|Googlebot|bingbot|Applebot)" $1; } # Tier 3 key: rate-limit requests with no bot claim. Claims go to tier 2 instead. map $claimed_bot $limit_key { "" $binary_remote_addr; default ""; } limit_req_zone $limit_key zone=perip:10m rate=10r/s; # Cache the verifier's answer per address and claimed bot for one hour. proxy_cache_path /var/cache/nginx/botcheck keys_zone=botcheck:1m max_size=10m inactive=1h; server { listen 8080; location / { limit_req zone=perip burst=20 nodelay; limit_req_status 429; auth_request /_verify_bot; proxy_pass http://127.0.0.1:8000; # your app } location = /_verify_bot { internal; if ($claimed_bot = "") { return 204; } # no claim: no lookup proxy_pass http://127.0.0.1:3000; # bot-gate.js proxy_pass_request_body off; proxy_set_header Content-Length ""; proxy_set_header X-Forwarded-For $remote_addr; proxy_cache botcheck; proxy_cache_key $remote_addr$claimed_bot; proxy_cache_valid 204 403 1h; } }

nginx -t lief mit dieser Konfiguration fehlerfrei durch, und wir haben sie am 20. Oktober 2026 um 05:05 UTC vor der Express-Datei betrieben. Zuerst der Test mit dem gefälschten GPTBot, über nginx, von derselben Maschine:

GeoIPHub API
$ curl -s -o /dev/null -w "%{http_code}\n" \ -A "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; GPTBot/1.4; +https://openai.com/gptbot" \ http://localhost:8080/ 403 $ curl -s -o /dev/null -w "%{http_code}\n" \ -A "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36" \ http://localhost:8080/ 200

Dieser GPTBot-String ist das aktuelle Beispiel auf OpenAIs Bots-Seite. Von Ihrer eigenen Maschine kommt die Anfrage von 127.0.0.1, das kein Crawler verwendet, daher weist der Verifizierer sie vor jeder Abfrage ab. Um die Abfrage zu beobachten, rufen Sie die Express-Datei direkt mit der Adresse auf, die nginx weiterleiten würde:

GeoIPHub API
$ GPT='Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; GPTBot/1.4; +https://openai.com/gptbot' $ GB='Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)' $ curl -s -A "$GPT" -H "X-Forwarded-For: 216.73.216.10" http://127.0.0.1:3000/ unverified GPTBot claim $ curl -s -A "$GPT" -H "X-Forwarded-For: 132.196.86.1" http://127.0.0.1:3000/ GPTBot is blocked by policy $ curl -s -A "$GB" -H "X-Forwarded-For: 107.178.192.1" http://127.0.0.1:3000/ unverified Googlebot claim $ curl -s -A "$GB" -H "X-Forwarded-For: 66.249.66.1" http://127.0.0.1:3000/ ok

Verfolgen Sie die erste Zeile von Anfang bis Ende. Der User-Agent behauptet GPTBot. Der Verifizierer fragt 216.73.216.10 ab, und die API antwortet mit einem verifizierten Crawler namens ClaudeBot. ClaudeBot ist nicht GPTBot, also erhält die Anfrage ein 403. Die echte GPTBot-Adresse, 132.196.86.1, besteht die Verifizierung und wird nur abgewiesen, weil diese Richtlinie Training ablehnt; mit BLOCKED_BOTS=CCBot erhielt sie ein 200. Eine Claude-SearchBot-Behauptung von 216.73.216.10 erhielt ein 200, weil diese Richtlinie das Token ClaudeBot ablehnt, nicht Anthropics Such-Bot. Eine reine Testkopie der nginx-Konfiguration, die dieselben vier Adressen weiterleitete, lieferte 403, 403, 403 und 200. Bei absichtlich unerreichbarer API erhielten 130 bingbot-Behauptungen von einer Adresse über nginx 120 Antworten mit Status 200 und danach 403: Ein Ausfall drosselt Bot-Behauptungen, statt sie durchzuwinken.

Wenn Sie ohne Schlüssel testen, halten Sie es kurz. Anonyme Abfragen sind pro Minute begrenzt, und der 30. Aufruf innerhalb eines 60-Sekunden-Fensters ist bereits ein 429, das Ihre IP für zwei Stunden aussperrt.

Drosseln Sie, was Sie nicht verifizieren können, statt es zu blockieren

Rate Limiting ist das richtige Werkzeug für Traffic, den Sie in keine Richtung beweisen können: nicht verifizierbare Bots, von Nutzern ausgelöste Fetcher und alles, was keinen Bot behauptet. Um zu sehen, welche Bots Bereichsdateien veröffentlichen und welche nicht, sehen Sie sich unsere Liste Datei für Datei an. Ein Limit verhindert, dass ein Scraper Ihre Website an einem Nachmittag kopiert, ohne die Menschen hinter einem Fetcher auszusperren.

Beide Snippets tun das bereits. nginx' limit_req basiert bei Anfragen ohne Bot-Behauptung auf der Client-Adresse, mit 10 pro Sekunde und einem Burst von 20. In unserem Test lieferten 40 direkt aufeinanderfolgende Anfragen 25 Erfolge und 15 Antworten mit Status 429. Passen Sie die Zahlen an und nehmen Sie statische Assets aus, wenn ein Seitenaufruf Dutzende davon lädt. Der Express-Limiter fasst IPv6-Clients nach ihrem /64 zusammen, weil ein einzelner Teilnehmer meist ein ganzes /64 kontrolliert; unter IPv6 per /64-Präfix drosseln erfahren Sie, wann Sie auf /56 oder /48 erweitern sollten.

Crawl-delay ist die höfliche Variante für Bots, die es befolgen. Anthropics Hilfeseite zum Crawler sagt, man unterstütze die nicht standardisierte Crawl-delay-Erweiterung für robots.txt ("we support the non-standard Crawl-delay extension to robots.txt"), und die FAQ von Common Crawl sagt, man befolge den Parameter Crawl-delay ("We obey the Crawl-delay parameter"). Andere tun das nicht. Googles robots.txt-Spezifikation sagt, Felder wie crawl-delay würden nicht unterstützt ("such as crawl-delay aren't supported"), und Apple sagt, Applebot befolge crawl-delay nicht ("Applebot does not follow crawl-delay"). Die Seiten von OpenAI und Perplexity erwähnen es nicht.

Stufe 2 erfasst nur Anfragen, die einen Bot nennen. Um KI-Scraper zu blockieren, die nie behaupten, Bots zu sein, ergänzen Sie Stufe 3 um Verhalten: Anfrageraten, Pfade und das Netzwerk, aus dem die Anfrage kommt. Unser Beitrag dazu, wie Sie Web-Scraping in Ihren Logs erkennen, behandelt diese Signale.

Edge-Optionen: Cloudflares KI-Blockierung und Pay per Crawl

Hinter Cloudflare können Sie KI-Crawler per Einstellung statt per Code blockieren oder ihnen pro Anfrage Geld berechnen. Beides erspart Ihnen nicht, zu wissen, mit welchen Bots Sie es zu tun haben.

Cloudflare kündigte am 1. Juli 2025 in einem Beitrag, zuletzt geändert am 15. Juli 2026, an, die Standardeinstellung so zu ändern, dass KI-Crawler blockiert werden, sofern sie die Urheber nicht für ihre Inhalte bezahlen ("changing the default to block AI crawlers unless they pay creators for their content."). Wenn Sie zusätzlich eigene Regeln betreiben, prüfen Sie, was Cloudflare in Ihrer Zone bereits blockiert, damit beide Ebenen übereinstimmen.

Bei Pay per Crawl erhält ein Crawler, der eine bepreiste Seite anfordert, eine Antwort 402 Payment Required zusammen mit einem Header crawler-price ("a 402 Payment Required response, accompanied by a crawler-price header") und kann es mit Zahlungsabsicht erneut versuchen. Crawler signieren Anfragen nach den Web-Bot-Auth-Vorschlägen, damit niemand im Namen eines anderen bezahlen kann. Laut Cloudflare befindet sich Pay per Crawl derzeit in einer privaten Beta ("is currently in private beta").

Web Bot Auth ist noch kein Standard. Am 20. Oktober 2026 hatte die IETF-Arbeitsgruppe webbotauth ein Dokument der Arbeitsgruppe, draft-ietf-webbotauth-httpsig-protocol-00 vom 1. September 2026, und keinen RFC; der Meilenstein ihrer Charta für eine Standards-Track-Spezifikation im April 2026 ist verstrichen. Ein individueller Entwurf, draft-illyes-webbotauth-jafar, schlägt ein gemeinsames JSON-Format für Crawler-Bereichsdateien vor. Bis diese verabschiedet sind, können Sie IP-Bereiche und Reverse DNS prüfen.

Messen Sie, was die Richtlinie verändert hat

Messen Sie die Richtlinie, indem Sie bei jeder Bot-Anfrage das Verifizierungsergebnis protokollieren und dann vorher und nachher vergleichen.

  • Anteil nach verifiziertem Bot. Protokollieren Sie crawler.name und crawler.verified neben jeder Anfrage, die einen Bot behauptet hat. Der Anteil gescheiterter Behauptungen ist Ihre Fälschungsrate. Der Anteil nach Namen zeigt, welche Betreiber Sie tatsächlich crawlen.
  • KI-Verweise. Zählen Sie Besuche, die von chatgpt.com, perplexity.ai, claude.ai, copilot.microsoft.com und gemini.google.com verwiesen wurden. Betrachten Sie diese Zahl als Untergrenze, da ein Teil des Assistenten-Traffics ohne Referrer ankommt.
  • Crawl-Volumen. Vergleichen Sie die Anfragen pro Tag von jedem Bot vor und nach einer Änderung. Der Bericht „Crawling-Statistiken“ der Search Console deckt nur Googles Crawler ab, die übrigen Bots müssen Sie aus Ihren eigenen Logs ermitteln.

Wenn die Zitate zurückgehen, nachdem Sie einen KI-Such-Bot blockiert haben, haben Sie Ihre Antwort zu diesem Bot.

Wann Sie Ihre Richtlinie für KI-Crawler überprüfen sollten

Überprüfen Sie Ihre Richtlinie für KI-Crawler immer dann, wenn ein Betreiber einen Bot hinzufügt, eine Bereichsdatei ändert oder ein Token abschafft, und mindestens einmal pro Quartal. OpenAIs Bots-Seite listet inzwischen OAI-AdsBot mit einer eigenen adsbot.json. Unsere Crawler-Feeds enthalten diese Datei nicht, und der obige Code nennt sie nicht, daher fällt eine OAI-AdsBot-Behauptung in Stufe 3, bis Sie entscheiden.

Seien Sie sich im Klaren darüber, was dieses Setup nicht kann:

  • Es weist nur Bots nach, die Bereiche veröffentlichen. Bytespider und Meta-ExternalAgent lassen sich nicht verifizieren, und eine Fälschung von beiden sieht genauso aus wie das Original.
  • Neue Präfixe hinken hinterher. Ein heute hinzugefügtes Präfix kann bis zu etwa zwei Tage bis zur Verifizierung brauchen, sodass ein echter Bot kurzzeitig an Stufe 2 scheitern kann.
  • IP-Sperren können nach hinten losgehen. Anthropic warnt, dass das Blockieren seiner IPs möglicherweise nicht korrekt funktioniert oder einen Opt-out nicht dauerhaft garantiert, da es Anthropic daran hindert, Ihre robots.txt zu lesen ("may not work correctly or persistently guarantee an opt-out, as doing so impedes our ability to read your robots.txt file."). Behalten Sie das Disallow in robots.txt bei, auch wenn Stufe 2 es durchsetzt.
  • Die Abfrage sieht den User-Agent nicht. Die Prüfung auf Fälschung ist der Namensvergleich in Ihrem Code.
  • Stufe 2 übersieht Scraper, die nie einen Namen behaupten. Die sind Aufgabe von Stufe 3.

Beginnen Sie mit Ihren eigenen Logs. Nehmen Sie eine Adresse, die diese Woche behauptet hat, GPTBot oder ClaudeBot zu sein, führen Sie eine Abfrage durch und vergleichen Sie crawler.name mit dem behaupteten Namen.

Häufig gestellte Fragen

Sollte ich KI-Crawler blockieren?

Das hängt von der Aufgabe des Bots ab. Blockieren Sie Trainings-Crawler wie GPTBot und ClaudeBot, wenn Sie nicht wollen, dass Ihre Inhalte Modelle trainieren. Lassen Sie KI-Such-Bots wie OAI-SearchBot zu, wenn Sie zitiert werden möchten. Drosseln Sie von Nutzern ausgelöste Fetcher per Rate Limit, statt sich auf robots.txt zu verlassen.

Hält robots.txt KI-Crawler auf?

Nur diejenigen, die sich freiwillig daran halten. RFC 9309 sagt, seine Regeln seien keine Form der Zugriffsautorisierung ("are not a form of access authorization"). Ein Scraper mit einem GPTBot-User-Agent ignoriert die Datei, daher muss die Durchsetzung die IP prüfen, von der die Anfrage kommt.

Schadet das Blockieren von KI-Crawlern der SEO?

Das Blockieren des Tokens Google-Extended wirkt sich nicht auf die Google-Suche aus; laut Google hat es keinen Einfluss ("does not impact") auf die Aufnahme einer Website in die Suche. Wer Googlebot blockiert, um KI-Nutzung zu verhindern, fliegt aus der Suche. Wer KI-Such-Bots wie OAI-SearchBot blockiert, bleibt den Suchantworten des jeweiligen Assistenten fern.

Kann ich Google-Extended per IP blockieren?

Nein. Google-Extended ist ein robots.txt-Token ohne eigenen User-Agent. Googles bestehende Crawler übernehmen das Abrufen, daher ist eine robots.txt-Regel für das Token die einzige Steuerungsmöglichkeit. Applebot-Extended funktioniert genauso: Laut Apple crawlt es keine Webseiten.

Woran erkenne ich, dass eine Anfrage, die sich als GPTBot ausgibt, echt ist?

Prüfen Sie, ob die verbindende IP in OpenAIs veröffentlichter gptbot.json steht. Reverse DNS hilft nicht: Die von uns geprüften GPTBot- und ClaudeBot-Adressen haben keinen PTR-Eintrag. Eine Abfrage liefert threat.crawler.verified und den Bot-Namen, und Ihr Code vergleicht diesen Namen mit dem User-Agent.

Lässt sich jeder KI-Crawler per IP verifizieren?

Nein. Wir haben von ByteDance keine Bereichsdatei für Bytespider gefunden, und Meta veröffentlicht keine für Meta-ExternalAgent, daher lässt sich keiner der beiden per IP verifizieren. Drosseln Sie sie per Rate Limit, statt dem User-Agent zu vertrauen.

Verfasst von

GeoIPHub-Team

Das Team hinter der GeoIPHub-API

Verfasst vom GeoIPHub-Team, den Menschen, die die GeoIPHub-API für IP-Intelligence und ihren Scanner entwickeln. Entwürfe entstehen mit KI-Unterstützung und werden vom Team redigiert; API-Beispiele sind echte Abfragen gegen die Live-API, sofern nicht als illustrativ gekennzeichnet.

Artikel teilen
Weitere Artikel

Verwandte Beiträge