fail2ban Regex für FlashMQ Log gesucht

Avenger84

Lt. Commander
Registriert
Feb. 2008
Beiträge
1.608
Hallo, nachdem ich meinen Nginx erfolgreich in fail2ban eingerichtet habe, würde ich gern noch FlashMQ dazu nehmen.

Hier mal ein Auszug vom flashmq.log:

Code:
[2025-01-13 08:26:36.017] [NOTICE] [main] Accepting connection from: address='199.45.155.91', transport='TCP/Websocket/SSL', fd=20
[2025-01-13 08:26:36.339] [NOTICE] [T 1] Removing client '[ClientID='', username='', fd=20, keepalive=10s, transport='TCP/Websocket/SSL', address='199.45.155.91', prot=none, clean=0]'. Reason(s): Hang up, Connection reset by peer
[2025-01-13 08:26:36.589] [NOTICE] [main] Accepting connection from: address='199.45.155.91', transport='TCP/Websocket/SSL', fd=20
[2025-01-13 08:26:36.973] [NOTICE] [T 0] Removing client '[ClientID='', username='', fd=20, keepalive=10s, transport='TCP/Websocket/SSL', address='199.45.155.91', prot=none, clean=0]'. Reason(s): Hang up, Connection reset by peer
[2025-01-13 08:26:37.240] [NOTICE] [main] Accepting connection from: address='199.45.155.91', transport='TCP/Websocket/SSL', fd=20
[2025-01-13 08:26:37.250] [ERROR] [T 1] Packet read/write error: Problem accepting SSL socket: error:0A0000C1:SSL routines::no shared cipher. Removing client [ClientID='', username='', fd=20, keepalive=10s, transport='TCP/Websocket/SSL', address='199.45.155.91', prot=none, clean=0]
[2025-01-13 08:26:37.250] [NOTICE] [T 1] Removing client '[ClientID='', username='', fd=20, keepalive=10s, transport='TCP/Websocket/SSL', address='199.45.155.91', prot=none, clean=0]'. Reason(s): Problem accepting SSL socket: error:0A0000C1:SSL routines::no shared cipher
[2025-01-13 08:26:37.758] [NOTICE] [main] Accepting connection from: address='199.45.155.91', transport='TCP/Websocket/SSL', fd=20
[2025-01-13 08:26:38.058] [NOTICE] [T 0] Removing client '[ClientID='', username='', fd=20, keepalive=10s, transport='TCP/Websocket/SSL', address='199.45.155.91', prot=none, clean=0]'. Reason(s): Hang up, Connection reset by peer
[2025-01-13 08:26:38.314] [NOTICE] [main] Accepting connection from: address='199.45.155.91', transport='TCP/Websocket/SSL', fd=20
[2025-01-13 08:26:38.345] [ERROR] [T 1] Packet read/write error: Problem accepting SSL socket: error:0A000102:SSL routines::unsupported protocol. Removing client [ClientID='', username='', fd=20, keepalive=10s, transport='TCP/Websocket/SSL', address='199.45.155.91', prot=none, clean=0]
[2025-01-13 08:26:38.345] [NOTICE] [T 1] Removing client '[ClientID='', username='', fd=20, keepalive=10s, transport='TCP/Websocket/SSL', address='199.45.155.91', prot=none, clean=0]'. Reason(s): Problem accepting SSL socket: error:0A000102:SSL routines::unsupported protocol
[2025-01-13 08:26:38.938] [NOTICE] [main] Accepting connection from: address='199.45.155.91', transport='TCP/Websocket/SSL', fd=20
[2025-01-13 08:26:39.217] [NOTICE] [T 0] Removing client '[ClientID='', username='', fd=20, keepalive=10s, transport='TCP/Websocket/SSL', address='199.45.155.91', prot=none, clean=0]'. Reason(s): Hang up, Connection reset by peer
[2025-01-13 08:26:39.480] [NOTICE] [main] Accepting connection from: address='199.45.155.91', transport='TCP/Websocket/SSL', fd=20
[2025-01-13 08:26:39.802] [NOTICE] [T 1] Removing client '[ClientID='', username='', fd=20, keepalive=10s, transport='TCP/Websocket/SSL', address='199.45.155.91', prot=none, clean=0]'. Reason(s): Hang up, Connection reset by peer
[2025-01-13 08:26:40.077] [NOTICE] [main] Accepting connection from: address='199.45.155.91', transport='TCP/Websocket/SSL', fd=20
[2025-01-13 08:26:40.078] [ERROR] [T 0] Packet read/write error: Problem accepting SSL socket: error:0A0000C1:SSL routines::no shared cipher. Removing client [ClientID='', username='', fd=20, keepalive=10s, transport='TCP/Websocket/SSL', address='199.45.155.91', prot=none, clean=0]
[2025-01-13 08:26:40.078] [NOTICE] [T 0] Removing client '[ClientID='', username='', fd=20, keepalive=10s, transport='TCP/Websocket/SSL', address='199.45.155.91', prot=none, clean=0]'. Reason(s): Problem accepting SSL socket: error:0A0000C1:SSL routines::no shared cipher
[2025-01-13 08:26:40.639] [NOTICE] [main] Accepting connection from: address='199.45.155.91', transport='TCP/Websocket/SSL', fd=20
[2025-01-13 08:26:40.640] [ERROR] [T 1] Packet read/write error: Problem accepting SSL socket: error:0A00006C:SSL routines::bad key share. Removing client [ClientID='', username='', fd=20, keepalive=10s, transport='TCP/Websocket/SSL', address='199.45.155.91', prot=none, clean=0]
[2025-01-13 08:26:40.640] [NOTICE] [T 1] Removing client '[ClientID='', username='', fd=20, keepalive=10s, transport='TCP/Websocket/SSL', address='199.45.155.91', prot=none, clean=0]'. Reason(s): Problem accepting SSL socket: error:0A00006C:SSL routines::bad key share
ich möchte gern im Beispiel 199.45.155.91 bannen, nachdem er 3x einen [ERROR] mit "Problem accepting SSL" provoziert hat.

Da ich kein Regex Experte bin, hier mein fehlerhafter Vorschlag:
Code:
failregex = ^<[ERROR]>.*"Problem accepting SSL".*<HOST>.*$

Mein Regex für Nginx sieht so aus:
Code:
failregex = ^<HOST>.*"(GET|POST|PUT).*" (400|403|404).*$
hab den aus einem YT Video und etwas modifiziert, funktioniert perfekt.
 
Die funktionieren beide nicht weil du mit "^" beginnst und das nicht dein Zeilenstart ist. Da kommt ja noch der Timestamp und der matched eben da nicht.

Nachtrag: <[ERROR]> ist auch kein operand den fail2ban nimmt, da gibts nur <HOST> oder <ADDR>. Am besten mal hier durchschauen, ist eigentlich gut beschrieben: https://github.com/fail2ban/fail2ban/wiki/Developing-Regex-in-Fail2ban
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Helge01 und nospherato
kartoffelpü schrieb:
Bin ich auch nicht :)
Aber stell es doch mal nach, z.B. auf https://regex101.com/
so schlau war ich auch schon, aber der sagt bei jedem Ausdruck "no match", auch wenn es in fail2ban einwandfrei funktioniert, also unbrauchbar.

Kyze schrieb:
Die funktionieren beide nicht weil du mit "^" beginnst
hä? alle Filter starten mit ^ und der Nginx funkioniert, wie gesagt, einwandfrei.
 
Avenger84 schrieb:
failregex = ^<[ERROR]>."Problem accepting SSL".<HOST>.*$
Müsste eher so aussehen, dann klappt es auch unter https://regex101.com/ (die Seite funktioniert völlig korrekt)
Code:
\[ERROR\].*Problem accepting SSL.*$

Die Eckige Klammer muss escaped werden damit sie als "normales" Zeichen erkannt wird, sonst wird darin nur eine Zeichenauswahl definiert.

regex.png


match.png
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Avenger84
Wenn ich nur "Problem accepting SSL" + IP Adresse haben will, reicht da nicht:
Code:
failregex = ^Problem accepting SSL.*<HOST>.*$
 
Hör auf mit dem ^ vorn, das wird sonst nichts. Mag ja sein dass das bei NGINX funktioniert, aber dann fängt die Zeile auch so an. Tut sie bei FlashMQ offenbar nicht, deswegen matcht auch nix.

Übrigens kann man den fail2ban-regex nicht 1 zu 1 in regex101 kopieren, weil regex101 mit <HOST> nichts anfangen kann.
 
Die Zeile bei Nginx fängt so an:
Code:
203.138.147.67 - - [13/Jan/2025:12:08:21 +0100] "GET / HTTP/1.0" 404 146 "-" "curl/7.88.1"
52.167.144.172 - - [13/Jan/2025:12:21:04 +0100] "GET /sitemap.xml HTTP/2.0" 404 170 "-" "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm) Chrome/116.0.1938.76 Safari/537.36"
 
Avenger84 schrieb:
Die Zeile bei Nginx fängt so an:
Da ist ^<HOST> auch korrekt da die Zeile tatsächlich mit der IP-Adresse anfängt.

Das gilt hier aber nicht.
[2025-01-13 08:26:40.640] [ERROR] [T 1] Packet read/write error: Problem accepting SSL socket: error:0A00006C:SSL routines::bad key share. Removing client [ClientID='', username='', fd=20, keepalive=10s, transport='TCP/Websocket/SSL', address='199.45.155.91', prot=none, clean=0]
Deswegen darf hier kein ^ stehen. Das würde nur stimmen wenn:
Code:
^\[2025-01-13 08:26:40.640\]\s\[ERROR\].*Problem accepting SSL.*<HOST>.*$
Das Datum/Uhrzeit ändert sich aber, deswegen muss man es weg lassen.

So wäre es richtig:
Code:
\[ERROR\].*Problem accepting SSL.*<HOST>.*$

Ich würde um Fehlinterpretationen zu vermeiden soviel Info wie möglich mitgeben.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: kartoffelpü und Avenger84
vielen Dank, probiere ich aus!

Hab zwar immer noch nicht das \ verstanden bzw. was es machen soll aber egal 🤪
 
Man muss sich leider mit Regex etwas beschäftigen, wenn man entsprechende Matcher bauen will. Sonst wird das ganze nichts und man schießt einfach nur ins Blaue.

Aus meiner Sicht ist der "offizielle" Guide von fail2ban im github-wiki da gar nicht verkehrt.

Wenn ich solche Matcher baue, kopiere ich mir 10-20 Zeilen aus dem Log in regex101, tausche <HOST> mit (\d+\.\d+\.\d+\.\d+) und baue so lange rum, bis die Zeile passt und der d+d+d+ mit dem bereich passt, der nachher die IP-Adressen haben soll.

Dann kannst du den matcher in fail2ban übertragen, wieder das <HOST> reinpacken und dann mit den fail2ban-tools mal schauen, was er dir auf den Logfiles ausgibt.

Leicht modifiert klappt der query von Helge schon:
.*\s\[ERROR\].*Problem accepting SSL.*address='<HOST>'
 
  • Gefällt mir
Reaktionen: Avenger84
Ich würde es gleich so probieren:
Code:
.*\s\[ERROR\].*Problem accepting SSL socket.*address='<HOST>'.*$
oder so
Code:
^.*\[ERROR\].*Problem accepting SSL socket.*address='<HOST>'.*$
Ich sehe gerade @Kyze war schneller. ;)

Avenger84 schrieb:
Hab zwar immer noch nicht das \ verstanden
Eine eckige Klammer ist unter regex ein Metazeichen. Darin können Zeichenfolgen definiert werden. Sollte die eckige Klammer wirklich als solche interpretiert werden, muss sie mit einen Backslash escape werden.

Einfaches Beispiel.

\[ERROR\] wird als String [ERROR] interprediert.
reg1.png


[ERROR] ohne \ ist das gleiche wie [ERO] bedeutet das nach folgenden Buchstaben im String gesucht wird:
E R O
reg2.png
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Avenger84
Damit klappt es nun:
Code:
failregex = .*\s\[ERROR\].*Problem accepting SSL.*address='<HOST>'
vielen Dank 👍 wäre ich niemals drauf gekommen.

wenn ich noch weitere Texte bei Error Meldungen hinzufügen möchte mache ich das so:
Code:
failregex = .*\s\[ERROR\].*(Problem accepting SSL|another Problem|noch ein Problem).*address='<HOST>'
oder?

ich meinte eigentlich ^ den Kollegen habe ich immer noch nicht verstanden, nicht / 😉
also die Lösung:
Code:
^.*\[ERROR\].*Problem accepting SSL socket.*address='<HOST>'.*$
laut Kyze falsch
 
Zuletzt bearbeitet:
Mach es mit Hilfe von https://regex101.com/ und ersetze die IP-Adresse im regex und Test String durch <HOST>
Damit geht es am einfachsten und man sieht sofort die Auswirkung.
Ergänzung ()

Avenger84 schrieb:
Neeeee, das ist ja mein regex ;) :D

Der Unterschied zu deinem ist, dass zwischen ^ und dem eigentlichen regex sich noch .* befindet.
regex-1.png


deiner
regex-2.png


Deine Zeile im Logfile beginnt ja nicht mit [ERROR] sondern mit dem Datum.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Avenger84
Kyze schrieb:
Wenn ich solche Matcher baue, kopiere ich mir 10-20 Zeilen aus dem Log in regex101, tausche <HOST> mit (\d+\.\d+\.\d+\.\d+) und baue so lange rum, bis die Zeile passt und der d+d+d+ mit dem bereich passt, der nachher die IP-Adressen haben soll.
der Tipp des Tages - bin dabei 👍

Hier die Ergebnisse:
1736782823731.png

exakt gleich zu .\s\[ERROR\].*Problem accepting SSL socket.*address='(\d+\.\d+\.\d+\.\d+)'.$

Hier geht es nicht ganz bis zum Ende der Zeile:
1736782915468.png
 
Zuletzt bearbeitet:
Zurück
Oben