Von Hause aus unterstützt Fail2Ban bis einschließlich Version 0.9 nur IPv4-Adressen. Durch eine recht kleine Anpassung lässt es sich jedoch auch auf IPv6 erweitern. Im folgenden Abschnitt wird beschrieben welche Anpassungen vorgenommen werden müssen, damit Fail2Ban auch IPv6 Adressen erkennt und gegebenenfalls blockiert.
Hinweis: Ab Version 0.10 unterstützt Fail2Ban standardmäßig IPv4 und IPv6, wodurch die hier gezeigten Patches nicht mehr nötig sind.
Alle im folgenden gezeigten Dateien sind auch in unserem zugehörigen GitLab-Repository zu finden und können von dort aus heruntergeladen werden.
IPv4/IPv6 Weiche
Zuerst muss im Verzeichnis /usr/bin/
eine Datei als Weiche zwischen IPv4 und IPv6 mit folgendem Inhalt erstellt werden:
Zur Vereinfachung kann diese Datei auch direkt aus unserem Repository mit Hilfe von wget
heruntergeladen werden:
wget -O /usr/bin/ip64tables "https://git.cryhost.de/crycode/fail2ban-ipv6-patch/raw/master/ip64tables"
Anschließend machen wir die Datei noch ausführbar:
chmod +x /usr/bin/ip64tables
Neue Aktion bei Fail2Ban hinzufügen
Im Verzeichnis /etc/fail2ban/action.d/
legen wir zwei Dateien mit folgendem Inhalt an:
Zur Vereinfachung können diese beiden Dateien auch direkt aus unserem Repository mit Hilfe von wget
heruntergeladen werden:
wget -O /etc/fail2ban/action.d/ip64tables-multiport.conf "https://git.cryhost.de/crycode/fail2ban-ipv6-patch/raw/master/ip64tables-multiport.conf" wget -O /etc/fail2ban/action.d/ip64tables-allports.conf "https://git.cryhost.de/crycode/fail2ban-ipv6-patch/raw/master/ip64tables-allports.conf"
Fail2Ban-Dateien Patchen
Damit Fail2Ban die IPv6-Adressen auch richtig erkennt, müssen die beiden Dateien failregex.py
und filter.py
gepachtet werden.
Je nach Fail2Ban-Version sind dafür unterschiedliche Patches nötig.
Die aktuell verwendete Version von Fail2Ban kann über den folgenden Befehl ermittelt werden:
nutzer@server:~$ fail2ban-server -V Fail2Ban v0.9.3 Copyright (c) 2004-2008 Cyril Jaquier, 2008- Fail2Ban Contributors Copyright of modifications held by their respective authors. Licensed under the GNU General Public License v2 (GPL). Written by Cyril Jaquier <cyril.jaquier@fail2ban.org>. Many contributions by Yaroslav O. Halchenko <debian@onerussian.com>.
Abhängig von der Version legen wir zuerst die zwei patch-Dateien im Verzeichnis /tmp
an, beziehungsweise laden diese mit Hilfe von wget
direkt aus dem Repository herunter.
Im Folgenden sind die patch-Dateien für Fail2Ban ab v0.9.1 zu finden. patch-Dateien für ältere Versionen sind im Repository enthalten.
Fail2Ban v0.9.3, v0.9.4, v0.9.5
(Debian stretch/sid, Ubuntu wily/xenial)
wget -O /tmp/failregex.patch "https://git.cryhost.de/crycode/fail2ban-ipv6-patch/raw/fail2ban-v0.9.3/failregex.patch" wget -O /tmp/filter.patch "https://git.cryhost.de/crycode/fail2ban-ipv6-patch/raw/fail2ban-v0.9.3/filter.patch"
Fail2Ban v0.9.1 (Ubuntu vivid)
wget -O /tmp/failregex.patch "https://git.cryhost.de/crycode/fail2ban-ipv6-patch/raw/fail2ban-v0.9.1/failregex.patch" wget -O /tmp/filter.patch "https://git.cryhost.de/crycode/fail2ban-ipv6-patch/raw/fail2ban-v0.9.1/filter.patch"
Anschließend wenden wir die beiden Patches noch an, wobei je nach System die py-Dateien unter /usr/share/fail2ban/server/
oder /usr/lib/python3/dist-packages/fail2ban/server/
liegen:
patch -l -b /usr/share/fail2ban/server/failregex.py /tmp/failregex.patch patching file /usr/share/fail2ban/server/failregex.py patch -l -b /usr/share/fail2ban/server/filter.py /tmp/filter.patch patching file /usr/share/fail2ban/server/filter.py
Beziehungsweise:
patch -l -b /usr/lib/python3/dist-packages/fail2ban/server/failregex.py /tmp/failregex.patch patching file /usr/lib/python3/dist-packages/fail2ban/server/failregex.py patch -l -b /usr/lib/python3/dist-packages/fail2ban/server/filter.py /tmp/filter.patch patching file /usr/lib/python3/dist-packages/fail2ban/server/filter.py
Durch den Parameter -b
wird beim Patchen jeweils ein Backup der Originaldatei (failregex.py.orig
bzw. filter.py.orig
) angelegt. Sollte etwas schief gehen kann damit jederzeit der Ausgangszustand wiederhergestellt werden.
Einstellungen anpassen
Damit Fail2Ban die neuen Aktionen verwendet müssen alle banaction-Einträge in der Datei jail.local
angepasst werden.
Dabei ändern wir überall in der Datei iptables-multiport
in ip64tables-multiport
und iptables-allports
in ip64tables-allports
. Sollten noch andere Aktionen im Einsatz sein, so müssen diese gegebenenfalls auch angepasst werden.
Fail2Ban neustarten und iptables sowie ip6tables kontrollieren
Damit die Änderungen wirksam werden muss Fail2Ban neugestartet werden:
systemctl restart fail2ban.service beziehungsweise /etc/init.d/fail2ban restart
Anschließend kontrollieren wir noch die aktuellen iptables
und ip6tables
:
iptables -L -n -v ip6tables -L -n -v
Wenn alles geklappt hat, dann sind jetzt in beiden Ausgaben die Regeln und Ketten (Chain) von Fail2Ban zu sehen.
11. Mai. 2017 um 15:06
Hi,
ich nutze IPv6 mit NAT, da mein Router das nicht anders unterstützt und ich eigentlich auch nicht möchte, dass jedes Gerät eine öffentliche IP bekommt.
Nun stehen aber (zB) im Apache Log auch der Port, der fürs NATing verwendet wurde und zwar ebenfalls mit einem Doppelpunkt. Mit den aktuellen Patches erkennt fail2ban nicht den Port (obwohl normalerweise 5-stellig und nicht 4-stellig, wie ein IPv6 Feld) und ergänzt ihn zur Adresse. Zu werden in meinem Test zwar meine Zugriffsversuche erkannt und die IP geblockt, jedoch kann ich trotzdem noch zugreifen, weil Iptables mich mit angehängtem NAT Port nicht erkennt. (Das ist meine Vermutung)
Ist es möglich den Patch so zu verändern, das die IPv6 Adressen nur bis zu ihrer eigentlichen Länge erkannt werden?
11. Mai. 2017 um 18:52
Hallo Levin,
ich sehe da momentan keine Möglichkeit, das Problem mit Änderung der Patches zu beheben. Die IPv6 Adressen erscheinen auch oft in verkürzter Schreibweise (z.B. 1234:5678:abcd::4) in den Logs, wodurch eine Festlegung auf eine bestimmte Länge der IPv6 Adresse nicht möglich ist. Somit gibt es für den Erkennungs-RegEx keine eindeutige Möglichkeit den Port am Ende zu erkennen.
Eine Variante das Problem zu umgehen wäre, das Log Format vom Apache anzupassen. Siehe dazu auch http://httpd.apache.org/docs/current/mod/mod_log_config.html
11. Mai. 2017 um 20:07
Hi,
danke für die Antwort!
Ich habe aber keine Möglichkeit gefunden, das Format des ErrorLogs anzupassen, soweit ich gesehen hab geht das nur beim CustomLog. Die regex Ausdrücke aus dem apache-auth filter sind aber auf den ErrorLog gemünzt. Kann man den ErrorLog irgendwie anpassen oder Fail2Ban den customLog beibringen?
11. Mai. 2017 um 20:26
Hab grad ErrorLogFormat gefunden… (https://httpd.apache.org/docs/2.4/en/mod/core.html#errorlogformat) Allerdings scheint es keine Variable zu geben, die nur die IP anzeigt, nicht den Port…
12. Mai. 2017 um 15:39
Inzwischen bin ich auf einen anderen Lösungsansatz umgestiegen und habe version 0.10 mit IPv6 support manuell installiert.
6. Mrz. 2018 um 11:03
Zeile 1 des Listing “Download aus dem Repository”:
wget -O /tmp/failregex.patch “https://git.cryhost.de/crycode/fail2ban-ipv6-patch/raw/fail2ban-v0.9.1/filter.patch”
Ich denke mal das ist ein typo (die URL verweist auf die falsche Datei)
systemclt restart fail2ban.service
->
systemctl restart fail2ban.service
🙂
6. Mrz. 2018 um 13:20
Oh, danke für die Info!
Ich habe den Beitrag entsprechend korrigiert.