DDoS-Schutz auf vServer

  • Hallo liebe Gemeinde,


    derzeit verwende ich fail2ban um meinen Apache-Server zu überwachen und ggf. IPs zu blockieren. Doch damit werde ich nicht glücklich. Immer wieder werden Benutzer "gekickt", da einfach bei großen (überladenen) Seiten mehr Verbindungen hergestellt werden als bei kleinen.


    Nun meine Frage: Was kann man denn für eine Software/Script verwenden, um zumindest die kleinen Fälle von DDoS zu verhindern. Deflate mag ich ehrlich gesagt nicht mehr verwenden, da es nicht mehr gut gewartet wird. Wie sieht es mit mod_evasive aus? Oder ist so ein Schutz für einen vServer sowieso irrelevant, da man so einen Angriff gar nicht stemmen könnte?


    Würde gerne hier dann ein Tutorial machen, falls ihr Lösungsvorschläge habt.


    Vielen Dank im Voraus!

  • Grundsätzlich macht ein Apache spezifischer Schutz ja nur dann Sinn, wenn auch der Apache Server das Ziel ist.
    Oft werden Server aber auch auf deutlich tieferen Ebenen angegriffen. Stichwort: SYN Flood. Hier kann man ganz gut mit Systemeinstellungen und iptables entgegenwirken. Auch bei anderen Zielen, wie z.B. einem CoD4 Server, kann man mit spezifischen iptables Regeln den Server vorbeugend absichern. Das kann aber unter Umständen zu Fehlern in der eigentlichen Anwendung führen. Die Regeln sind entsprechend gut zu testen.


    Ich persönlich versuche es zu vermeiden User vollständig auszusperren. Ich mache dies nur bei Anwendungen, bei denen der Nutzerkreis sehr klein ist und ich jeden persönlich kenne. Ansonsten lasse ich sie zum Service verbinden und werfe eine Fehlermeldung aus ohne viel Code auszuführen, um Missbrauch per DDoS zu vermeiden.


    Wenn du von richtigen DDoS Attacken sprichst und nicht nur von Brute-Force Angriffen, dann musst du berücksichtigen, dass bereits ein einziger verwundbarer Service zum Ausfall des Servers führen kann.


    Außerdem gibt es noch DDoS Attacken, welche die Netzwerkinfrastruktur zum Ziel haben, z.B. eine NTP Amplification Attack. Hier bieten nur Dienste wie CloudFlare einen sinnvollen Schutz. Ansonsten müssen wir uns hier auf Netcup verlassen, denn wenn dieser Traffic bei uns ankommt, dann ist es schon zu spät. Ich gehe davon aus, dass Netcup in diesem Fall die IP-Adressen vom Netz nimmt.


    Grüße Seo

  • Schon klar, dass da mehr betroffen sein kann. :) Wie du schon richtig gesagt hast, hat man als kleiner vServer-Betreiber oft gar keine Chance so etwas zu verhindern bzw. vorzubeugen.


    Mir geht es eigentlich prinzipiell darum: Es passiert öfters, dass mein Apache unter der Last von sehr, sehr vielen Anfragen eingeht. Das möchte ich damit verhindern, dass ich kontrolliere, wie viele Verbindungen pro IP aufgebaut werden. Doch was ist mit den anderen Diensten? Mailserver, FTP-Server, ...

  • Deflate mag ich ehrlich gesagt nicht mehr verwenden, da es nicht mehr gut gewartet wird.


    Aber danke, anscheinend wirklich das einzig Brauchbare ...


    EDIT: Wie kann ich testen, ob das Script überhaupt funktioniert? Früher habe ich das mit

    Code
    ab -n 1000 -c 300 http://www.domain.com/

    gemacht, doch jetzt passiert rein gar nichts. Sonst wurde ich sofort geblockt ...


    EDIT2: Ok, habe es hinbekommen. Der Cronjob läuft auch nicht wie er soll. Habe nun das Script "aufgeräumt" und die Cronjob-Funktion entfernt. Nun muss der Cronjob manuell (crontab -e) angelegt werden. Jetzt funktioniert es wunderbar.


    EDIT3: Anbei eine überarbeitete Version des Scripts. Achtung: Funktioniert nur mit iptables! Es muss manuell ein Cron gesetzt werden:


    Code
    * * * * * /usr/local/ddos/ddos.sh > /dev/null


    Getestet auf Debian 7 (Wheezy).

  • Kennt sich vielleicht jemand gut mit bash-Programmierung aus?


    Ich würde gerne mit dem Script NUR ipv4-Adressen checken. Derzeit ist es so, dass die ipv6-Adressen nur mit den ersten 3 Zeichen dargestellt werden, daher möchte ich diese entfernen.


    Code
    netstat -ntu | grep ':' | awk '{print $5}' | sed 's/::ffff://' | cut -f1 -d ':' | sort | uniq -c | sort -nr > $BAD_IP_LIST


    Hat jemand eine Idee? Danke!

  • @junkpad92: Bau nach awk und vor sed folgendes ein: egrep -v ':.+:[0-9]+$' :)



    MfG Christian

    "Wer nur noch Enten sieht, hat die Kontrolle über seine Server verloren." (Netzentenfund)

  • Vielen Dank, killerbees19! :) Ich werde Rückmeldung geben, wenn es geklappt hat.


    EDIT: Hat geklappt! Nun werden nur noch IPv4-Adressen geprüft. Für IPv6-Adressen müsste man das Script komplett umbauen.


    EDIT2: Nun habe ich das funktionsfähige Programm hochgeladen. :) Danke für eure Hilfe!

  • Hallo,


    das Script läuft problemlos, leider habe ich damit aber das Problem, wenn zum Beispiel ein Kunde im FTP-Programm berechnen lassen will, wie viele Dateien auf seinem Webspace liegen, kickt in das Script sofort hinaus. Das FTP-Programm baut scheinbar mehr als 60 Verbindungen in der Minute auf.


    Ich habe daher das Script wieder deaktiviert, da es oft false positive Kicks sind. Jetzt meine Frage an euch: Brauche ich so ein Script überhaupt? Lässt sich damit überhaupt ein (kleiner) DDoS-Angriff bzw. eine damit einhergehende Überlastung des Servers verhindern?

  • Was meinst du genau? Das Skript verwendet iptables.


    EDIT: Jetzt verstehe ich es. Könntest du mir einen hilfreichen Link geben oder sinnvolle Regeln, wie kleine Angriffe abgewehrt werden können? :) Danke!

  • Wow, vielen, vielen Dank für das tolle Script!


    Für das Verständnis: Ich muss nur den Configuration-Part ausfüllen, oder? Wie kann ich IMAP-Ports und andere spezielle Ports freigeben? Muss ich die Ports in eine extra Zeile schreiben oder mit Komma trennen?


    Vielen Dank! Echt tolle Arbeit!

  • Zitat

    Für das Verständnis: Ich muss nur den Configuration-Part ausfüllen

    Genau. So wars gedacht ^^


    Zitat

    Wie kann ich IMAP-Ports und andere spezielle Ports freigeben?

    Du gibst einfach die Ports an, welche geöffnet werden sollen, da standardmäßig erstmal alles gesperrt wird.


    Beispiel:


    # TCP & UDP Ports for incoming traffic
    INTCPPORTS="21 80 443"
    INUDPPORTS="11001"


    # TCP & UDP Ports for outgoing traffic
    OUTTCPPORTS="80 443"
    OUTUDPPORTS=""

    WICHTIG!!! Deinen SSH-Port bei INTCPPORTS nicht vergessen


    Zitat

    Muss ich die Ports in eine extra Zeile schreiben oder mit Komma trennen?

    Einfach die gewünschten Ports durch Leerzeichen trennen

  • Besten Dank, RayMD! Du weißt gar nicht, wie dankbar ich dir für das Script bin. :)


    EDIT: Ich würde "/etc/init.d/fail2ban restart" nutzen und nicht "start", da falls fail2ban bereits läuft, die Regeln von fail2ban nicht mehr neu geschrieben werden.

  • Besten Dank, RayMD! Du weißt gar nicht, wie dankbar ich dir für das Script bin. :)

    Kein Problem. Sicherheit ist ein heikles Thema und da freut man sich um so mehr, wenn man jemanden helfen konnte um einen erleichterten Einstieg zugewähren.


    Wenn du mein Script ausführst, löscht es eh erstmal alle Einträge in iptables und fügt die fail2ban Regeln dann hinten ran.
    Daher ist es irrelevant, ob start oder restart.