Den Linux-Agenten betreiben
Die Befehle und ihre Exit-Codes, was die drei systemd-Units tun, wie status und doctor ins Monitoring passen, test statt fail2ban-regex, und die Tabelle zur Problembehebung: Symptom, Ursache, Befehl.
Befehle
| Befehl | Wirkung | Exit |
|---|---|---|
REPORTEDIP_KEY=K install [--accept-terms] [--admin-ip IP|CIDR] [--ssh-port N] [--mode log|drop] [--ban|--no-ban] [--notify-email A] [--log-level L] [--expert] | Erkennt die Dienste, schreibt Config, Auto-Whitelist und Install-ID, installiert und aktiviert die Units und prüft den Key. Der Key kommt aus der Umgebung; --key funktioniert weiter und warnt, dass sein Wert in der Prozessliste steht. Überschreibt eine bestehende Config nie. Nur als root. --expert fragt zusätzlich nach der Eskalationsleiter, den Schwellen, den Limits und einem SMTP-Server. | 0, 2 bei abgelehntem Key, bevor etwas geschrieben ist, oder bei einem Config-Problem, 1 wenn die Key-Prüfung nach der Installation scheitert |
sync | Ein Feed-Durchlauf: Whitelist-Set neu bauen, jede Liste bedingt abrufen, tauschen, was die Größenprüfung bestanden hat, Kette neu bauen, fehlende lokale Sperren wiederherstellen, aufräumen, alle sechs Stunden nach einem Update sehen. Das führt der Timer aus, und das läuft beim Boot. | 0, 1 eingeschränkt, ebenfalls 0, wenn ein anderer Sync das Lock hält |
watch | Der Daemon. Liest jede Quelle mit, zählt, meldet und sperrt, wenn das eingeschaltet ist. Endet bei SIGTERM. | 1, wenn das Queue-Lock nach einer Minute noch gehalten wird oder der Daemon mit einem Fehler endet, 2 bei einem Config-Problem |
report-queue | Schickt die wartenden Reports einmal. Nützlich nach einem API-Ausfall oder auf einem Host, auf dem der Daemon nicht läuft. | 0, 1 eingeschränkt |
status | Version, Backend, Modus, Werkzeuge, Anzahl und letzter Erfolg pro Liste, Whitelist, Kettenprüfung, Lesepositionen und Treffer pro Quelle, Queue und Sender, Konto und Lizenz, die Gruppe dieses Keys, die Reputation der Adresse, von der dieser Host meldet, Platte, lokale Sperren, offene Zustände. | 0 gesund, 1 eingeschränkt, 2 Config |
doctor | Was der Host bietet und was fehlt, darunter ein Log, das dieser Host schreibt und das keine Quelle liest. Ändert nichts, funktioniert ohne Config. | 0, 1 mit Einschränkungen, 2 nicht lauffähig |
test <file>... [--type T] [--rule ID] [--lines] | Lässt die Detektoren über echte Logdateien laufen. Meldet nichts, sperrt nichts, schreibt nichts. --rule lässt eine einzelne Regel aus einer Regeldatei allein laufen. | 0, 2 bei einem Datei- oder Typproblem |
ban list | add <ip> [minutes] | rm <ip> | Zeigt die lokalen Sperren gegen das, was der Kernel wirklich hält, setzt eine von Hand, hebt eine auf. | 0, 1 bei einem Kernel-Fehler, 2 bei falschem Argument oder solange ein Sync das Lock hält; add auch bei einer Adresse auf der Whitelist oder ohne Firewall-Backend |
unban <ip> | Dasselbe wie ban rm, unter dem Wort, das ein Operator tippt, wenn es brennt. | wie oben |
whitelist add <ip|cidr> [comment] | list | rm <ip|cidr> [--auto] | Pflegt die Nie-blocken-nie-melden-Liste. add schreibt Datei und Kernel-Set auf einmal. list gibt Ihre Datei, die Auto-Whitelist und die Whitelist Ihrer Gruppe aus, Letztere auf Zeilen mit group: samt Notiz. --auto entfernt einen Eintrag, den der Installer geschrieben hat. | 0, 1 wenn die Datei geändert wurde und das Set nicht, 2 bei einer falschen Adresse oder solange ein Sync das Lock hält |
update [--check] | Prüft den Verteilpunkt, ersetzt diese Binärdatei und startet danach den Watch-Dienst neu. --check berichtet nur. Das ist der eine Befehl, der die Config locker liest, er funktioniert also auch auf einem Host, dessen Config neuer ist als seine Binärdatei. | 0, 1 wenn die Prüfung oder die Installation scheiterte, 2 wenn die Config nicht lesbar ist oder das State-Verzeichnis nicht angelegt werden kann |
housekeeping | Entfernt die eigenen Überreste des Agenten und gibt die Zahlen aus. Der Sync-Lauf macht dasselbe still. | 0, 2 bei einem Config- oder Zustandsproblem |
rules list | show <id> | check [file...] | export <id> | status | enable <id> | disable <id> | Die Erkennungsregeln: die gelieferten und die Dateien unter /etc/reportedip-agent/rules.d, die sie überschreiben oder ergänzen. check prüft eine Datei, bevor sie live geht, export gibt eine Regel als Vorlage aus, status zeigt dazu die Treffer und welche Regeln jung sind, enable und disable schalten eine Regel ein oder aus. | 0, 1 wenn eine Datei übersprungen wurde oder die Betreiberregeln nicht genutzt werden, 2 bei falschem Argument oder wenn check ein Problem findet |
version | Gibt die Version aus und sonst nichts. | 0 |
help | Die Befehlsliste, mit den Pfaden für Config und Zustand. | 0 |
test, statt fail2ban-regex
test lässt die Detektorkette über eine Logdatei laufen, die Sie schon haben, mit den
Schwellwerten und der Whitelist dieses Hosts, und gibt aus, welche Adressen einen Schwellwert
überschritten hätten und an welcher Stelle der Datei. Es meldet nichts, blockt nichts und schreibt
nichts, es ist also auf einem Produktionshost gefahrlos und die ehrliche Antwort auf die Frage, ob
das den Angriff von letzter Woche erwischt hätte.
# A configured source: the type is taken from the config
reportedip-agent test /var/log/auth.log
# Any other file: name the type yourself
reportedip-agent test --type postfix /var/log/mail.log.1
# A rotated log and its successor as one stream, in this order,
# so a window that spans the rotation counts like the daemon saw it.
# A .gz is read inflated.
reportedip-agent test /var/log/mail.log.2.gz /var/log/mail.log.1 /var/log/mail.log
# Every single hit, with line number, address and timestamp
reportedip-agent test --lines /var/log/auth.log
Die Zusammenfassungszeile nennt die gelesenen Zeilen, wie viele passten, wie viele keinen brauchbaren Zeitstempel trugen und wie viele als überlang übersprungen wurden. Danach eine Zeile pro Adresse mit ihren Treffern, ihren Zurücksetzungen, ob sie gesperrt worden wäre und wie oft, dem Zeitpunkt des ersten Treffers und dem angewendeten Schwellwert. Eine Adresse auf Ihrer Whitelist wird mit der Schicht gezeigt, die gegriffen hat, und als nie gesperrt und nie gemeldet markiert. Das macht diesen Befehl zum schnellsten Weg, einen Whitelist-Eintrag tatsächlich nachzuweisen.
Zwei Dinge macht test nicht. Es rät kein Format: ohne --type muss die Datei
einer der konfigurierten Quellpfade sein, sonst sagt es das und zählt die gültigen Typen auf. Und es
wendet die Gewichtung aus der Bann-Historie nicht an, der Daemon braucht für eine Adresse mit
früheren Sperren also weniger Treffer, als diese Wiederholung vermuten lässt.
Betrieb
Drei systemd-Units, von install geschrieben und aktiviert und von jedem Sync auf den
Stand der laufenden Version gebracht. Eigene Änderungen gehören in ein Drop-in unter
/etc/systemd/system/<unit>.d/, dort überleben sie ein Update. Eine Unit, die Sie
direkt bearbeitet haben, wird ersetzt, die vorherige Fassung bleibt als
<unit>.bak daneben liegen, und das Journal nennt beide.
| Unit | Wann sie läuft | Details |
|---|---|---|
reportedip-agent-sync.timer | Alle 15 Minuten, plus ein fester zufälliger Versatz von bis zu 2 Minuten | Er muss so schnell feuern, wie die schnellste Lizenz es verlangen kann, denn er ist das Einzige, was einen Sync startet. Wie viele dieser Läufe wirklich abrufen, entscheidet die Lizenz, und ein Lauf, der für seinen Tarif zu früh kommt, holt nichts. |
reportedip-agent-sync.service | Beim Systemstart und bei jedem Timer-Tick | Für multi-user.target aktiviert, nach network-online.target und nach jedem Firewall-Dienst, ohne Zufallsverzögerung. Ein Sync-Durchlauf: Whitelist-Set, die sechs Listen, die Kette, das Wiederherstellen fehlender lokaler Sperren, die Housekeeping-Arbeit und alle sechs Stunden eine Update-Prüfung. |
reportedip-agent.service | Dauerhaft | Der Watch-Daemon. Startet nach einem Fehler nach zehn Sekunden neu, höchstens fünfmal in fünf Minuten, und nie bei Exit-Code 2. Ein falsch konfigurierter Host bleibt also mit einem lesbaren Grund stehen, statt endlos neu gestartet zu werden. |
Beide Dienste laufen mit NoNewPrivileges, ProtectHome,
PrivateTmp, gesperrter Personality und einem eingeschränkten Satz an Adressfamilien.
| Was von selbst läuft | Wie oft | Was es tut |
|---|---|---|
| Log-Rotation | Bei jedem Schreiben | Der Agent rotiert log_file bei log_max_mb und behält log_keep Generationen. Er braucht logrotate nicht. Jede Zeile geht außerdem nach stderr und damit ins Journal der Unit. |
housekeeping | In jedem Sync | Alte Queue-Dateien, abgelaufene Dedup-Einträge, veraltete Lesepositionen, übrige Temporär- und Lock-Dateien, abgelaufene Bann-Datensätze, überzählige Generationen des eigenen Logs, Dateien im Spiegel der gelieferten Regeln, die das Binary nicht mehr enthält, und das vorherige Binary, sobald es einen Monat alt ist. Von Hand aufgerufen zeigt es die Zahlen. |
| Selbst-Update | Alle sechs Stunden | Ein neues Release wird vor der Installation gegen eine Ed25519-Signatur mit dem im Binary eingebauten Public Key geprüft, eine manipulierte Datei scheitert also auf Ihrer Maschine, statt dass ihr vertraut wird, nur weil sie über HTTPS kam. Scheitert der Tausch, kommt die laufende Binärdatei zurück, ein abgebrochenes Update lässt den Host also auf der Version, die er hatte. |
| Zustandsmail | Pro Zustand, mit notify.cooldown_hours | Eine Mail, wenn etwas nicht stimmt, eine, wenn es behoben ist. Ab Professional kann sie über das Relay von reportedip.com gehen. |
| Die Plattengrenze | Bei jedem Queue-Schreiben | Unter disk_min_mb reiht der Agent keine neuen Reports ein und sagt das, während Erkennung und Blocken weiterlaufen. |
systemctl list-timers reportedip-agent-sync.timer
systemctl status reportedip-agent.service --no-pager
journalctl -u reportedip-agent.service -n 50 --no-pager
journalctl -u reportedip-agent-sync.service -n 50 --no-pager
tail -n 100 /var/log/reportedip-agent.log
Exit-Codes
| Code | Bedeutung | Was zu tun ist |
|---|---|---|
0 | Gesund | Nichts. |
1 | Eingeschränkt, aber es wird wieder versucht | Die Ausgabe lesen. Ein weiterer Versuch kann das durchaus beheben. Ein offener Fehlerzustand im Gesundheitsstand färbt den Exit-Code auch dann, wenn der Lauf selbst durchging, denn ein Exit 0 neben einem erfassten Fehler ist kein Signal für ein Monitoring. Bei status ist ein gestoppter watch-Daemon einer dieser Gründe. |
2 | Ohne Menschen nicht wiederholbar | Die Config, die Dateirechte, ein fehlendes Werkzeug, ein Lock in einem anderen Prozess. doctor ausführen. systemd startet den Watch-Dienst bei einer 2 nicht neu. |
Damit ist reportedip-agent status direkt als Monitoring-Prüfung verwendbar, ohne
Wrapper-Skript und ohne Ausgabe zu parsen. status --json gibt dasselbe Ergebnis als
JSON-Dokument aus; die Einrichtung für Zabbix, Nagios, Icinga, Checkmk und Prometheus steht unter
Monitoring.
Die Reputation der eigenen Adresse dieses Hosts
Der Sync-Lauf fragt den Server mindestens einmal am Tag, und bei offenem Zustand in jedem Lauf, was er von der Adresse hält, von der dieser Host meldet. Steht
diese Adresse selbst in der Community-Datenbank, warnt
status und endet mit Exit 1. Ab einer Confidence von 75 ist zusätzlich der Zustand reputation offen, mit der Confidence, der Anzahl der Reports und dem Link auf die
Delisting-Seite im Text. Es ist eine Warnung und kein Fehler, denn eine gelistete
Adresse ist eine Aussage über das Netz, in dem der Host steht, und nicht zwingend über den Host:
eine geteilte Adresse, ein Carrier-NAT oder ein Nachbar hinter demselben Proxy können sie dorthin
bringen. Einen Blick ist es trotzdem wert, denn ein Host, der von einer gelisteten Adresse meldet,
sieht von außen so aus wie ein übernommener Host. Prüfen Sie, was die Maschine verlässt, beantragen
Sie das Delisting, sobald sie sauber ist, und der Zustand verschwindet mit dem nächsten Sync nach
dem Delisting; auf dem Host ist nichts zurückzusetzen. Unter 75 entsteht kein Zustand: eine Handvoll
alter Reports ist ehrliche Datenlage und nichts, worauf ein Betreiber reagieren kann, und kein Feed
liefert eine Adresse mit diesem Wert aus.
Problembehebung
Ein Symptom, eine wahrscheinliche Ursache, ein Befehl. reportedip-agent doctor und
reportedip-agent status beantworten gemeinsam die meisten dieser Fälle, und es sind die
zwei Dinge, nach denen der Support zuerst fragt.
| Symptom | Ursache | Befehl |
|---|---|---|
| Startet nicht und nennt seine Config-Datei | Die Datei ist für Gruppe oder andere lesbar, und sie enthält Ihren API-Key. | chmod 0600 /etc/reportedip-agent/config.yaml && chown root:root /etc/reportedip-agent/config.yaml |
| Exit 2 mit „field ... not found in type“ | Ein unbekannter Schlüssel in der Config. Der Parser ist absichtlich streng. | Den genannten Schlüssel entfernen oder korrigieren. Die Liste der gültigen Schlüssel steht oben. |
| Jeder Befehl endet nach einem Rollback mit Exit 2 | Die Binärdatei ist älter als die Config und kann einen neueren Block nicht lesen. | reportedip-agent update, der eine Befehl, der die Datei locker liest und die unbekannten Schlüssel nennt. |
Ein älteres Binary endet mit Exit 2 auf einer Config mit notify.relay | Dieser Schlüssel ist neuer als das Binary. Dieselbe Klasse Falle wie die Zeile darüber, und sie hat schon zweimal Hosts ungeschützt gelassen. | Die Zeile relay: aus dem notify-Block entfernen, oder vorwärts statt zurück: reportedip-agent update. |
| Die Sets existieren, sind aber leer | Entweder wurde der Feed abgelehnt oder die Liste ist an der Größenprüfung gescheitert. | reportedip-agent status sagt, welches von beidem, und die Zeile der Liste trägt den letzten Fehler. |
status sagt unlicensed | Das Konto hat für diesen Host keine Lizenz frei. | Eine unter Agent Servers hinzufügen. Die Liste im Kernel arbeitet in der Zwischenzeit weiter. |
| Es wird nie etwas gemeldet | Die Quelle, die gegriffen hätte, wurde nie erkannt, oder ihr Schwellwert wird nicht erreicht. | reportedip-agent test /path/to/log, dann reportedip-agent status und den Abschnitt sources lesen. |
| Es wird nie etwas geblockt, obwohl Reports rausgehen | ban.enabled wurde auf false gesetzt, oder mode auf log (ab Werk blocken beide). Zwei Schalter. | reportedip-agent ban list sagt in seinen letzten Zeilen, welches von beidem. |
| Gar kein Quellzustand vorhanden | Der Watch-Daemon ist nie gelaufen. | systemctl enable --now reportedip-agent.service |
Eine Quelle zeigt files=0 | Der Pfad oder Glob löst auf diesem Host auf nichts auf. | reportedip-agent doctor nennt die Quelle und das versuchte Muster. |
| Ein Dienst, der nach dem Agenten installiert wurde, meldet nichts | Erkannt wird einmal, zur Installationszeit, und das ist Absicht: ein Dienst, der für eine Wartung gestoppt ist, darf eine Quelle nie abschalten. In der Gegenrichtung passiert von allein genauso wenig, ein Mailserver, der auf einem Host dazukommt, der vorher keinen hatte, wird also nicht aufgenommen. | reportedip-agent doctor nennt das Log, das dieser Dienst schreibt, sagt, dass keine Quelle es liest, und steigt mit 1 aus. Tragen Sie die Quelle in config.yaml nach und starten Sie den Watch-Dienst neu. |
| Eine Log-Quelle gilt als unlesbar | Die Datei ist auch für root nicht lesbar. Meist ein Control Panel, das bei der Rotation Modus 000 setzt. | ls -l auf den Pfad, und die Rotation korrigieren, die das erzeugt hat. |
| Eine Quelle hat Treffer, meldet aber nie | Ihre Logzeitstempel sind mehr als eine Minute von der Systemuhr entfernt, das Zählfenster füllt sich also nie. | reportedip-agent doctor, die Drift-Zeilen unter sources. Die Zeitzone dieses Logs korrigieren. |
| Ihre eigene Adresse wurde gesperrt | Sie stand nicht auf der Whitelist. | reportedip-agent whitelist add <address>. Sofort wirksam, denn die Whitelist-Regel steht vor der Blockregel. |
Eine Sperre steht in bans.json, aber nicht im Kernel | Ein Reboot ohne Sync, oder ein Firewall-Reload, der das Set mitgenommen hat. | reportedip-agent sync stellt sie mit der Restzeit wieder her. |
Ein Kernel-Eintrag mit Datensatz none | Jemand hat mit ipset oder nft von Hand gesperrt, oder der Speicher ist verloren. Er läuft ab, aber kein Reboot bringt ihn zurück. | reportedip-agent ban list |
| Ein Set existiert mit falschem Typ oder ohne Timeout | Ein Überrest des dokumentierten Shell-Skripts oder eines anderen Werkzeugs. | ipset destroy <set> und danach reportedip-agent sync, das es korrekt neu anlegt. |
Beide Werkzeugketten haben rip--Objekte | Das Backend wurde ohne Migration gewechselt. | reportedip-agent sync --migrate-backend, und status gibt die genauen Entfernungsbefehle für die andere Seite aus. |
| Die Firewall ist nach einem Reboot weg | Ein gespeichertes Ruleset verweist auf ein rip--Set, und iptables-restore verwirft bei einem unbekannten Set die ganze Datei. | grep -n rip- /etc/iptables/rules.v4 /etc/iptables/rules.v6 und diese Zeilen entfernen. Der Agent braucht nichts Gespeichertes. |
| Eine entfernte Quelle wird weiter gelesen | Ein systemctl restart reicht für eine entfernte Quelle nicht. | systemctl stop reportedip-agent.service && systemctl start reportedip-agent.service |
| Reports hören auf, die Erkennung läuft weiter | Die Plattengrenze wurde erreicht. | Platz freimachen, dann reportedip-agent housekeeping. |
| HTTP 429 bei Reports | Das Tageslimit für Reports Ihres Tarifs. | Die Limits stehen unter Authentifizierung. |
| Die Queue wächst immer weiter | Der Sender ist nach einem Fehler pausiert, mit einem Backoff. | reportedip-agent status zeigt die Pause und den Grund; läuft der Daemon, sendet er selbst, und reportedip-agent report-queue sendet nur, wenn der Daemon nicht läuft. |
| Jeder Web-Treffer ist dieselbe Handvoll Adressen | nginx sieht einen Proxy oder Cloudflare und nicht den Besucher. | set_real_ip_from konfigurieren. reportedip-agent install warnt genau vor diesem Fall. |
| „more addresses than the counter tracks at once“ | Ein Scan, der breiter ist als der Zähler pro Quelle. Kein Fehler. | Nichts. Ein so breiter Scan ist ein Fall für die Community-Liste und nicht für lokale Sperren. |
status sagt, der Host sei bei den Versionen zurück | Das automatische Update kommt nicht durch, oder auto_update ist aus. | reportedip-agent update --check, dann reportedip-agent update. |
status sagt group=none | Der Key dieses Hosts ist in keiner Gruppe. Kein Fehler: das Set rip-group bleibt leer. | Legen Sie unter Groups in Ihrem Konto eine Gruppe an und hängen Sie die Keys der Hosts hinein; der nächste Sync füllt das Set. |
status warnt vor der Reputation der Adresse dieses Hosts | Die Adresse, von der dieser Host meldet, steht in der Community-Datenbank. | Prüfen, was die Maschine verlässt, dann das Delisting beantragen. Der Zustand verschwindet mit dem nächsten Sync danach. |
Keine rip-scan:-Zeilen im Kernel-Log | Keine Quelle scan in der Config, oder der Sync, der die Regel baut, lief seit dem Nachtragen nicht. | - type: scan unter sources eintragen, den Watch-Dienst neu starten, dann reportedip-agent sync. Adressen auf der Whitelist und bereits verworfene Adressen erzeugen nie eine Zeile. |
Zuletzt aktualisiert: · Betreut vom ReportedIP-Team