Apache gegen DDoS schützen

Apache, Lighttpd, nginx, Cherokee
dohǃ
Posts: 23
Joined: 2005-09-15 23:52

Apache gegen DDoS schützen

Post by dohǃ » 2008-02-20 12:09

Hallo!

Gestern verabschiedete sich der Server (AMD Athlon 64 X2 Dual Core, 8 GB, Apache 2 Prefork, PHP 4, MYSQL 5)... in den Error Logs steht folgendes:

Code: Select all

[Tue Feb 19 19:14:19 2008] [error] server reached MaxClients setting, consider raising the MaxClients setting
[Tue Feb 19 19:42:13 2008] [warn] child process 13315 still did not exit, sending a SIGTERM
[Tue Feb 19 19:42:13 2008] [warn] child process 13256 still did not exit, sending a SIGTERM
[Tue Feb 19 19:42:13 2008] [warn] child process 13426 still did not exit, sending a SIGTERM
[Tue Feb 19 19:42:13 2008] [warn] child process 13467 still did not exit, sending a SIGTERM
[Tue Feb 19 19:42:13 2008] [warn] child process 13276 still did not exit, sending a SIGTERM
[Tue Feb 19 19:42:13 2008] [warn] child process 13330 still did not exit, sending a SIGTERM
[Tue Feb 19 19:42:13 2008] [warn] child process 13403 still did not exit, sending a SIGTERM
[Tue Feb 19 19:42:13 2008] [warn] child process 13355 still did not exit, sending a SIGTERM
[Tue Feb 19 19:42:13 2008] [warn] child process 13366 still did not exit, sending a SIGTERM
[Tue Feb 19 19:42:13 2008] [warn] child process 13292 still did not exit, sending a SIGTERM
[Tue Feb 19 19:42:15 2008] [warn] child process 13315 still did not exit, sending a SIGTERM
[Tue Feb 19 19:42:15 2008] [warn] child process 13256 still did not exit, sending a SIGTERM
[Tue Feb 19 19:42:15 2008] [warn] child process 13426 still did not exit, sending a SIGTERM
[Tue Feb 19 19:42:15 2008] [warn] child process 13467 still did not exit, sending a SIGTERM
[Tue Feb 19 19:42:15 2008] [warn] child process 13276 still did not exit, sending a SIGTERM
[Tue Feb 19 19:42:15 2008] [warn] child process 13330 still did not exit, sending a SIGTERM
[Tue Feb 19 19:42:15 2008] [warn] child process 13403 still did not exit, sending a SIGTERM
[Tue Feb 19 19:42:15 2008] [warn] child process 13355 still did not exit, sending a SIGTERM
[Tue Feb 19 19:42:15 2008] [warn] child process 13366 still did not exit, sending a SIGTERM
[Tue Feb 19 19:42:15 2008] [warn] child process 13292 still did not exit, sending a SIGTERM
[Tue Feb 19 19:42:17 2008] [warn] child process 13315 still did not exit, sending a SIGTERM
[Tue Feb 19 19:42:17 2008] [warn] child process 13256 still did not exit, sending a SIGTERM
[Tue Feb 19 19:42:17 2008] [warn] child process 13426 still did not exit, sending a SIGTERM
[Tue Feb 19 19:42:17 2008] [warn] child process 13467 still did not exit, sending a SIGTERM
[Tue Feb 19 19:42:17 2008] [warn] child process 13276 still did not exit, sending a SIGTERM
[Tue Feb 19 19:42:17 2008] [warn] child process 13330 still did not exit, sending a SIGTERM
[Tue Feb 19 19:42:17 2008] [warn] child process 13403 still did not exit, sending a SIGTERM
[Tue Feb 19 19:42:17 2008] [warn] child process 13355 still did not exit, sending a SIGTERM
[Tue Feb 19 19:42:17 2008] [warn] child process 13366 still did not exit, sending a SIGTERM
[Tue Feb 19 19:42:17 2008] [warn] child process 13292 still did not exit, sending a SIGTERM
[Tue Feb 19 19:42:19 2008] [error] child process 13315 still did not exit, sending a SIGKILL
[Tue Feb 19 19:42:19 2008] [error] child process 13256 still did not exit, sending a SIGKILL
[Tue Feb 19 19:42:19 2008] [error] child process 13426 still did not exit, sending a SIGKILL
[Tue Feb 19 19:42:19 2008] [error] child process 13467 still did not exit, sending a SIGKILL
[Tue Feb 19 19:42:19 2008] [error] child process 13276 still did not exit, sending a SIGKILL
[Tue Feb 19 19:42:19 2008] [error] child process 13330 still did not exit, sending a SIGKILL
[Tue Feb 19 19:42:19 2008] [error] child process 13403 still did not exit, sending a SIGKILL
[Tue Feb 19 19:42:19 2008] [error] child process 13355 still did not exit, sending a SIGKILL
[Tue Feb 19 19:42:19 2008] [error] child process 13366 still did not exit, sending a SIGKILL
[Tue Feb 19 19:42:19 2008] [error] child process 13292 still did not exit, sending a SIGKILL

Code: Select all

[Tue Feb 19 18:57:08 2008] [error] [client 85.114.x.x] File does not exist: /var/www/virtual/htdocs/bb
[Tue Feb 19 18:57:08 2008] [error] [client 85.114.x.x] File does not exist: /var/www/virtual/htdocs/forums
[Tue Feb 19 18:57:08 2008] [error] [client 85.114.x.x] File does not exist: /var/www/virtual/htdocs/communtiy
[Tue Feb 19 19:44:30 2008] [error] [client 82.54.x.x] request failed: error reading the headers
[Tue Feb 19 18:56:57 2008] [error] [client 85.114.x.29] File does not exist: /var/www/virtual/htdocs/phpmyadmin
[Tue Feb 19 18:56:58 2008] [error] [client 85.114.x.x] File does not exist: /var/www/virtual/htdocs/phpmyadmin0
[Tue Feb 19 18:56:58 2008] [error] [client 85.114.x.x] File does not exist: /var/www/virtual/htdocs/phpmyadmin1
[Tue Feb 19 18:56:58 2008] [error] [client 85.114.x.x] File does not exist: /var/www/virtual/htdocs/phpmyadmin2
...


Liegt es an der schlechten Konfiguration? Ich spiele gerade mit den Gedanken eine Firewall oder mod_evasive zu installieren... Was könnt ihr mir empfehlen? Wieso der Absturz? "free -m" zeigt immer ausreichenden Speicher an, d.h. kein Swappen, die CPU kann aber vermutlich nicht mithalten? Nachdem ich Apache neugestartet habe, konnte ich einen vorherigen Load von ca. 300 feststellen. Meine Vermutung: 85.114.x.x hat ziemlich viele Requests generiert, die offenbar sehr lange offen blieben... Aufgrund der hohen Anzahl hat er sich dann verabschiedet. Ists vl. besser KeepAlive auf Off zu stellen, um solche Ereignisse zu vermeiden? Mit mod_evasive gibts leider ein Bilder Problem, da jedes Einzelne als Request gezählt wird und daher Fotogallerien nicht funktionieren...

Jetzt, also nach dem Absturz, habe ich folgende Einstellungen:

Code: Select all

#
# Apache
#
<IfModule mpm_prefork_module>
    StartServers         15
    MinSpareServers      10
    MaxSpareServers      20
    ServerLimit         512
    MaxClients          384
    MaxRequestsPerChild 1000
</IfModule>
HostnameLookups Off
Timeout 45
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 2

#
# MySQL
#
key_buffer              = 128M
max_connections         = 200
table_cache             = 512
sort_buffer             = 15M
query_cache_limit       = 1M
query_cache_size        = 16M


ab auf die Seite liefert:

Code: Select all

Concurrency Level:      1
Time taken for tests:   122.876461 seconds
Complete requests:      1000
Failed requests:        905
   (Connect: 0, Length: 905, Exceptions: 0)
Write errors:           0
Total transferred:      46326448 bytes
HTML transferred:       45990448 bytes
Requests per second:    8.14 [#/sec] (mean)
Time per request:       122.876 [ms] (mean)
Time per request:       122.876 [ms] (mean, across all concurrent requests)
Transfer rate:          368.17 [Kbytes/sec] received

Wieso so viele Failed requests? Vielen Dank an für eure Hilfe ;-)

Roger Wilco
Administrator
Administrator
Posts: 5924
Joined: 2004-05-23 12:53

Re: Apache gegen DDoS schützen

Post by Roger Wilco » 2008-02-20 15:18

Doh! wrote:Gestern verabschiedete sich der Server

Das gesamte System oder nur der Webserver? Bei ersterem bringen die Error Logs des Webservers nicht viel.

Doh! wrote:

Code: Select all

[Tue Feb 19 19:14:19 2008] [error] server reached MaxClients setting, consider raising the MaxClients setting

http://httpd.apache.org/docs/2.2/mod/mp ... maxclients

Doh! wrote:Ists vl. besser KeepAlive auf Off zu stellen, um solche Ereignisse zu vermeiden?

Ja.

Doh! wrote:Mit mod_evasive gibts leider ein Bilder Problem, da jedes Einzelne als Request gezählt wird

Ja natürlich. mod_evasive macht also genau das, was es soll. Deine Aufgabe ist es nun, die Grenzwerte, ab wann ein Client gesperrt wird, entsprechend deiner Seite anzupassen. Und wenn du nunmal eine Fotogalerie benutzt, die 20 Bilder pro Seite anzeigt, sollte der Wert nicht unter 25 liegen...

dohǃ
Posts: 23
Joined: 2005-09-15 23:52

Re: Apache gegen DDoS schützen

Post by dohǃ » 2008-02-20 15:35

Nur der Webserver. Ich hab KeepAlive wieder auf On gesetzt, KeepAliveTimeout ist ja auf 2, Timeout auf 10. Hab MaxClients erhöht, aber ist denke ich nicht für den Absturz schuld, vermutlich kann Apache noch nicht mit Massenanfragen (Scans) umgehen, falsche Einstellungen... Am besten wärs sicherlich wenn die Bilder auf einen anderen Server liegen würden, aber kann ich erstmals vergessen :roll: Gibt es Alternativen zu mod_evasive oder kann ich ihm beibringen Bilderrequests zu ignorieren?

Roger Wilco
Administrator
Administrator
Posts: 5924
Joined: 2004-05-23 12:53

Re: Apache gegen DDoS schützen

Post by Roger Wilco » 2008-02-20 15:51

Eventuell kann man die mod_evasive Direktiven in einen Location oder Directory-Block packen. Alternativ lieferst du die Bilder über eine eigene Subdomain aus, für die mod_evasive nicht läuft.

dohǃ
Posts: 23
Joined: 2005-09-15 23:52

Re: Apache gegen DDoS schützen

Post by dohǃ » 2008-02-25 16:49

Mod_evasive blockt zwar "normale" Scans, gegen "DoS AtTack Npub" ist es scheinbar machtlos :/ Das Angriffsziel war /forum/search.php?keyword=sucks, ich konnte es nur 3 mal in der access.log Datei finden... wie kann ich den Apache schützen?

dohǃ
Posts: 23
Joined: 2005-09-15 23:52

Re: Apache gegen DDoS schützen

Post by dohǃ » 2008-02-27 12:45

Das "Interessante" ist, dass sehr viele Verbindungen von der selben IP hergestellt werden, die vermutlich nichts weiteres machen als mehrere Verbindungen für 5 Sekunden aufrecht zu erhalten. Die Verbindungen werden kontinuierlich hergestellt, d.h. Apache kann daher keine neuen Anfragen anderer Clients verarbeiten, er "belohnt" sie mit einer Wartezeit. Apache Timeouts habe ich schon runtergesetzt. Was könnt ihr mir empfehlen? Der IIS hat offenbar keine Probleme... wieso das?

User avatar
Joe User
Project Manager
Project Manager
Posts: 11134
Joined: 2003-02-27 01:00
Location: Hamburg

Re: Apache gegen DDoS schützen

Post by Joe User » 2008-02-27 13:36

Keep-Alive deaktivieren und die eine REMOTE_ADDR per mod_rewrite auf 256.256.256.256 umleiten, fertig.
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.

dohǃ
Posts: 23
Joined: 2005-09-15 23:52

Re: Apache gegen DDoS schützen

Post by dohǃ » 2008-02-27 15:35

Keep-Alive ist jetzt auf Off. Gibt es keine andere Möglichkeit als die IP händisch zu blockieren? Und wieso bricht der IIS bei 1000 Connections mit Stay Connected 5 secs nicht zusammen, Apache hingegen schon... Also kann prinzipiell jeder der im Besitz eines solchen Tools ist Webseiten "abschießen"?

Gibt es vielleicht einige Tricks mit iptables? Also z.B. Anzahl neue Verbindungen pro IP blockieren, etc.

User avatar
daemotron
Administrator
Administrator
Posts: 2635
Joined: 2004-01-21 17:44

Re: Apache gegen DDoS schützen

Post by daemotron » 2008-02-27 20:45

Doh! wrote:Gibt es vielleicht einige Tricks mit iptables? Also z.B. Anzahl neue Verbindungen pro IP blockieren, etc.

Technisch gesehen ja - allerdings würde ich davon abraten, da einige Surfer über Proxies unterwegs sind (AOL, diverse Unis, Firmen etc.) und damit logischerweise hinter einer IP-Adresse ganze Netz-Segmente stecken können. Denen dieselben Paket-Limits zu verpassen wie einem einzelnen Client halte ich nicht gerade für zielführend...

dohǃ
Posts: 23
Joined: 2005-09-15 23:52

Re: Apache gegen DDoS schützen

Post by dohǃ » 2008-02-28 08:49

Ich finde diesen Artikel http://scenetalk.red.to/thread.php?threadid=2279 super hilfreich. Das Problem waren SYN-Attacken, Abhilfe verschafften SYN-Cookies:

Code: Select all

echo 1 > /proc/sys/net/ipv4/tcp_syncookies

Zusätzlich habe ich noch (D)DoS-Deflate installiert. Der Rechner ist jetzt auch bei vielen Connects erreichbar, einzigste Außnahme war die MySQL Datenbank die mit der Anzahl gleichzeitig offener Verbindungen (100) nicht "zurecht" kam: Too many connections.

User avatar
Joe User
Project Manager
Project Manager
Posts: 11134
Joined: 2003-02-27 01:00
Location: Hamburg

Re: Apache gegen DDoS schützen

Post by Joe User » 2008-02-28 13:28

PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.