j4n
j4n.e7h.eu
e7h

2025-05-07 21:35:00

Traefik Middleware-Plugin zur »Abwehr« von AI-Crawlern

tl;dr

In einem Blog-Post von Anfang des Jahres habe ich beschrieben, wie ein Crawler eines großen AI-Anbieters auf mein Gitea eingehämmert hat. Es kam zu einer Vielzahl an sich wiederholenden Anfragen, die eine Unmenge an Traffic verursacht haben. Die Lösung damals: Vor die Gitea-Instanz habe ich einen Caddy1 gestellt, der Anhand der User-Agents Requests von AI-Crawlern herausgefiltert und datentransfersparsam abgelehnt hat.

Inzwischen betrifft das Thema »AI-Crawling« jedoch nicht mehr nur mein Gitea, sondern hat sich auf einige meiner kleinen Hobby-Projekte ausgeweitet, die auf sparsamer Hardware direkt aus Containern heraus betrieben werden. Sie werden durch Traefik2 »nach draußen« bereitgestellt. Dabei greife ich sowieso schon auf die eine oder andere teilweise selbst-geschriebene Middleware zur Absicherung und Protokollierung zurück. Was liegt also näher, als das, was ich in Caddy für Gitea konfiguriert habe, als Middleware für Traefik bereitzustellen?

Funktionsumfang

  • Bots werden anhand des User-Agent-Headers identifiziert. Damit werden derzeit nur die Bots erkannt, die legitim angeben, wer sie sind. Für meine Zwecke ist das ausreichend. Leider ist meine Erfahrung, dass auch diese Bots teilweise die robots.txt nicht so respektieren, wie ich es erwarte – und es teilweise sehr lange dauert, bis die Angaben dort eine Wirkung auf die Crawler zeigen.
  • Die User-Agents, die »ausgesperrt« werden sollen, lassen sich per Konfiguration festlegen.
  • Wird ein Bot identifiziert, wird die Verbindung mit HTTP-Status 403 abgebrochen, der Request wird in diesem Fall nicht an die dahinterliegende App geleitet.
  • Wenn ein »ausgesperrter« Bot die URL /robots.txt aufruft, wird eine Standard-Angabe ausgeliefert, die besagt, dass für alle Bots der Zugriff unterwünscht ist.

Installation und Konfiguration

Der Quellcode liegt ausnahmsweise bei Github3, so dass Traefik das Plugin automatisch dem eigenen Katalog hinzufügen konnte. So ist die Installation des Plugins denkbar einfach und kann durch das simple Hinzufügen der passenden Konfiguration erfolgen.

rtfm

Die README.md des Projekts beschreibt die einzelnen Konfigurationsschritte und gibt Beispiele.

Die wesentlichen Schritte sind:

  1. Konfiguration des Plugins im Rahmen der statischen Konfiguration
  2. Definition der Middleware mit dem Plugin und den Bot-Patterns im Rahmen der dynamischen Konfiguration
  3. Nutzung der Middleware wie gewohnt entweder im Rahmen der Container-Labels oder direkt an den jeweiligen entryPoints. Auf letztem Wege nutze ich die Middleware.

Test

Konfiguration vorgenommen? Traefik neugestartet? Dann wird es Zeit für einen Test. Dazu können wir den Testablauf aus dem oben genannten Blog-Post verwenden:

  1. Aufruf im normalen Webbrowser: Es kann wie gewohnt mit Gitea gearbeitet werden.
  2. Curl-Aufruf mit curl -H "User-Agent: GPTBot/1.2" -v https://########: Es kommt eine leere Antwort mit dem HTTP-Status-Code 403:
    1 * Request completely sent off
    2 < HTTP/2 403 
    3 < date: Wed, 07 May 2025 18:44:13 GMT
    4 < content-length: 13
    5 <
    6 Access denied
    
  3. Curl-Aufruf mit curl -H "User-Agent: GPTBot/1.2" -v https://########/robots.txt: Es wird eine allgemeine robots.txt ausgeliefert, die auf jeden Bot passen sollte:
    1 * Request completely sent off
    2 < HTTP/2 200 
    3 < date: Wed, 07 May 2025 18:52:11 GMT
    4 < content-type: text/plain; charset=utf-8
    5 < content-length: 26
    6 < 
    7 User-agent: *
    8 Disallow: /
    

Viel Spaß! Ich hoffe, es hilft dem einen oder anderen!


  1. Alle Informationen zu Caddy: https://caddyserver.com/ ↩︎

  2. Alle Informationen zu Traefik: https://traefik.io/traefik/ ↩︎

  3. Quellcode des Plugins: https://github.com/edelbluth/tm_no_ai_bots ↩︎




Zuletzt geändert: 2025-05-08 16:16:07