Skip to main contentSkip to footer

Blockierung auf Netzwerkebene

Diese Seite enthält die vollständige Anleitung zum Abwehren bekannter Angreifer auf der Netzwerkebene eines Linux-Servers : ein Blockiersatz pro exponiertem Dienst, der stündlich über die API aktualisiert, atomar in den Kernel eingeladen und portbezogen angewendet wird, sodass ein Web-Angreifer niemals jemanden aus dem SSH-Zugang aussperrt. Die Anleitung behandelt ipset mit iptables , native nftables , IPv6 sowie Cloud-Edge-Firewalls .

Alle folgenden Angaben setzen einen API Key mit Zugriff auf den Threat Feed (ab der „Contributor“-Stufe) sowie Root-Rechte auf dem Zielrechner voraus. Der /blacklist Endpoint unterliegt einer Funktionsbeschränkung, wird jedoch nicht auf Ihr Tageskontingent für Überprüfungen oder Reports angerechnet.

Nicht das, was Sie benötigen? Um eine einzelne WordPress-Website zu schützen, installieren Sie stattdessen das Hive-Plugin – es führt die Abfragen pro Anfrage durch, ohne dass Firewall-Einstellungen erforderlich sind. Um eingehende E-Mails zu bewerten, fragen Sie die DNS / RBL Zone ab, anstatt Listen herunterzuladen. Dateiformate und der GitHub-Mirror sind auf der Seite Blacklist beschrieben.

So funktioniert es

1

Rufen Sie stündlich eine Liste pro Dienst ab

Der category Filter wandelt die Blacklist in eine dienstbezogene Liste um: SSH-Angreifer, E-Mail-Angreifer, Web-Angreifer und so weiter. Die Listen werden serverseitig alle 15 Minuten neu generiert; eine stündliche Abfrage mit If-None-Match sorgt dafür, dass Sie mit 120 Anfragen pro Tag stets auf dem neuesten Stand bleiben.

2

Fügen Sie diese atomar in ein Kernel-Set ein

Die IP-Adressen werden in ein ipset- oder nftables-Set aufgenommen, niemals in einzelne Firewall Rules. Ein Set-Lookup ist unabhängig von der Größe ein Hash-Lookup; 10.000 einzelne Regeln müssten für jedes Paket linear durchlaufen werden. Das Einfügen erfolgt atomar, sodass es kein Zeitfenster gibt, in dem das Set leer oder nur teilweise gefüllt ist.

3

Abgleich mit dem Set im Port-Bereich

Eine Regel pro Dienst verweist auf den eigenen Satz und nur auf die Ports, auf denen der Dienst lauscht. Eine IP-Adresse, die im Zusammenhang mit Brute-Force-Angriffen auf den WordPress-Login gemeldet wird, wird auf den Ports 80/443 abgewehrt und nirgendwo sonst.

Dienstlisten und ihre Kategorien

Reports tragen IDs von Threat Categories. category akzeptiert eine durch Kommas getrennte Liste und gibt nur IP-Adressen zurück, die unter mindestens einer dieser Threat Categories gemeldet wurden. Der vollständige Katalog (58 Kategorien, IDs 1–58) ist auf der Seite „Threat Categories“ oder über GET /categories ohne Authentifizierung.

Set category Gilt für Anwenden auf
ssh 22,18 SSH-Brute-Force (22), generische Brute-Force (18) sshd – Port 22
mail 11,7,17,18 Email Spam (11), Phishing (7), Spoofing (17), Brute-Force (18) für SMTP-AUTH/IMAP/POP3 Postfix/Exim, Dovecot – Ports 25, 465, 587, 110, 143, 993, 995
web siehe unten Web App Attack (21), SQL Injection (16), Web Spam (10), Bad Web Bot (19), Blog Spam (12) sowie der spezielle WordPress-Block (31–58): Brute-Force-Angriffe auf Login/XML-RPC/REST, Exploits für Plugins, Themes und den Kern, Kommentar- und Registrierungsspam, Hintertüren, Scans nginx/Apache inkl. WordPress-Hosting – Ports 80, 443
ftp 5,18 FTP Brute-Force (5), generische Brute-Force (18) vsftpd/proftpd – Port 21
edge 4,14,20 DDoS Attack (4), Port Scan (14), Exploited Host (20) gesamter Netzwerk-Edge, alle Ports

Gesamtwert category Wert für den web Menge:

text
21,16,10,19,12,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58

Kategorie 18 (generische Brute-Force-Angriffe) erscheint in der ssh, mail und ftp Sammlungen absichtlich auf: Es umfasst Angriffe auf Anmeldedaten, die der Melder keinem bestimmten Protokoll zugeordnet hat, und die Sammlungen werden ohnehin pro Dienstport angewendet. Wenn Sie lieber eine einzige Blockiersammlung für alles verwenden möchten, lassen Sie category — die ungefilterte Liste ist die Obermenge aller fünf.

Die Anforderung

Authentifizierung über den X-Key Header statt des key Abfrageparameter, damit der Schlüssel nicht in Proxy- oder CDN-Protokollen landet.

bash
curl -sS -H "X-Key: YOUR_API_KEY" \
  "https://reportedip.com/wp-json/reportedip/v2/blacklist?confidence=90&format=txt&limit=50000&category=22,18"
ParameterWertWarum
confidence 90 Die für die unbeaufsichtigte Blockierung empfohlene Stufe. Die Stufen 50/75/90 werden alle 15 Minuten serverseitig vorab generiert, sodass sie schnell und vollständig antworten. Nicht standardmäßige Werte (91, 93, 97) werden pro Anfrage erstellt und sind langsamer
format txt Eine IP-Adresse pro Zeile, kein Wrapper – wird direkt in ipset restore oder nft -f
limit 10000 oder höher Antwortbegrenzung. Wird diese weggelassen, werden 10.000 Einträge zurückgegeben; die Stufen werden mit bis zu 50.000 Einträgen zwischengespeichert, sodass limit=50000 wird der gesamte Inhalt der Ebene zurückgegeben (siehe unten)
category pro Dienst Schränkt die Liste auf übereinstimmende Angriffstypen ein (siehe Tabelle oben). Weglassen, um einen kombinierten Satz zu erhalten

Wie groß die Listen werden

Jede Ebene wird serverseitig alle 15 Minuten neu generiert und mit bis zu 50.000 Einträgen zwischengespeichert, was zugleich die feste Obergrenze pro Antwort darstellt. Die Standard-Antwortgröße bleibt aus Gründen der Abwärtskompatibilität bei 10.000 – fordern Sie explizit mehr an mit limit=50000.

confidenceTypische GrößeVerwendung für
90 etwa 10.000 Unbeaufsichtigtes Blockieren. Passt in eine einzige Anfrage und innerhalb der Elementbeschränkungen der meisten Cloud- Firewalls
75 etwa 26.000 Umfassendere Abdeckung in Fällen, in denen die Behebung eines False Positives mit geringem Aufwand verbunden ist – Rate Limiting, CAPTCHA, Bewertung oder Blockierung bei einem Dienst, der nicht kundenorientiert ist
50 50.000 (Obergrenze) Analyse, SIEM-Anreicherung und Bewertung. Zu umfangreich für unbeaufsichtigte DROP-Regeln

Kategoriefilter schränken die von Ihnen angeforderte Stufe ein, gehen jedoch nicht darüber hinaus – eine web Liste, die aus confidence=75 ist größer als dieselbe Liste, die aus confidence=90. Ab 50.000 Adressen sind Listendownloads nicht mehr das geeignete Mittel: Fragen Sie stattdessen die DNS / RBL Zone oder GET /check stattdessen pro Adresse abfragen, wodurch die gesamte Datenbank ohne jegliche Größenbeschränkung abgedeckt wird.

Warum ein Konfidenzgrad von 90 % die Anzahl der False Positives gering hält

Der Score ist kein Meldezähler. Eine IP benötigt mindestens 10 gültige Reports, um überhaupt 74 % zu erreichen, sowie mindestens 2 unabhängige Melder; Reports verfallen mit einer Halbwertszeit von 30 Tagen, sodass eine IP, die , fällt von selbst ab, und in die Whitelist aufgenommene Infrastruktur (Suchmaschinen, CDNs, Überwachungsdienste, Forschungsscanner) wird vor der Erstellung der Liste ausgeschlossen. Werte von 90 und darüber erfordern in der Praxis zahlreiche aktuelle Reports aus unabhängigen Quellen, die in der Regel durch Honeypot-Sensoren bestätigt werden. Sie können jeden Eintrag mit GET /check?ip=<ip>&verbose=trueüberprüfen, wodurch die vollständige Aufschlüsselung der Punktzahl zurückgegeben wird.

Betriebsregeln

  1. Stündliche Abfrage, zeitlich versetzt. Fünf Listen einmal pro Stunde entsprechen 120 Anfragen pro Tag. Senden Sie nicht alle fünf Anfragen in derselben Sekunde.
  2. Senden Sie den ETag zurück. Speichern Sie den ETag Antwort-Header pro Liste und geben Sie ihn als If-None-Match; eine unveränderte Liste wird 304 Not Modified mit leerem Hauptteil. Das Tag deckt genau die von Ihnen angeforderte Variante ab, einschließlich des Kategoriefilters ; verwenden Sie daher pro Liste eine eigene Tag-Datei.
  3. Bei Fehlern niemals leeren. Bei jedem anderen Status als 200 oder 304 behalten Sie den vorherigen Satz bei und versuchen Sie es in der nächsten Stunde erneut. Eine Firewall, die sich selbst leert, weil ein Abruf zeitlich abgelaufen ist, ist schlimmer als eine leicht veraltete.
  4. Führen Sie eine Plausibilitätsprüfung der Größe durch. Lehnen Sie die Übernahme einer Liste ab, die drastisch geschrumpft ist. Das untenstehende Skript lehnt alles ab, was unter einem listenbezogenen Mindestwert liegt, wodurch abgeschnittene und leere Antworten abgefangen werden.
  5. Trennen Sie IPv4 und IPv6. Der Feed enthält beides. Ein für eine Familie erstelltes „ipset“ lehnt Adressen der anderen Familie ab, daher benötigt jede Liste zwei Sätze.

Synchronisierungsskript (ipset)

Ein Skript bedient alle fünf Listen; der Listenname ist das einzige Argument. Es führt bedingte Abrufe durch, überprüft die Größe und überträgt das Ergebnis atomar in den Live-Satz. Die Einträge werden ipset restore in einem einzigen Durchlauf statt pro ipset add pro IP, wodurch die Aktualisierung von 10.000 Einträgen deutlich unter einer Sekunde bleibt.

bash
#!/bin/sh
# /usr/local/sbin/reportedip-sync.sh <ssh|mail|web|ftp|edge>
# Fetches one service list and swaps it into its ipset atomically.
set -u

API_KEY="YOUR_API_KEY"
BASE="https://reportedip.com/wp-json/reportedip/v2/blacklist?confidence=90&format=txt&limit=50000"
STATE="/var/lib/reportedip"
LIST="${1:-}"

# CATS = category filter, MIN = smallest plausible list size (refuse below this)
case "$LIST" in
  ssh)  CATS="22,18"                  ; MIN=1000 ;;
  mail) CATS="11,7,17,18"             ; MIN=500  ;;
  web)  CATS="21,16,10,19,12,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58" ; MIN=500 ;;
  ftp)  CATS="5,18"                   ; MIN=500  ;;
  edge) CATS="4,14,20"                ; MIN=1000 ;;
  *) echo "usage: $0 ssh|mail|web|ftp|edge" >&2 ; exit 2 ;;
esac

mkdir -p "$STATE"
BODY=$(mktemp) ; HEAD=$(mktemp)
trap 'rm -f "$BODY" "$HEAD" "$BODY.v4" "$BODY.v6"' EXIT
ETAG="$STATE/etag-$LIST"

if [ -s "$ETAG" ]; then
  CODE=$(curl -sS -o "$BODY" -D "$HEAD" -w '%{http_code}' --max-time 60 \
         -H "X-Key: $API_KEY" -H "If-None-Match: $(cat "$ETAG")" "$BASE&category=$CATS")
else
  CODE=$(curl -sS -o "$BODY" -D "$HEAD" -w '%{http_code}' --max-time 60 \
         -H "X-Key: $API_KEY" "$BASE&category=$CATS")
fi

case "$CODE" in
  200) : ;;
  304) logger -t reportedip "[$LIST] unchanged (304)" ; exit 0 ;;
  *)   logger -t reportedip "[$LIST] HTTP $CODE - keeping previous set" ; exit 1 ;;
esac

# The feed carries both families; ipset needs them in separate sets.
grep -E '^[0-9]+(\.[0-9]+){3}$' "$BODY" > "$BODY.v4" || true
grep -E '^[0-9a-fA-F:]+:[0-9a-fA-F:]*$' "$BODY" > "$BODY.v6" || true

COUNT=$(wc -l < "$BODY.v4")
if [ "$COUNT" -lt "$MIN" ]; then
  logger -t reportedip "[$LIST] only $COUNT IPv4 entries (min $MIN) - keeping previous set"
  exit 1
fi

# IPv4: build a scratch set, fill it in one restore pass, swap it in.
ipset create "rip-$LIST"     hash:ip family inet maxelem 65536 -exist
ipset create "rip-$LIST-tmp" hash:ip family inet maxelem 65536 -exist
{ echo "flush rip-$LIST-tmp" ; sed "s|^|add rip-$LIST-tmp |" "$BODY.v4" ; } | ipset restore -exist
ipset swap "rip-$LIST-tmp" "rip-$LIST"
ipset destroy "rip-$LIST-tmp"

# IPv6: same pattern, own family. Skipped when the list has no v6 entries.
ipset create "rip-$LIST-v6" hash:ip family inet6 maxelem 65536 -exist
if [ -s "$BODY.v6" ]; then
  ipset create "rip-$LIST-v6-tmp" hash:ip family inet6 maxelem 65536 -exist
  { echo "flush rip-$LIST-v6-tmp" ; sed "s|^|add rip-$LIST-v6-tmp |" "$BODY.v6" ; } | ipset restore -exist
  ipset swap "rip-$LIST-v6-tmp" "rip-$LIST-v6"
  ipset destroy "rip-$LIST-v6-tmp"
fi

awk 'tolower($1) == "etag:" { print $2 }' "$HEAD" | tr -d '\r' > "$ETAG"
logger -t reportedip "[$LIST] updated: $COUNT IPv4, $(wc -l < "$BODY.v6") IPv6"

Machen Sie das Skript ausführbar und weisen Sie ihm einen gestaffelten stündlichen Zeitplan zu:

bash
chmod 750 /usr/local/sbin/reportedip-sync.sh
cron
# /etc/cron.d/reportedip
7  * * * * root /usr/local/sbin/reportedip-sync.sh ssh
17 * * * * root /usr/local/sbin/reportedip-sync.sh mail
27 * * * * root /usr/local/sbin/reportedip-sync.sh web
37 * * * * root /usr/local/sbin/reportedip-sync.sh ftp
47 * * * * root /usr/local/sbin/reportedip-sync.sh edge
Sets bleiben bei einem Neustart nicht erhalten. Sichern Sie sie mithilfe ipset save > /etc/ipset.conf und dem ipset-Dienst Ihrer Distribution, oder führen Sie das Synchronisierungsskript einfach einmal beim Systemstart aus, bevor die Firewall Rules geladen werden – die folgenden Regeln verweisen auf die Sets anhand ihres Namens, sodass ein leeres Set im Fehlerfall offen statt geschlossen bleibt.

iptables-Regeln

Installieren Sie diese einmal, beispielsweise in Ihrer Firewall-Bootstrap-Datei. Jede Regel gleicht ihr eigenes Set an ihren eigenen Ports ab. ip6tables spiegelt dieselben Regeln auf die -v6 Sets.

bash
# IPv4
iptables -I INPUT -p tcp --dport 22 -m set --match-set rip-ssh src -j DROP
iptables -I INPUT -p tcp -m multiport --dports 25,465,587,110,995,143,993 \
         -m set --match-set rip-mail src -j DROP
iptables -I INPUT -p tcp -m multiport --dports 80,443 \
         -m set --match-set rip-web src -j DROP
iptables -I INPUT -p tcp --dport 21 -m set --match-set rip-ftp src -j DROP
iptables -I INPUT -m set --match-set rip-edge src -j DROP

# IPv6
ip6tables -I INPUT -p tcp --dport 22 -m set --match-set rip-ssh-v6 src -j DROP
ip6tables -I INPUT -p tcp -m multiport --dports 25,465,587,110,995,143,993 \
          -m set --match-set rip-mail-v6 src -j DROP
ip6tables -I INPUT -p tcp -m multiport --dports 80,443 \
          -m set --match-set rip-web-v6 src -j DROP
ip6tables -I INPUT -p tcp --dport 21 -m set --match-set rip-ftp-v6 src -j DROP
ip6tables -I INPUT -m set --match-set rip-edge-v6 src -j DROP

Native nftables

Auf nftables-Systemen (Debian 12, RHEL 9 und neuere Versionen verwenden dies standardmäßig) können Sie ipset vollständig überspringen. Benannte Sets befinden sich innerhalb des Regelsatzes, und eine inet Tabelle enthält IPv4 und IPv6 nebeneinander, und nft -f wendet eine gesamte Datei als eine einzige Transaktion an – Leeren und Neubefüllen in ein und demselben atomaren Schritt, ohne temporären Satz und ohne Austausch.

Einmalige Einrichtung

bash
nft add table inet reportedip
nft add chain inet reportedip input '{ type filter hook input priority -10 ; policy accept ; }'

for l in ssh mail web ftp edge ; do
  nft add set inet reportedip "rip-$l"    '{ type ipv4_addr ; }'
  nft add set inet reportedip "rip-$l-v6" '{ type ipv6_addr ; }'
done

nft add rule inet reportedip input tcp dport 22 ip  saddr @rip-ssh  drop
nft add rule inet reportedip input tcp dport 22 ip6 saddr @rip-ssh-v6 drop
nft add rule inet reportedip input tcp dport '{ 25, 110, 143, 465, 587, 993, 995 }' ip  saddr @rip-mail drop
nft add rule inet reportedip input tcp dport '{ 25, 110, 143, 465, 587, 993, 995 }' ip6 saddr @rip-mail-v6 drop
nft add rule inet reportedip input tcp dport '{ 80, 443 }' ip  saddr @rip-web drop
nft add rule inet reportedip input tcp dport '{ 80, 443 }' ip6 saddr @rip-web-v6 drop
nft add rule inet reportedip input tcp dport 21 ip  saddr @rip-ftp drop
nft add rule inet reportedip input tcp dport 21 ip6 saddr @rip-ftp-v6 drop
nft add rule inet reportedip input ip  saddr @rip-edge drop
nft add rule inet reportedip input ip6 saddr @rip-edge-v6 drop

Aktualisierungsschritt

Ersetzen Sie den ipset-Block des Synchronisierungsskripts durch diesen. Alles andere – bedingtes Abrufen, Größenprüfung, Familientrennung, Protokollierung – bleibt unverändert.

bash
# Single transaction: both families flushed and refilled, or nothing changes.
{
  echo "flush set inet reportedip rip-$LIST"
  echo "flush set inet reportedip rip-$LIST-v6"
  [ -s "$BODY.v4" ] && printf 'add element inet reportedip rip-%s { %s }\n' \
      "$LIST" "$(paste -sd, "$BODY.v4")"
  [ -s "$BODY.v6" ] && printf 'add element inet reportedip rip-%s-v6 { %s }\n' \
      "$LIST" "$(paste -sd, "$BODY.v6")"
} | nft -f -

Speichern Sie den Regelsatz wie gewohnt, zum Beispiel:

bash
nft list ruleset > /etc/nftables.conf
systemctl enable nftables

IPv6

Der Feed liefert IPv4 und IPv6 in derselben Liste zurück. IPv6 macht derzeit nur einen geringen Anteil davon aus – Angreifer nutzen nach wie vor überwiegend v4 –, doch dieser Anteil ist nicht gleich Null und stellt den Teil der Liste dar, der wächst. Daraus ergeben sich zwei Regeln:

  • Mischen Sie niemals Familien in einem „ipset“. Ein family inet Satz lehnt jede v6- Adresse mit der Meldung „Element kann dem Satz nicht hinzugefügt werden: Es gehört nicht zur Familie des Satzes“ ab, und eine naive Schleife bricht die gesamte Aktualisierung bereits bei der ersten v6-Zeile ab. Das obige Skript teilt den Hauptteil vor dem Laden auf, sodass ein v6-Eintrag den v4-Satz niemals zerstören kann.
  • Führen Sie eine explizite v6-Übereinstimmung durch. iptables Regeln erkennen IPv6-Datenverkehr nicht. Ohne die entsprechenden ip6tables (oder einer inet nftables-Tabelle) umgeht ein Angreifer mit funktionierendem IPv6 ein perfekt gepflegtes Block-Set.

Das Blockieren einer einzelnen v6-Adresse ist für sich genommen unzureichend – eine /64-Zuweisung verschafft einem Angreifer praktisch unbegrenzte Adressen. Behandeln Sie v6-Einträge als Hinweis auf das umgebende Präfix: Bei anhaltendem Missbrauch blockieren Sie das /64 mit einem hash:net Set (ipset) oder einem Set mit flags interval (nftables) und behalten Sie die adressspezifische Liste für alle anderen Fälle bei.

Cloud- und Edge-Firewalls

Wenn der Datenverkehr ein CDN oder einen Cloud-Edge erreicht, bevor er Ihren Kernel erreicht, spart eine Sperrung an dieser Stelle Bandbreite und schont die Verbindung. Die Liste ist dieselbe; lediglich die Bereitstellung unterscheidet sich.

Cloudflare

Verwalten Sie eine benutzerdefinierte IP-Liste auf Kontoebene und verweisen Sie in einer benutzerdefinierten WAF-Regel darauf. Der Bulk-Endpoint ersetzt alle Einträge in einem einzigen Aufruf – dies entspricht demselben Prinzip des „Atomic Swap“ wie ipset swap. Benutzerdefinierte Listen akzeptieren einzelne Adressen und CIDR-Bereiche (IPv4 /8/32, IPv6 /12/128); wie viele Einträge und Listen Ihnen zur Verfügung stehen, hängt von Ihrem Tarif ab; überprüfen Sie daher Ihr Kontingent, bevor Sie eine Liste mit 10.000 Einträgen hochladen.

bash
# Replace all items of an existing list (returns an async operation id)
curl -sS -X PUT \
  "https://api.cloudflare.com/client/v4/accounts/$CF_ACCOUNT_ID/rules/lists/$CF_LIST_ID/items" \
  -H "Authorization: Bearer $CF_API_TOKEN" \
  -H "Content-Type: application/json" \
  --data "$(jq -R -s 'split("\n") | map(select(length > 0) | {ip: .})' < "$BODY.v4")"

Anschließend übernimmt eine einzige benutzerdefinierte WAF-Regel die Blockierung, zum Beispiel (ip.src in $rip_web) mit der Aktion „Blockieren“. Da die Regel aus einem einzigen Ausdruck besteht, hat die Listengröße keinen Einfluss auf die Anzahl der Regeln.

AWS

Verwenden Sie einen WAF-IP-Satz, keine Sicherheitsgruppen oder Präfixlisten: Ein IP-Satz fasst bis zu 10.000 Adressen oder CIDR-Bereiche und wird von einer einzigen Regel referenziert, während Einträge in Sicherheitsgruppen und Präfixlisten einzeln auf die ressourcenbezogenen Regelkontingente angerechnet werden und diese weit vor Erreichen der 10.000er-Marke erschöpft sind. Adressen müssen in CIDR-Notation vorliegen, daher benötigen einzelne IP-Adressen ein /32.

bash
LOCK=$(aws wafv2 get-ip-set --scope REGIONAL --name rip-web --id "$IPSET_ID" \
        --query 'LockToken' --output text)

aws wafv2 update-ip-set --scope REGIONAL --name rip-web --id "$IPSET_ID" \
  --lock-token "$LOCK" \
  --addresses $(sed 's|$|/32|' "$BODY.v4" | head -n 10000 | paste -sd' ')

Andere Anbieter

Hetzner Cloud, Azure-NSGs, GCP-Firewall-Richtlinien und die meisten verwalteten Firewalls begrenzen die Anzahl der Regeln oder CIDRs pro Richtlinie deutlich unter 10.000. Wenn die Obergrenze erreicht ist, behalten Sie die Liste edge Liste (DDoS, Port Scans, Exploited Hosts – die kleinste und eindeutigste Gruppe) und führen Sie die Servicelisten im Kernel auf dem Host aus, wo die Größe der Liste keine Rolle spielt.

Überprüfen Sie, ob es funktioniert

bash
# How many entries are live right now?
ipset list rip-ssh | head -n 8
nft list set inet reportedip rip-ssh | head -n 8

# Is a specific IP in the set?
ipset test rip-ssh 1.2.3.4

# What did the last sync do?
journalctl -t reportedip --since "2 hours ago"

# Are packets actually hitting the rule?
iptables -L INPUT -v -n --line-numbers | grep -i match-set

Bevor Sie auf „DROP“ umstellen

  • , setzen Sie Ihre eigenen Adressbereiche, Verwaltungsnetzwerke sowie Überwachungs- und Backup-Systeme zunächst in der Firewall auf die Whitelist – unabhängig von diesem Feed. Eine ACCEPT Regel, die über den Set-Regeln platziert wird, reicht aus.
  • Führen Sie jede Liste 48 Stunden lang im reinen Protokollierungsmodus aus (-j LOG anstatt -j DROP, oder log anstelle von drop in nftables) und lesen Sie nach, was blockiert worden wäre.
  • Führen Sie jeweils nur eine Liste ein. Beginnen Sie mit ssh: Diese weist das deutlichste Angriffssignal und den geringsten Wirkungsradius auf.
  • Behalten Sie die Überprüfung der Mindestgröße bei. Sie ist die einzige Schutzmaßnahme, die verhindert, dass eine fehlerhafte Antwort Ihren Schutz zunichte macht.
  • Sollte jemand melden, blockiert worden zu sein, sind die Nachweise für jede Adresse öffentlich einsehbar unter https://reportedip.com/ip/<ip>/, und die Entfernung aus der Liste erfolgt über IP Delisting.

Fehlerbehebung

SymptomUrsache und Behebung
401 oder 403 Schlüssel fehlt, falscher Header-Name oder eine Stufe ohne Zugriff auf den Threat Feed. Siehe „Authentifizierung“
Das Feld „Immer“ 304wird das Feld „Set“ nie ausgefüllt Eine veraltete Tag-Datei aus einer anderen Liste oder in einem anderen Format. Löschen Sie /var/lib/reportedip/etag-* und führen Sie den Vorgang erneut aus – Tags gelten pro Variante, verwenden Sie daher niemals eine Datei für mehrere Listen
Das Element kann der Gruppe nicht hinzugefügt werden: Es gehört nicht zur Familie der Gruppe IPv6-Adressen werden in eine family inet Set eingegeben. Teilen Sie den Datensatz nach Familien auf, wie es das Skript tut
Das Set kann nicht gelöscht werden: Es wird gerade verwendet Sie löschen das Live-Set anstelle des Scratch-Sets. Erst wenn das -tmp Set wird nach dem Austausch gelöscht
Die Aktualisierung dauert einige Minuten Eine ipset add pro Zeile. Verwenden Sie ipset restore in einem einzigen Durchlauf, wie oben gezeigt
Sets werden nach einem Neustart geleert Der Inhalt von „ipset“ wird standardmäßig nicht beibehalten. Führen Sie die Synchronisierung beim Systemstart durch oder speichern und stellen Sie die Daten wieder her /etc/ipset.conf
Angriffe gehen trotz eines vollständigen Satzes weiter Der Datenverkehr kommt über IPv6 an, oder eine frühere ACCEPT Regel trifft zuerst zu. Überprüfen Sie die Reihenfolge der Regeln mit iptables -L INPUT -v -n --line-numbers

Bitte melden Sie uns

Die Nutzung der Liste erfolgt in eine Richtung. Die Angriffe, die Ihr eigener Server registriert, können wieder in die Liste zurückfließen: Eine vorgefertigte fail2ban-Aktion übermittelt jede Sperre an POST /report mit der Threat Category, die zum „Jail“ passt. Reports belasten ausschließlich Ihr tägliches Berichts-Kontingent, niemals das Prüfkontingent, und jeder Bericht stärkt die von Ihnen abgerufenen Listen. Siehe den fail2ban-Integrationsleitfaden.

Kurzübersicht

EndpointGET https://reportedip.com/wp-json/reportedip/v2/blacklist
AuthX-Key: YOUR_API_KEY Header
Basisparameterconfidence=90&format=txt&limit=50000
SSH&category=22,18
E-Mail&category=11,7,17,18
Web (einschl. WordPress)&category=21,16,10,19,12,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58
FTP&category=5,18
Edge&category=4,14,20
Serveraktualisierungalle 15 Minuten
Empfohlene Abfragestündlich pro Liste, gestaffelt, mit If-None-Match
Auswirkungen auf das Kontingentkeine – der Endpoint wird weder auf das Abfrage- noch auf das Berichts-Kontingent angerechnet
KategoriekatalogGET /categories (keine Authentifizierung)

Zuletzt aktualisiert: · Betreut vom ReportedIP-Team

Security Focused
DSGVO-konform
Made in Germany
Zurück zur Doku