Serverapplikation (Programmieren)



  • Guten Abend!

    Ich arbeite mit einer asynchronen Bibliothek.
    Mein derzeitiger Server schaut so aus: (Alle Operationen sind asynchron)

    Warte auf Verbindung. -> Akzeptiere Verbindung -> Sende Nachricht.

    Habe mir auch ein Script geschrieben, welches N (=unendlich) viele Verbindungen erstellt und sich mit dem Server verbindet.
    Das ganze funktioniert für ~1000 Verbindungen, danach jault der Server "Too many open files".

    Meine Serverapplikation soll später auch im Internet laufen, und wenn ein kleines/großes Kind das selbe Script erstellt und es auf meinen Server hetzt, stürzt er wahrscheinlich ab.

    Meine Frage: Welche Lösungen bieten sich an?

    Eine temporäre Lösung wäre natürlich, dass ich an den max-files herumfrickle. Aber das ist keine akzeptable Lösung.
    Keine akzeptable Lösung wäre auch eine Proxy-Lösung.
    Dass ich nicht mehr als eine Verbindung von eine(m/r) Host/IP-Adresse ist mir während dem Schreiben dieses Postes in den Sinn gekommen. Ist aber auch inakzeptabel.

    Wäre sehr glücklich, wenn ihr mir helfen könntet. 🙂



  • > Ist aber auch inakzeptabel.

    Weil?

    > Ich arbeite mit einer asynchronen Bibliothek.

    Welche? boost::asio? Und damit bekommst du nur 1000 Verbindungen? Dann musst du extrem schlechte Hardware haben. Mit /dev/epoll (Linux), kqueue (BSD) und IOCPs (Windows) kannst du bei entsprechender RAM-Größe zehntausende Verbindungen gleichzeitig halten. Techniken wie select() haben im Gegensatz dazu softwareseitige Grenzen.

    Eine DoS-Attacke abwehren ist kinderleicht und sollte in jedem Server implementiert sein, schließlich kann ich alleine z.B. mit einer LOIC meine eigene Website nicht down bekommen, und auf dem Computer läuft ein Apache. (Gott sei dank ist mein Traffic-Volumen kostenlos :)).

    DDoS ist ungleich schwerer, das geht nur, wenn du ganze Servercluster hast, die stärker als ein Botnet sind. Aber du wirst bestimmt keine DDoS-Attacke von einem Millionen-großen Botnet bekommen, deshalb kann dir das auch egal sein. 🙂



  • Hallo Jodocus!

    Jodocus, irgendwie hast du meinen Post nicht wirklich gelesen. 😞

    Die Bibliothekfrage ist eigentlich nicht von Bedeutung, aber ja, ich arbeite mit boost::asio.

    Ich habe nicht gesagt, dass mir der Speicher ausgeht, die CPU Auslastung in die Höhe geht oder der Server zu lange braucht um zu antworten (select()-Fall).

    Die andere Hälfte deines Beitrags hat mir auch nicht geholfen, da ich noch immer nicht weiß, was ich im Falle einer DoS/DDoS-Attacke machen soll, außer dass der Apache es schafft.

    Habe aber das Problem mit den "too many files open" gelöst. Siehe (ulimit -n).
    Trotzdem brauche ich eine Lösung (beinhaltet Lösungsweg), um im Falle eines DoS Angriffes gewappnet zu sein.

    Danke aber für den Beitrag, du hast mich dazu bewegt weiter nach dem Fehler zu suchen!

    Würde mich über weitere Antworten freuen!



  • > Jodocus, irgendwie hast du meinen Post nicht wirklich gelesen. 😞

    Doch, das habe ich. Du hast nur ziemlich viele Informationen verschwiegen, denn ich kann nicht ahnen, auf welchem OS du arbeitest (ulimit ist wohl Linux) und welche I/O-Strategie du nutzt. (select() kann man asynchron nutzen und ist ebenfalls softwareseitig limitiert, aber bei dir ist es Asio, also dev/epoll). Auf die Art und Weise ist es äußerst schwierig zu helfen.

    > Ich habe nicht gesagt, dass mir der Speicher ausgeht,

    Das konnte ich eben nur ahnen, da meist der Speicher im nonpageable-Pool ausgeht, wenn zu viele Filedeskriptoren offen sind. Deine Fehlermeldung hat mir keinerlei Auskunft über eine Ursache gegeben.

    > die CPU Auslastung in die Höhe geht

    Davon war nie die Rede... Hast du meinen Post gelesen?

    > oder der Server zu lange braucht um zu antworten (select()-Fall).

    Das habe ich auch nie gesagt. Das Limit dort nennt sich FD_SETSIZE, das hat erst mal nichts mit Timeouts oder ähnlichem zu tun.

    > Die andere Hälfte deines Beitrags hat mir auch nicht geholfen, da ich noch immer nicht weiß, was ich im Falle einer DoS/DDoS-Attacke machen soll, außer dass der Apache es schafft.

    Nun ja, du hast nicht auf meine Frage geantwortet, warum das "Blocken" einer IP-Adresse inakzeptabel ist, wenn von ihr extrem viele Verbindungsanfragen kommen. Weil du damit "unschuldige" NAT-User mitblockst? Die Wahrscheinlichkeit, dass zwei dieser Nutzer den gleichen Service nutzen ist doch eher gering. Außerdem ist es als Serverentwickler nicht deine Aufgabe, Sicherheitsprobleme beim Client zu beheben. Wenn dein Server von einem Host bedroht wird, muss er nun mal geblockt werden, Punkt. In der Regel sollte aber kein einzelner Client ressourcentechnisch in der Lage sein, einen Server lahm zu legen, sofern du nicht alle möglichen software-Limits beseitigt hast.

    Du vermixt außerdem meine Aussage total. DoS und DDoS sind zwei Welten. Eine DoS-Attacke abzuwehren ist wie oben mehrmals gesagt kein Problem, das kann auch ein Apache. DDoS kann man nicht ohne weiteres in deiner Situation abwehren, da du so eine Attacke nicht erkennen kannst. ISPs hingegen haben die Möglichkeiten, Detection-Algorithmen zu nutzen und ihre Netze zu überwachen. DDoS ist eine Sicherheitsfrage von den Client-Netzen/Computern und den ISPs, da kannst du nichts machen, außer (wie ich schon sagte), große Servercluster (also ganze Farmen) voll deine Dienste laufen zu lassen, die stärker als jedes Botnet sind. So wird das z.B. auch Google machen, die eher nicht mit DDoS klein zu kriegen sind. Die Preise für so eine Farm sind natürlich extrem hoch.

    So, jetzt alles klar?
    Mach dir über DDoS keine Gedanken, so prominent wird dein Dienst sicherlich nicht sein, dass du so eine Attacke von einem mittelgroßen Botnet bekommst (also einige Tausend/Zehntausend).



  • Hallo Jodocus!

    Ich habe wirklich zu wenig Informationen geliefert, sorry!

    Alles klar, du hast recht. Wenn um die ~100(0) Verbindungen von einer IP-Adresse kommen, warte ich auf eine Authentifizierung, wenn keine innerhalb n (=60) Sekunden ankommt, dann schließe ich die Verbindung. Ist es bei den anderen Verbindungen mit der selben IP-Adresse auch so ähnlich, dass sie nicht antworten, blockiere ich die IP-Adresse.

    Danke nochmal und entschuldigung für die Unvollständigkeit meines Beitrages.



  • Ich möchte noch anmerken: mit diesem Thema kannst du dich Ewigkeiten beschäftigen. DDoS kann auf verschiedenen Ebenen auftreten. Etwa, im Anwedungsprotokoll (da du da eine Authentifizierung einbaust, scheinst du ein eigenes zu erfinden [was hast du eigentlich vor?]), z.B. Massen an HTTP-Requests; oder im TCP-Stack (SYN-Attacke)). Die Abwehrmöglichkeiten sind allesamt unterschiedlich, SYN-Cookies retten dich z.B. nicht vor HTTP-Attacken.



  • Das Problem ist man: select(2). Benutze lieber man: epoll (Linux) oder kqueue (BSD/OSX). Die können deutlich mehr Verbindungen gleichzeitig.



  • Bei einer richtigen DDOS Attack hast Du keine Chance!

    0x000000.com würde mit 40GB Traffic nidergestreckt!! Und der hatte alles um DDOS etc. abzuwehren. Aber es gibt wie schon gesagt viele Angriffs DOS möglichkeiten.


Anmelden zum Antworten