• 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.

    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!

    Geschrieben am 30.07.2011 in Linux, Web (Server) 13 Kommentare

    Bitcoin Spendenadresse: 17GAjCyAWpqreJ3nBAkZh4rGPHnZnCNM2P

    13 Kommentare

    1. thomasbeyer sagt:

      super. vielen Dank.

    2. dgerighausen sagt:

      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 sagt:

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

    4. extremmichi sagt:

      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.

    5. extremmichi sagt:

      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 sagt:

      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 sagt:

      vielen dank nochmal ;-)

    8. [...] Hier geht es zum Artikel Howto ← SSH absichern Kommentar schreiben0 Kommentare. /* */ [...]

    9. heaschmann sagt:

      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?

    Hinterlasse eine Antwort

    Du musst angemeldet sein, um einen Kommentar abzugeben.