fail2ban Filter, Error: return 200

ascTim

New Member
Hallo!

Ich möchte einen fail2ban-Filter erstellen, der mir meine log, nennen wir sie smtpauth.log, überwacht.

Beispiele von heute wären zum Beispiel:

PHP:
May 29 10:00:09 www pdadmin[27151]: User samantha: smtp-auth login failed from 94.xxx.xxx.xxxx (no such user)
May 29 10:00:10 www pdadmin[27167]: User newsletter: smtp-auth login failed from 112.xxx.xxx.xxx (no such user)


Jetzt habe ich mir einige Beiträge im Internet durchgelesen und nach bestem Wissen und Gewissen auf meine Bedürfnisse angepasst, aber irgendwas scheint noch nicht zu klappen.

Beim Starten des fail2ban-Dienstes bekomme ich folgende Rückmeldung:
PHP:
2017-05-29 11:45:47,786 fail2ban.jail   : INFO   Creating new jail 'smtpauth'
2017-05-29 11:45:47,786 fail2ban.jail   : INFO   Jail 'smtpauth' uses poller
2017-05-29 11:45:47,806 fail2ban.filter : INFO   Added logfile = /var/log/mail.log
2017-05-29 11:45:47,806 fail2ban.filter : INFO   Set maxRetry = 5
2017-05-29 11:45:47,807 fail2ban.filter : INFO   Set findtime = 600
2017-05-29 11:45:47,808 fail2ban.actions: INFO   Set banTime = 3600
2017-05-29 11:45:47,808 fail2ban.filter : ERROR  Unable to compile regular expression '\smtp-auth login failed from (?:::f{4,6}:)?(?P<host>[\w\-.^_]+) (no such user)\'
2017-05-29 11:45:47,817 fail2ban.jail   : INFO   Creating new jail 'ssh-ddos'
2017-05-29 11:45:47,817 fail2ban.jail   : INFO   Jail 'ssh-ddos' uses poller
2017-05-29 11:45:47,818 fail2ban.filter : INFO   Added logfile = /var/log/auth.log
2017-05-29 11:45:47,818 fail2ban.filter : INFO   Set maxRetry = 20
2017-05-29 11:45:47,829 fail2ban.filter : INFO   Set findtime = 600
2017-05-29 11:45:47,829 fail2ban.actions: INFO   Set banTime = 3600
2017-05-29 11:45:47,834 fail2ban.jail   : INFO   Creating new jail 'ssh'
2017-05-29 11:45:47,834 fail2ban.jail   : INFO   Jail 'ssh' uses poller
2017-05-29 11:45:47,835 fail2ban.filter : INFO   Added logfile = /var/log/auth.log
2017-05-29 11:45:47,836 fail2ban.filter : INFO   Set maxRetry = 4
2017-05-29 11:45:47,836 fail2ban.filter : INFO   Set findtime = 600
2017-05-29 11:45:47,837 fail2ban.actions: INFO   Set banTime = 3600
2017-05-29 11:45:47,905 fail2ban.jail   : INFO   Jail 'smtpauth' started
2017-05-29 11:45:47,909 fail2ban.jail   : INFO   Jail 'ssh-ddos' started
2017-05-29 11:45:47,911 fail2ban.jail   : INFO   Jail 'ssh' started
2017-05-29 11:45:47,915 fail2ban.actions.action: ERROR  iptables -N fail2ban-smtpauth
iptables -A fail2ban-smtpauth -j RETURN
iptables -I INPUT -p all -m multiport --dports all -j fail2ban-smtpauth returned 200


Konfiguration sieht folgendermaßen aus:
filter.d/smtpauth.conf:
PHP:
[Definition]
failregex = \smtp-auth login failed from <HOST> (no such user)\
ignoreregex =

jail.local:
PHP:
[smtpauth]

enabled = true
port	= all
filter	= smtpauth
logpath = /var/log/smtpauth.log
maxretry = 6


Ich weiß nicht weiter, wo liegt der Fehler?

Besten Dank für Eure Antworten!


Tim
 
Die Regel lässt sic nicht in iptables hinzufügen.
Das kann auf manchen vServern passieren.
Oder es ist eine veraltete fail2ban-Version, die diesen Fehler hat, wenn gerade die Regel geändert wird und noch ein Prozess Zugriff auf iptables hat.
http://www.murawski.ch/2012/04/fail2ban-problem-mit-returned-200-im-logfile/

Code:
failregex = \smtp-auth login failed from <HOST> (no such user)\
Was ist den das!?
So ein Regex braucht kein Backspace, also weg damit.
Korrigiere das doch mal.
 
Last edited by a moderator:
Danke für die schnelle Antwort.

Den Fehler
PHP:
2017-05-29 11:45:47,808 fail2ban.filter : ERROR  Unable to compile regular expression '\smtp-auth login failed from (?:::f{4,6}:)?(?P<host>[\w\-.^_]+) (no such user)\'
konnte ich beheben.

Der neue Filter sieht nun so aus:
PHP:
[Definition]
failregex = [[]smtp-auth login failed from <HOST> (no such user)[]]
ignoreregex =

Leider immer noch die selbe Error-Meldung.
Fail2ban habe ich letzte Woche installiert, sollte also aktuell sein.
 
Der neue Filter sieht nun so aus:
PHP:
[Definition]
failregex = [[]smtp-auth login failed from <HOST> (no such user)[]]
ignoreregex =
Auch das ist falsch.

Das ist hier wohl gemeint.
Code:
failregex = smtp-auth login failed from <HOST> (no such user)
 
Das ist hier wohl gemeint.
Code:
failregex = smtp-auth login failed from <HOST> (no such user)

Ok habe ich geändert. Bekomme nur immer noch die Fehlermeldung...

PHP:
2017-05-29 12:07:04,003 fail2ban.actions.action: ERROR  iptables -N fail2ban-smtpauth
iptables -A fail2ban-smtpauth -j RETURN
iptables -I INPUT -p tcp -m multiport --dports all -j fail2ban-smtpauth returned 200
 
Öffne mal die Shell.
Starte einzeln:
iptables -N fail2ban-smtpauth
iptables -A fail2ban-smtpauth -j RETURN
iptables -I INPUT -p tcp -m multiport --dports all -j fail2ban-smtpauth

Poste die Meldungen.
 
Das hilft mir schon weiter:

PHP:
root@server:~# iptables -N fail2ban-smtpauth
iptables: Chain already exists.

PHP:
root@server:~# iptables -A fail2ban-smtpauth -j RETURN

PHP:
root@server:~# iptables -I INPUT -p tcp -m multiport --dports all -j fail2ban-smtpauth
iptables v1.4.8: invalid port/service `all' specified
Try `iptables -h' or 'iptables --help' for more information.

Demnach passt das "--dports all" nicht. Kann ich das theoretisch weglassen?
 
Umbenennen hat nichts geändert. Ich denke, dass der Eintrag "port = all" stört..

Mit "port = 25" kann ich den Dienst ohne Fehler starten, aber es scheint nichts zu passieren.
Muss ich hier noch ein "action =" dranhängen?
 
Mit port = anyport geht es auch nicht...

PHP:
root@server:~# iptables -I INPUT -p tcp -m multiport --dports anyport -j fail2ban-smtpauth
iptables v1.4.8: invalid port/service `anyport' specified
Try `iptables -h' or 'iptables --help' for more information.


Nochmal zur Übersicht

Zu erkennender Log-Eintrag:
PHP:
May 30 09:54:02 www pdadmin[11434]: User barton: smtp-auth login failed from 156.xxx.xxx.xxx (no such user)

jail.local:
PHP:
[smtpauth]

enabled = true
port = 25,587
filter	= smtpauth-filter
logpath = /var/log/mail.log
maxretry = 6
action = iptables[name=smtpauth, port=smtp, protocol=tcp]

smtpauth-filter:
PHP:
[Definition]
failregex = smtp-auth login failed from <HOST> (no such user)
ignoreregex =
 
port = anyport bezieht sich auf das jail von Fail2ban.
Aber du hast ja jetzt Ports im Jail gesetzt.

Du kannst doch den Filter-Regex testen, in dem du beispielsweise
fail2ban-regex /var/log/maillog /etc/fail2ban/filter.d/smtpauth-filter
aufrufst.

Und was klappt jetzt nicht?
 
Last edited by a moderator:
Hatte ich eigentlich so drin und habe dann wieder "return 200" erhalten. Nun geht es scheinbar.

Wenn ich den Befehl eingebe, bekomme ich ganz ganz oft folgende Rückmeldung:

PHP:
No 'host' group in '/etc/fail2ban/filter.d/smtpauth-filter'
Cannot remove regular expression. Index 0 is not valid

Nach Strg+C dann noch das hier:

PHP:
^CTraceback (most recent call last):
  File "/usr/bin/fail2ban-regex", line 372, in <module>
    fail2banRegex.testRegex(line)
  File "/usr/bin/fail2ban-regex", line 241, in testRegex
    self.__filter.delFailRegex(0)
  File "/usr/share/fail2ban/server/filter.py", line 94, in delFailRegex
    "valid" % index)
  File "/usr/lib/python2.6/logging/__init__.py", line 1082, in error
    self._log(ERROR, msg, args, **kwargs)
  File "/usr/lib/python2.6/logging/__init__.py", line 1173, in _log
    self.handle(record)
  File "/usr/lib/python2.6/logging/__init__.py", line 1183, in handle
    self.callHandlers(record)
  File "/usr/lib/python2.6/logging/__init__.py", line 1220, in callHandlers
    hdlr.handle(record)
  File "/usr/lib/python2.6/logging/__init__.py", line 679, in handle
    self.emit(record)
  File "/usr/lib/python2.6/logging/__init__.py", line 776, in emit
    msg = self.format(record)
  File "/usr/lib/python2.6/logging/__init__.py", line 654, in format
    return fmt.format(record)
  File "/usr/lib/python2.6/logging/__init__.py", line 436, in format
    record.message = record.getMessage()
  File "/usr/lib/python2.6/logging/__init__.py", line 305, in getMessage
    if self.args:
KeyboardInterrupt
 
Wenn du das Programm mit Ctrl+C hart abwürgst, kommt so eine Fehlemeldung.

Mein Hinweis auf das Prüfen des Regex war ein Beispiel, nicht die Lösung. Es wird ein bisschen unüberrsichtlich wie deine Jails, die dazugehörigen Filter und die erzeugten Iptables-Regeln heißen.

Existiert denn der Filter /etc/fail2ban/filter.d/smtpauth-filter ?
Du musst schon die richtige Datei nehmen, in der dein erstellter Filter drin ist.

//EDITH:
Aber du schreibst ja jetzt, es geht. Ist dein Problem also gelöst.
 
Ok dann "stimmen" die Fehlermeldungen ja.

Der Filter exisitert genau so wie geschrieben.


Sorry, falsch ausgedrückt. Ich meinte: Das Starten von fail2ban klappt jetzt wieder ohne Fehler.

Edit:
Hab das Programm durchlaufen lassen, am Ende bekomme ich das:
PHP:
Results
=======

Failregex
|- Regular expressions:
|  [1] /etc/fail2ban/filter.d/smtpauth-filter
|
`- Number of matches:
   [1] 0 match(es)

Ignoreregex
|- Regular expressions:
|
`- Number of matches:

Summary
=======

Sorry, no match

Look at the above section 'Running tests' which could contain important
information.

Stimmt denn dann mein Filter vielleicht nicht?
 
Ich habe es gerade nicht parat was Python da macht, aber es kann sein, dass im Filter die Klammern, um wirklich als solche erkannt zu werden, im Regex escaped werden müssen:
Code:
failregex = smtp-auth login failed from <HOST> \(no such user\)

probiere es doch mal.

Und dein SMTP-Log ist wirklich /var/log/mail.log und nicht /var/log/maillog?
 
Ja, die Log heißt so.

Jetzt finde ich folgendes in der Log:
PHP:
2017-05-31 10:45:18,767 fail2ban.actions: WARNING [smtpauth] Ban 199.xxx.xxx.xxx
2017-05-31 10:45:42,798 fail2ban.actions: WARNING [smtpauth] Ban 162.xxx.xxx.xxx

Es funktioniert! :) Die Klammern waren wohl problematisch.


Vielen Dank Gwen!
 
Back
Top