HTTP-Server: keep-alive Connections limitieren Strategie



  • Hallo! 😉

    Ich habe gerade einen HTTP-Server für ein privates Projekt meinerseits implementiert. Funktioniert eigentlich ganz gut, allerdings schließe ich prinzipiell Connections nach jedem Request bzw. teile das auch dem Client im Response-Header mit (Connection: close)

    Jetzt sind aber keep-alive Connections eine sehr nette Sache. In einer perfekten Welt auch leicht zu realisieren, wenn der Client die Anzahl der Connections wie im RFC beschrieben limitiert und auch brav wieder schließt.
    Würde aber jemand einfach tausende keep-alive Connections aufmachen und offenlassen, dann wäre der Server direkt DoSed. Uncool.

    Also müsste ich Connections absägen, sobald der Pool an freien Filedeskriptoren knapp wird oder einfach pauschal eine Obergranze für offene Verbindungen festlegen.

    Meine Strategie wäre es, jeder Verbindung ein Flag zu geben ob gerade Daten transferiert werden (read/write) und ein Timestamp der letzten Operation. Offene Verbindungen werden dann mit mitgezählt, wenn das Limit erreicht wird dann werden zuerst die Verbindungen geschlossen, die im Zeitraum x nicht aktiv waren. Sollte das nicht reichen, dann noch die Verbindungen, die am längsten nicht aktiv waren.

    Hat jemand eine bessere Idee? Ich habe das Gefühl, dass das Thema ziemlich sensibel ist, aus einer Sicherheitsperspektive. 😕

    Danke & lg,
    Ethon



  • üblicherweise gibts ein keep-alive-timeout und jede Verbindung die in dieser Zeitspanne keinen Request sendet, wird getrennt.

    Gegen DoS-Angriffe hilft das aber nicht, die schicken ja requests. Und was die Sicherheitsperspektive allgemein angeht, ich glaube da sollte man sich als HTTP-Selbstbastler eh keine zu großen Illusionen machen und im Realfall lieber noch einen "echten" Server wie nginx o.ä. davorschalten.



  • Verbindungslimit pro IP + Timeout



  • Ob keep-alive oder nicht macht fuer dos keinen wirklichen unterschied, jemand kann auch http1.0 verbindungen aufmachen und mit halben requests deinen pool auslasten, eventuel sogar auf tcp einfach alle sockets(-ports) belegen.

    OS haben oft ein delay bis sie einen port wiederverwenden, 4min oder so, wenn jemand also deine ports alle belegt, du merkst das, schliesst alle verbindungen, kann es trotzdem sein, dass du eine zeitlang dosed bist.

    der kampf gegen dos wird am system gefuehrt, nicht an den eigentlichen services, da solltest du dich eher auf sicherheit und stabilitaet konzentrieren.


Anmelden zum Antworten