Leitfaden

IP-DB Shield einrichten: ein Besuchertor auf dem eigenen Server

Eine PHP-Installation in drei Minuten, Monitor-Modus, Entscheidungsreihenfolge, die Quellen feed und api, das private Panel sowie SEO und Datenschutz.

IP-DB-Team 7 Min. Lesezeit 8× gelesen 0 Kommentare

Sie kennen den Bildschirm von den großen CDNs: eine Sekunde „wird geprüft", dann sind Sie drin. Dieser Bildschirm hat zwei Aufgaben — eine bekannte schlechte Adresse gar nicht hereinlassen und eine zweifelhafte über eine Hürde schicken. Dass er funktioniert, liegt aber nicht am Bildschirm, sondern an der Liste dahinter.

IP-DB Shield betreibt dasselbe Tor auf Ihrem Server, mit Ihrem Namen darauf. Kein DNS-Wechsel, kein Verkehr über Dritte, kein Konto zum Hochstufen: Die Entscheidung fällt in Ihrem eigenen PHP-Prozess anhand der Blocklisten-Kopie auf Ihrer Platte. Eine Datei, keine Abhängigkeiten, PHP 7.0 oder neuer, MIT-Lizenz.

Was im Paket liegt

  • ipdb-shield.php — das Tor selbst; eine Datei, keine Abhängigkeiten.
  • config.php — die einzige Datei, die Sie bearbeiten müssen.
  • theme/screen.html und theme/strings.json — die drei Besucherbildschirme und ihre Texte (Türkisch, Englisch, Deutsch, Spanisch). Frei umgestaltbar.
  • static/ipdb-shield.js — die Variante für Seiten ohne PHP.
  • examples/ — Snippets für .htaccess, nginx, cron und WordPress.

Installation in drei Minuten

Laden Sie das Kit von der Shield-Seite und holen Sie den API-Schlüssel im Dashboard.

# 1) Ordner hochladen, z. B. /home/sie/public_html/ipdb-shield/ # 2) Secret erzeugen und in config.php eintragen php ipdb-shield.php --secret # 3) Liste einmal laden und Installation prüfen php ipdb-shield.php --refresh php ipdb-shield.php --status

In config.php sind nur zwei Werte Pflicht: api_key und das erzeugte secret. Dann schalten Sie das Tor scharf — entweder als erste Zeile, die Ihre Seite ausführt:

require __DIR__ . '/ipdb-shield/ipdb-shield.php';

…oder ohne eine Zeile Code anzufassen, über .htaccess:

php_value auto_prepend_file "/home/sie/public_html/ipdb-shield/ipdb-shield.php"

Zuletzt den Cron-Eintrag aus examples/cron.txt setzen, damit die Liste abseits des kritischen Pfads aktualisiert wird.

Der erste Tag: niemanden blockieren

Das Kit kommt mit 'mode' => 'monitor', und das sollte einen Tag so bleiben. Im Monitor-Modus wird niemand gestoppt, aber jede Entscheidung protokolliert: Unter der privaten Panel-Adresse, die --status ausgibt, sehen Sie, wer geblockt worden wäre, aus welchem Grund und wie oft. Einen Tag echten Verkehr zu lesen und dann auf 'protect' zu schalten, ist die deutlich bessere Entscheidung, als Schwellen zu raten.

Wie eine Anfrage entschieden wird

Die Reihenfolge ist fest, der erste Treffer gewinnt:

#FallErgebnis
1Keine Seite (Assets, XHR, Webhooks, wp-cron)Unberührt
2Eigene allow_ipsDurch
3Eigene deny_ipsAbgewiesen
4Fallen-Pfad (/.env, /.git/…)Abgewiesen, auf Wunsch gemeldet
5Verifizierter Suchcrawler (Reverse DNS bestätigt)Durch
6Auf der Liste oder Score über block_scoreGebrandete 403-Seite
7Score über challenge_score oder AnfrageflutDrücken und halten + Proof of Work, optional Captcha
8Alle anderenEine Sekunde automatische Prüfung, dann ein signiertes Cookie

POST-Anfragen werden nie unterbrochen — ein Formular übersteht kein Interstitial — aber eine abgewiesene Adresse wird abgewiesen, egal mit welcher Methode.

Woher die Liste kommt: feed, api, both

feed (Standard): eine lokale Kopie der Blockliste, alle paar Stunden aktualisiert. Während ein Besucher wartet, verlässt nichts Ihren Server, pro Besuch wird kein Kontingent verbraucht, und die Suche ist eine Binärsuche über einen sortierten Index: konstanter Speicher, Mikrosekunden.

api: eine /check-Abfrage pro Adresse, die Sie nicht kürzlich gesehen haben, für cache_ttl zwischengespeichert. Reicher (Score, Land, Netz) und stets aktuell, verbraucht aber Ihr Tageskontingent und kostet beim ersten Auftreten einen Roundtrip.

both: zuerst die Liste, die API nur für Adressen, die darin fehlen, bis zu api_daily_budget Abfragen am Tag — danach nur noch die Liste.

Kommandozeile und privates Panel

php ipdb-shield.php --refresh # Liste laden/aktualisieren php ipdb-shield.php --status # Zustand, Zähler, Panel-URL php ipdb-shield.php --test 1.2.3.4 # was würde mit dieser Adresse passieren? php ipdb-shield.php --verify # lokale Liste komplett zurücklesen php ipdb-shield.php --secret # neues Secret

Die Panel-URL wird aus Ihrem Secret abgeleitet; behandeln Sie sie wie ein Passwort — zum Rotieren genügt ein neues Secret. Das Panel zeigt Modus, Alter und Größe der lokalen Liste, die Zähler von heute, die letzten sieben Tage und die jüngsten Entscheidungen samt Grund.

SEO und Barrierefreiheit

Ein Besuchertor kann eine Seite aus den Suchergebnissen werfen, deshalb zählen hier die Details. Suchmaschinen kommen nur durch, wenn der Reverse-DNS-Name auf die Domain des Betreibers endet und wieder dieselbe Adresse liefert. Der Prüfbildschirm antwortet mit 503 und Retry-After und trägt noindex — ein Crawler erkennt ein temporäres Tor und indexiert keine 200-Seite mit Ihrem Titel. Die Bildschirme sind per Tastatur bedienbar, melden sich bei Screenreadern, respektieren prefers-reduced-motion und das dunkle Thema, funktionieren in Telefonbreite — und einem Besucher ohne JavaScript sagen sie das in seiner Sprache, statt ihn vor einem Spinner stehen zu lassen.

Datenschutz und Sicherheit

  • Im Modus feed verlässt nichts über einen Besucher Ihren Server. In api und both wird allein die IP-Adresse gesendet: keine URL, kein User-Agent, kein Cookie, kein Seiteninhalt. Die Bildschirme nennen den Fall in der Sprache des Besuchers.
  • Fälschen kann ein Besucher nur Header, deshalb wird standardmäßig nur REMOTE_ADDR vertraut. Ein Forwarded-Header wird gelesen, wenn die Verbindung von einem Proxy aus trusted_proxies kommt — sonst könnte jeder seine Wunschadresse angeben und am Tor vorbeigehen.
  • Jede Challenge ist signiert, verfällt in zehn Minuten, ist an den Browser gebunden und einmal lösbar: ein abgefangener Proof of Work ist beim zweiten Mal wertlos.
  • Halten Sie config.php und cache/ über HTTP unerreichbar; das Kit legt selbst eine Deny-all-.htaccess in cache/, Regeln für Apache und nginx liegen in examples/.

Rückmeldung und Kontingent

Das Kit kommt mit 'report' => true: Gemeldet werden nur zwei Dinge — die Anfrage nach einem Fallen-Pfad, die kein Browser je stellt, und eine Adresse, die binnen einer Stunde ein Dutzend Challenges nicht geschafft hat. Höchstens eine Meldung pro Adresse in sechs Stunden; gewöhnliche Besucher werden nie gemeldet, und über Ihre Seiten wird nichts gesendet. Wenn Sie das nicht wollen, setzen Sie es in config.php auf false.

Eine meldende Installation hebt Ihr bestätigtes Konto in die Beitragenden-Stufe: 30.000 statt 1.000 Abfragen am Tag, solange die Installation in den letzten 7 Tagen gemeldet hat.

Drei häufige Probleme

  • Mein Cron oder API-Endpunkt bekommt eine HTML-Seite. Nehmen Sie den Pfad in skip_paths. Alles, was von einer Maschine aufgerufen wird, gehört dorthin.
  • Der Seiten-Cache liefert allen den Prüfbildschirm. Die Bildschirme senden no-store, manche Caches ignorieren das; mit auto_prepend_file läuft das Tor vor dem Cache.
  • „blocklist: 0 entries". Kein API-Schlüssel, kein ausgehendes HTTPS oder ein nicht schreibbares Cache-Verzeichnis — --status nennt den Fall.

Häufige Fragen

Läuft mein Verkehr über jemanden? Muss ich DNS ändern?

Nein. Shield läuft im PHP-Prozess auf Ihrem eigenen Server; kein DNS-Eintrag ändert sich, kein Verkehr wird umgeleitet. In der Standardquelle 'feed' fällt die Entscheidung anhand einer Kopie der Blockliste auf Ihrer Festplatte — während ein Besucher wartet, verlässt nichts Ihren Server.

Blockiert es Google? Schadet es dem SEO?

Suchmaschinen werden durchgelassen, aber nur wenn die Adresse wirklich ihnen gehört: Der Reverse-DNS-Name muss auf die Domain des Betreibers enden und wieder auf dieselbe Adresse auflösen. Ein User-Agent, der behauptet, Googlebot zu sein, beweist nichts. Der Prüfbildschirm antwortet außerdem mit 503, Retry-After und noindex statt mit einer 200-Seite — genau das, was ein Crawler bei einem temporären Tor sehen soll.

Was, wenn ich mich selbst aussperre?

Tragen Sie Ihre eigene Adresse in allow_ips in der config.php ein — und genau deshalb bleibt der Modus am ersten Tag auf 'monitor'. Sind Sie schon ausgesperrt, löschen Sie das Verzeichnis cache/ und setzen den Modus zurück auf monitor. Jeder Fehlerpfad fällt außerdem offen aus: fehlende Liste, unerreichbare API oder nicht schreibbares Cache-Verzeichnis lassen die Seite laufen und schreiben den Grund ins PHP-Fehlerprotokoll.

Besucher sehen den Prüfbildschirm auf jeder Seite — warum?

Das Cookie kommt nicht zurück. Prüfen Sie die Serveruhr, ob ein Cache oder CDN Set-Cookie entfernt, und ob pass_hours größer als null ist. Bei einem Full-Page-Cache nehmen Sie Besucher ohne ipdb_pass-Cookie aus dem Cache heraus.

Für WordPress ist der Plugin-Leitfaden der passendere Weg; wollen Sie die Liste direkt in die Firewall geben, lesen Sie den Beitrag zum IP-Blocking, und für einen eigenen Sensor den Honeypot-Leitfaden.

Teilen

Kommentare 0

Teile eine Frage, Erfahrung oder Korrektur — registriert oder anonym.

Noch keine Kommentare. Schreib den ersten.

Nur Text, keine Links. Kommentare erscheinen sofort und können moderiert werden. Anmelden, um registriert zu kommentieren