Apache 2 und concurrent connections

01/09/2009 - 15:28 von Alexander Griesser | Report spam
Hallo,

Ich hab gestern mal ein bisschen rumgespielt und wollte anhand der
Anzahl gleichzeitiger Verbindungen zu meinem Webserver auf DoS Attacken
oder sonstigen bösen Traffic schließen.

Laut RFC (haha) darf ein Browser maximal 2 Connections zu einem
Webserver gleichzeitig aufmachen, dieses RfC wird aber wies scheint
getrost ignoriert.

Mein anfànglicher Schwellwert lag bei 50 gleichzeitigen Verbindungen
(gemonitored im Output von `netstat -an`), den ich dann gleich mal
auf 70 erhöhen musste um nicht 80% aller User rauszuschmeißen.

Ich habe mir dann mal einen speziellen User der alle 2 Stunden geblockt
wurde zur Brust genommen und seinen Connection Count bei mir am
Server mitverfolgt und alleine das Laden der Startseite des Forums
veranlasste seinen Rechner dazu, 90 (!!) Verbindungen zu meinem
Webserver aufzumachen, Browser war IE8.

Mozilla Firefox in der aktuellsten Version war da etwas genügsamer und
kam auf "nur" knapp 50 Verbindungen auf seinem PC, wenn ich das bei mir
mache komme ich nie über 30, nicht mal wenn ich unbedingt will.

Ich hab dann versucht, Keep-Alives im Apache zu deaktivieren, was die
Anzahl der gleichzeitigen Verbindungen sogar noch ansteigen ließ für
die meisten User.

Was ich also eigentlich wissen wollte ist:
Gibts irgendeine vernünftige Möglichkeit, serverseitig zu beeinflussen
wieviele Verbindungen ein Browser zu mir aufmachen darf?

Derzeit habe ich da so einen "watchdog" laufen (àhnlich wie ddosdeflate)
der in regelmàßigen Abstànden die Verbindungen überwacht und wer weit
über dem Grenzwert liegt, wird mit apf direkt auf IP Ebene geblockt,
allerdings gefàllt mir diese Lösung nicht gar so gut, weil apf scheinbar
keine Möglichkeit bietet, eine IP für sagen wir 10 Minuten zu sperren.

ciao,
Alex
 

Lesen sie die antworten

#1 Christoph Mehdorn Weber
02/09/2009 - 01:15 | Warnen spam
Hallo!

* Alexander Griesser :

Laut RFC (haha) darf ein Browser maximal 2 Connections zu einem
Webserver gleichzeitig aufmachen, dieses RfC wird aber wies scheint
getrost ignoriert.



Bei SeaMonkey ist die Standardeinstellung wohl bei 15, wobei
es noch ein Limit für "persistente" Verbindungen von 6 gibt.
Eventuell gilt letzteres, wenn der Server KeepAlive unterstützt.

Mein anfànglicher Schwellwert lag bei 50 gleichzeitigen Verbindungen
(gemonitored im Output von `netstat -an`), den ich dann gleich mal
auf 70 erhöhen musste um nicht 80% aller User rauszuschmeißen.



Du könntest das ListenBacklog erhöhen. Aber das
ist normalerweise schon recht großzügig eingestellt.
Verwendest du eventuell Prefork mit zu knappem
ServerLimit?

Ich habe mir dann mal einen speziellen User der alle 2 Stunden geblockt
wurde zur Brust genommen und seinen Connection Count bei mir am
Server mitverfolgt und alleine das Laden der Startseite des Forums
veranlasste seinen Rechner dazu, 90 (!!) Verbindungen zu meinem
Webserver aufzumachen, Browser war IE8.



Könnte z. B. ein Proxy sein, der den User-Agent verschleiert.

Ich hab dann versucht, Keep-Alives im Apache zu deaktivieren, was die
Anzahl der gleichzeitigen Verbindungen sogar noch ansteigen ließ für
die meisten User.



Logisch. Statt mehrere Resourcen in einer Verbindung holen zu
können, muß man dann jedesmal eine neue Verbindung beginnen. Und
da die Limits für gleichzeitige Verbindungen in diversen Browsern
recht hoch sind, wird dann erst einmal parallelisiert und nicht
serialisiert.

Gibts irgendeine vernünftige Möglichkeit, serverseitig zu beeinflussen
wieviele Verbindungen ein Browser zu mir aufmachen darf?



Eventuell kann man da etwas mit iptables, SYN-Paketen und
kurzen Timeouts bei recent/hashlimit drehen. Wobei ich nicht
genau weiß, was passiert, wenn man überschüssige Verbindungen
von einer Adresse mit DROP/REJECT beantwortet oder ob man da
andere Maßnahmen überlegen sollte.

DROP könnte bei den Leuten, die übertreiben, zu scheinbar
hohen Ladezeiten führen, weil der Browser den Retransmit
vielleicht recht lange herauszögert. Bei REJECT versucht er
es eventuell nicht erneut und den Leuten fehlen Grafiken etc.

Aber du kannst es mal ausprobieren und berichten.


wer weit über dem Grenzwert liegt, wird mit apf direkt auf IP
Ebene geblockt, allerdings gefàllt mir diese Lösung nicht gar so
gut, weil apf scheinbar keine Möglichkeit bietet, eine IP für
sagen wir 10 Minuten zu sperren.



"Active Port Forwarder" meinst du wohl nicht. Arbeitet die
Lösung mit iptables? Eventuell kann man das mit meinem Vorschlag
kombinieren und eine Queue zur Benutzung der recent-Regel damit
erstellen lassen.

Bei recent gibt es zwei Testmöglichkeiten:
| [!] --rcheck
| Check if the source address of the packet is currently in the
| list.
|
| [!] --update
| Like --rcheck, except it will update the "last seen" timestamp
| if it matches.

Damit kann man recht gut einstellen, wann so jemand wieder darf.


Alternativ könnte man sich gleich richtiges Traffic-Shaping
angucken.

Christoph

Womit Du erkannt hast, dass Du eine traege Masse hast. --
*Das* erkenne ich jeden Morgen...
(Andreas Dau, Dietz Proepper)

Ähnliche fragen