Fail2Ban / IPTables auf Netcup VServern

Auf Grund von andauernden Brute Force Angriffen auf meinen Server, hatte ich mich dazu entschlossen, fail2ban einzurichten. Ich musste dann aber feststellen, dass wegen der Virtualisierungslösung von Netcup der Zugriff auf die Iptables nur über ein Webinterface möglich ist.

Es existierte zwar ein Script für das alte Webinterface, dieses funktionierte bei mir allerdings nur selten, oder gar nicht.
Deshalb habe ich mit dem alten Script als Basis ein neues geschaffen, mit dem es möglich ist, die Firewall vom Server aus über das neue VCP zu steuern.

Achtung, die nachfolgende Anleitung ist nicht mehr aktuell, da es mittlerweile eine API vom VCP gibt. Hier eine Anleitung für die Nutzung der API: VCP-API-Fail2ban

Damit das folgende Script funktioniert muss curl installiert sein. Für Debian:

apt-get install curl

Zuerst entfernt ihr alles, was in „/etc/fail2ban/action.d/“ ist und erstellt dann folgendes Script als „sync.sh“ im Ordner „action.d“ und gebt ihm x-Rechte (Userdaten im Script nicht vergessen).
Script:

#!/bin/sh
#
# Als Anreiz diente ein Script von
# Michael Geiger - tux1337 - www.geigers-site.de
#
# Der erste Parameter nimmt die IP, der zweite den Befehl (add oder del)
#
# Copyright (C) 2011 Christoph Schuster | ndurchx | www.n-durch-x.de
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 3 of the License, or (at your
# option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, see <http://www.gnu.org/licenses/>.
#
 
#check for running process
while [ -e /tmp/nvcp/vcp.pid ]; do
    if ( kill -0 `cat /tmp/nvcp/vcp.pid` 2> /dev/null ); then
        sleep 5
    else
        rm -R /tmp/nvcp
    fi
done
#CONFIG
user="" #your vcp login name
password="" #your vcp password
servername="" #your vserver name (vXXXXXXXXXXXX)
#CONFIG END
 
#PARAMETERS # normally you dont have to change that
direction="INPUT"
protokoll="ANY"
sourceip="$1"
ownipv4="0.0.0.0/0"
ownipv6="%3A%3A%2F0"
policy="DROP"
#PARAMETERS END
 
mkdir /tmp/nvcp
chmod 600 /tmp/nvcp
cd /tmp/nvcp
echo $$ > vcp.pid
 
iptest=`echo $sourceip | grep ".*:.*:.*" | wc -l`
 
if [[ "$iptest" -ge "1" ]]
then
  ipversion="v6"
else
  ipversion="v4"
fi
 
updateRulesV6() {
	curl -b cookie.txt -d "updateRules=updateRules" --url "https://www.vservercontrolpanel.de/VServers?selectedVServerId=$serverid&page=filter&section=IPv6"
}
 
updateRulesV4() {
        curl -b cookie.txt -d "updateRules=updateRules" --url "https://www.vservercontrolpanel.de/VServers?selectedVServerId=$serverid&page=filter&section=IPv4"
}
 
#Login
curl -b cookie.txt -c cookie.txt -d "doLogin=Login&username=$user&password=$password" --url https://www.vservercontrolpanel.de/Login
 
curl -b cookie.txt -o tmp.txt --url https://www.vservercontrolpanel.de/Home
tr -d \012 < tmp.txt > servers.txt
serverid=`grep -o "selectedVServerId=[0-9]{1,10}[^0-9]*$servername" servers.txt | grep -m 1 -o "Id=[0-9]*" | grep -o [0-9]*`
banaction="addRule=addRule&addRuleSubmit=hinzuf%C3%BCgen&direction=$direction&foreignip=$sourceip&match=STATE&ESTABLISHED=ESTABLISHED&NEW=NEW&RELATED=RELATED&proto=$protokoll&sortINPUT=1&sortOUTPUT=1&target=$policy"
 
case "$2" in
    add)
 
        curl -b cookie.txt -d "$banaction&ipType=IPv6&ownip=$ownipv6" --url "https://www.vservercontrolpanel.de/VServers?selectedVServerId=$serverid&page=filter&section=IPv6"
	updateRulesV6
        if [[ "$ipversion" != "v6" ]]
        then
          curl -b cookie.txt -d "$banaction&ipType=IPv4&ownip=$ownipv4" --url "https://www.vservercontrolpanel.de/VServers?selectedVServerId=$serverid&page=filter&section=IPv4"
	  updateRulesV4
        fi
 
    ;;
    del)
 
        curl -b cookie.txt -o ipv6.txt --url "https://www.vservercontrolpanel.de/VServers?selectedVServerId=$serverid&page=filter&section=IPv6"
        fwids=`cat ipv6.txt | grep "foreignip" value=".*$sourceip" | cut -d "(" -f 2 | cut -d ")" -f 1`
        for id in $fwids; do
            curl -b cookie.txt -d "deleteId=$id&direction=$direction&foreignip=$sourceip&ipType=IPv6&match=&ownip=$ownipv6&proto=$protokoll&sortINPUT=1&submit$id=&target=$policy" --url "https://www.vservercontrolpanel.de/VServers?selectedVServerId=$serverid&page=filter&section=IPv6"
        done
	updateRulesV6
 
        if [[ "$ipversion" != "v6" ]]
        then
          curl -b cookie.txt -o ipv4.txt --url "https://www.vservercontrolpanel.de/VServers?selectedVServerId=$serverid&page=filter&section=IPv4"
          fwids=`cat ipv4.txt | grep "foreignip" value="$sourceip" | cut -d "(" -f 2 | cut -d ")" -f 1`
          for id in $fwids; do
            curl -b cookie.txt -d "deleteId=$id&direction=$direction&foreignip=$sourceip&ipType=IPv4&match=&ownip=$ownipv4&proto=$protokoll&sortINPUT=1&submit$id=&target=$policy" --url "https://www.vservercontrolpanel.de/VServers?selectedVServerId=$serverid&page=filter&section=IPv4"
          done
	  updateRulesV4
        fi
 
    ;;
    *)
        echo "Usage: $0 IPADDRESS {add|del}"
        exit 1
    ;;
esac
 
#Logout
curl -b cookie.txt --url https://www.vservercontrolpanel.de/Logout
 
rm -R /tmp/nvcp
 
exit 0

Dann erstellt ihr die Datei „sync.conf“ in Ordner „action.d“ und kopiert das hier rein:

[Definition]
# Option: actionstart
# Notes.: command executed once at the start of Fail2Ban.
# Values: CMD
#
actionstart = 
# Option: actionstop
# Notes.: command executed once at the end of Fail2Ban
# Values: CMD
#
actionstop = 
# Option: actioncheck
# Notes.: command executed once before each actionban command
# Values: CMD
#
actioncheck = 
# Option: actionban
# Notes.: command executed when banning an IP. Take care that the
# command is executed with Fail2Ban user rights.
# Tags: <ip> IP address
# <failures> number of failures
# <time> unix timestamp of the ban time
# Values: CMD
#
actionban = /etc/fail2ban/action.d/sync.sh <ip> add
# Option: actionunban
# Notes.: command executed when unbanning an IP. Take care that the
# command is executed with Fail2Ban user rights.
# Tags: <ip> IP address
# <failures> number of failures
# <time> unix timestamp of the ban time
# Values: CMD
#
actionunban = /etc/fail2ban/action.d/sync.sh <ip> del

Anschließend passt ihr noch die „jail.conf“ im Ordner „/etc/fail2ban“ an.
Welche Regeln Ihr einschaltet bleibt euch überlassen, aber folgenden Wert müsst ihr ändern (Defaultwert: „action = %(action_)s“):

action = sync

Dann noch fail2ban neustarten und fertig!

Comments (12)

  1. thomasbeyer

    super. vielen Dank.

  2. dgerighausen

    Wer noch Bedarf an einer automatischen Information via Email hat, der natürlich mit diesem Skript nicht mehr nativ über Fail2Ban funktioniert, fügt einfach:
    echo „$1 wurde gebannt.“ | mailx -s „Fail2Ban-Warnung“ deine@email.net
    nach dem Logout in das sync.sh Skript ein und schon wird man per Mail darüber informiert.

  3. davkraid

    Bei Debian 6 (Squeeze) muss das „#!/bin/sh“ durch „#!/bin/bash“ ersetzt werden.

  4. extremmichi

    Leider klappt das nicht bei mir mit netcup
    fail2ban scheint richtig zu laufen ip’s werden auch gebannt,zumindest werden Einträge in der fail2ban.log erstellt. [BAN] sowie [UNBAN]aber die Kommunikation mit netcup klappt nicht. Sprich es werden keine Rules im ccp eingetragen. Da ich das live getestet habe , habe ich sofort nach dem Ban nachgesehen also noch vor dem unban. Es werden deffinitiv keine Einträge erstellt.

    • Ich kann dir leider keine Lösung für das Problem anbieten, da der Fehler bisher noch bei niemandem aufgetreten ist. Wenn du noch zusätzliche Informationen hast, die mir für die Lösung helfen könnten (OS-Version, Curl-Version, etc.) kannst du sie mir gern unter christoph.schuster@n-durch-x.de schreiben.

  5. extremmichi

    so ich möchte noch schnell nachreichen , warum es bei mir nicht geklappt hat, falls jemand das selbe Problem hat wie ich.
    es lag am servername den ich angegeben habe.
    servername=““ #your vserver name (vXXXXXXXXXXXX)
    hier darf nur der servername(vXXXXXXXXXXXX) wie ja auch angegeben rein.
    ich hatte an den Servernamen noch den FQDN angehängt
    also:
    servername=“vXXXXXXXXXXXXXX.yourvserver.net“;
    was mir immer n 500-Fehler (internal Servererror) auswarf.
    Also mein Fehler 😉
    Das script läuft jetzt super
    Danke nochmal für deine Leistung
    ndurchx

  6. checker

    hab das alles so gemacht wie es hier steht,bekomme auch ne mail das er gebannt wurde aber in der FW steht nichts drin.Benutzte Debian 6 mit IspCp,jemand ne idee?

  7. checker

    vielen dank nochmal 😉

  8. heaschmann

    Hallo zusammen,

    Ich hätte gerne zusätzlich zur Funktion des Action Scriptes auch die Funktion von E-Mail Notofication. Nach diesem Tutorial wurde ja aber alle Dateien aus action.d entfernt.

    Hat hier jemand eine Idee, wie man diese Funktion zusätzlich zum Actionscript verwenden könnte?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.