Kürzlich hatten wir einen Apache-Server, der aufgrund von SYN-Flooding sehr langsam reagierte. Die Problemumgehung bestand darin, tcp_syncookies ( net.ipv4.tcp_syncookies=1 in /etc/sysctl.conf
) zu aktivieren .
Ich habe hier eine Frage dazu gestellt , wenn Sie mehr Hintergrundinformationen benötigen.
Nachdem wir Syncookies aktiviert hatten, wurde ungefähr alle 60 Sekunden die folgende Meldung in / var / log / messages angezeigt:
[84440.731929] possible SYN flooding on port 80. Sending cookies.
Vinko Vrsalovic teilte mir mit, dass dies bedeutet, dass das Syn-Backlog voll wird. Deshalb habe ich tcp_max_syn_backlog auf 4096 angehoben. Irgendwann habe ich auch tcp_synack_retries auf 3 gesenkt (von der Standardeinstellung 5), indem ich ausgegeben habe sysctl -w net.ipv4.tcp_synack_retries=3
. Danach schien die Frequenz zu sinken, wobei das Intervall der Nachrichten zwischen ungefähr 60 und 180 Sekunden schwankte.
Als nächstes habe ich ausgestellt sysctl -w net.ipv4.tcp_max_syn_backlog=65536
, erhalte aber immer noch die Meldung im Protokoll.
Während des gesamten Vorgangs habe ich die Anzahl der Verbindungen im Status SYN_RECV überwacht (durch Ausführen watch --interval=5 'netstat -tuna |grep "SYN_RECV"|wc -l'
), und es wird nie höher als 240, viel viel niedriger als die Größe des Rückstands. Ich habe jedoch einen Red Hat-Server, der im Bereich von 512 liegt (auf diesem Server ist die Standardeinstellung 1024).
Gibt es andere TCP-Einstellungen, die die Größe des Rückstands begrenzen würden, oder belle ich den falschen Baum an? Sollte die Anzahl der SYN_RECV-Verbindungen netstat -tuna
mit der Größe des Backlogs korrelieren?
Aktualisieren
Wie ich am besten beurteilen kann, habe ich es hier mit legitimen Verbindungen zu tun. netstat -tuna|wc -l
Ich habe dies heute recherchiert und diesen Beitrag von einem last.fm-Mitarbeiter gefunden, was ziemlich nützlich war.
Ich habe auch festgestellt, dass das tcp_max_syn_backlog keine Auswirkung hat, wenn Syncookies aktiviert sind (siehe diesen Link ).
Als nächsten Schritt habe ich folgendes in sysctl.conf gesetzt:
net.ipv4.tcp_syn_retries = 3
# default=5
net.ipv4.tcp_synack_retries = 3
# default=5
net.ipv4.tcp_max_syn_backlog = 65536
# default=1024
net.core.wmem_max = 8388608
# default=124928
net.core.rmem_max = 8388608
# default=131071
net.core.somaxconn = 512
# default = 128
net.core.optmem_max = 81920
# default = 20480
Ich habe dann meinen Antwortzeittest eingerichtet, sysctl -p
Syncookies von ausgeführt und deaktiviert sysctl -w net.ipv4.tcp_syncookies=0
.
Danach blieb die Anzahl der Verbindungen im SYN_RECV-Status immer noch bei 220-250, aber die Verbindungen begannen sich erneut zu verzögern. Sobald ich diese Verzögerungen bemerkte, aktivierte ich Syncookies wieder und die Verzögerungen hörten auf.
Ich glaube, das, was ich sah, war immer noch eine Verbesserung gegenüber dem ursprünglichen Zustand, aber einige Anfragen wurden immer noch verzögert, was viel schlimmer ist, als wenn Syncookies aktiviert sind. Es sieht also so aus, als ob ich nicht weiterkomme, bis wir mehr Server online haben, um mit der Last fertig zu werden. Selbst dann sehe ich keinen gültigen Grund, sie wieder zu deaktivieren, da sie (anscheinend) nur gesendet werden, wenn die Puffer des Servers voll sind.
Das Syn-Backlog scheint jedoch nicht mit nur ~ 250 Verbindungen im SYN_RECV-Status voll zu sein! Ist es möglich, dass die SYN-Flutnachricht ein roter Hering ist und sich etwas anderes als das syn_backlog füllt?
Wenn jemand andere Optimierungsoptionen hat, die ich noch nicht ausprobiert habe, würde ich sie gerne ausprobieren, aber ich frage mich, ob die syn_backlog-Einstellung aus irgendeinem Grund nicht richtig angewendet wird.
Antworten:
Das ist also eine nette Frage.
Am Anfang war ich überrascht , dass Sie sehen alle Verbindungen in SYN_RECV Zustand mit SYN - Cookies aktiviert. Das Schöne an SYN-Cookies ist, dass Sie als Server unter Verwendung der Kryptografie zustandslos am TCP-3-Wege-Handshake teilnehmen können. Daher würde ich davon ausgehen, dass der Server überhaupt keine halboffenen Verbindungen darstellt, da dies derselbe Status ist, der nicht vorliegt wird nicht gehalten.
Tatsächlich zeigt ein kurzer Blick auf die Quelle (tcp_ipv4.c) interessante Informationen darüber, wie der Kernel SYN-Cookies implementiert. Im Wesentlichen verhält sich der Kernel trotz Aktivierung so, wie er es normalerweise tun würde, bis seine Warteschlange ausstehender Verbindungen voll ist. Dies erklärt Ihre bestehende Liste von Verbindungen im SYN_RECV-Status.
Erst wenn die Warteschlange für ausstehende Verbindungen voll ist und ein weiteres SYN-Paket (Verbindungsversuch) empfangen wurde und mehr als eine Minute seit der letzten Warnmeldung vergangen ist, sendet der Kernel die Warnmeldung, die Sie gesehen haben ("Senden von Cookies"). ). SYN-Cookies werden auch dann gesendet, wenn die Warnmeldung nicht vorhanden ist. Die Warnmeldung soll Ihnen nur Aufschluss darüber geben, dass das Problem nicht behoben wurde.
Anders ausgedrückt, wenn Sie SYN-Cookies deaktivieren, verschwindet die Nachricht. Das klappt für Sie nur, wenn Sie nicht mehr von SYN überflutet werden.
Um einige der anderen Dinge anzusprechen, die Sie getan haben:
net.ipv4.tcp_synack_retries
:net.ipv4.tcp_syn_retries
: Das Ändern dieser Einstellung kann keine Auswirkungen auf eingehende Verbindungen haben (betrifft nur ausgehende Verbindungen).Die anderen Variablen, die Sie erwähnen, habe ich nicht recherchiert, aber ich vermute, dass die Antworten auf Ihre Frage genau hier richtig sind.
Wenn Sie nicht mit SYN überflutet sind und der Computer auf Nicht-HTTP-Verbindungen reagiert (z. B. SSH), liegt wahrscheinlich ein Netzwerkproblem vor, und Sie sollten einen Netzwerktechniker beauftragen, sich das anzuschauen. Wenn der Computer im Allgemeinen nicht mehr reagiert, auch wenn Sie nicht mit SYN überflutet sind, scheint es ein ernstes Lastproblem zu sein, wenn die Erstellung von TCP-Verbindungen beeinträchtigt wird (ziemlich niedrige Ebene und Ressourcen nicht intensiv).
quelle
Ich habe genau das gleiche Problem bei einer Neuinstallation von Ubuntu Oneiric 11.10 mit einem Webserver (Apache2) und einer stark ausgelasteten Website. Unter Ubuntu Oneiric 11.10 waren Syncookies standardmäßig aktiviert.
Ich hatte die gleichen Kernelnachrichten, die einen möglichen SYN-Flood-Angriff auf den Webserver-Port angaben:
Gleichzeitig war ich mir ziemlich sicher, dass kein Angriff stattfand. Ich hatte diese Nachrichten im 5-Minuten-Intervall zurück. Dies schien nur ein Last-Peek zu sein, da ein Angreifer die Last ständig hoch hielt, während er versuchte, den Server dazu zu bringen, nicht mehr auf Anforderungen zu reagieren.
Das Einstellen des
net.ipv4.tcp_max_syn_backlog
Parameters führte zu keiner Verbesserung - die Meldungen wurden mit der gleichen Geschwindigkeit fortgesetzt. Die Tatsache, dass die Anzahl der SYN_RECV-Verbindungen immer sehr niedrig war (in meinem Fall unter 250), war ein Indikator dafür, dass es einen anderen Parameter geben muss, der für diese Nachricht verantwortlich ist.Ich habe diese Fehlernachricht https://bugzilla.redhat.com/show_bug.cgi?id=734991 auf der Red Hat-Site gefunden, die besagt, dass die Kernelnachricht ein Ergebnis eines Fehlers (oder einer Fehlkonfiguration) auf der Anwendungsseite sein könnte . Natürlich ist die Logmeldung sehr irreführend! Da dies nicht der in diesem Fall verantwortliche Kernel-Parameter ist, sondern der Parameter Ihrer Anwendung, der an den Kernel übergeben wird.
Daher sollten wir uns auch die Konfigurationsparameter unserer Webserver-Anwendung ansehen. Holen Sie sich Apache-Dokumente und rufen Sie http://httpd.apache.org/docs/2.0/mod/mpm_common.html#listenbacklog auf
Der Standardwert von
ListenBacklog
Parameters ist 511. (Dies entspricht der Anzahl der Verbindungen, die Sie auf Ihrem Red Hat Server beobachtet haben. Auf einem anderen Server ist möglicherweise eine niedrigere Nummer konfiguriert.)Apache hat einen eigenen Konfigurationsparameter für die Backlog-Warteschlange für eingehende Verbindungen. Wenn Sie viele eingehende Verbindungen haben und diese zu einem beliebigen Zeitpunkt (wie zufällig) alle gleichzeitig eintreffen, sodass der Webserver sie nicht schnell genug in geeigneter Weise bedienen kann, wird dies Ihrem Rückstand schaden Wenn Sie mit 511 Verbindungen voll sind, wird der Kernel die obige Meldung auslösen, die einen möglichen SYN-Flood-Angriff angibt.
Um dies zu lösen, füge ich die folgende Zeile
/etc/apache2/ports.conf
oder eine der anderen .conf-Dateien hinzu, die von Apache geladen werden (/etc/apache2/apache2.conf
sollte auch in Ordnung sein):Sie sollten auch den
net.ipv4.tcp_max_syn_backlog
Wert auf einen vernünftigen Wert einstellen . Nach meinem Verständnis begrenzt das Kernel-Maximum den Wert, den Sie in der Apache-Konfiguration konfigurieren können. so laufe:Vergessen Sie nicht, nach dem Einstellen der Konfiguration Ihren Apache neu zu starten:
In meinem Fall hat diese Konfigurationsänderung die Kernelwarnungen sofort gestoppt. Ich kann die Nachrichten reproduzieren, indem ich in der Apache-Konfiguration einen niedrigen ListenBackLog-Wert einstelle.
quelle
Nach einigen Tests mit Kernel 3.4.9 ist die Anzahl der SYN_RECV-Verbindungen in netstat abhängig von
/proc/sys/net/core/somaxconn
auf die nächste Potenz von 2 aufgerundet (zB 128 -> 256)/proc/sys/net/ipv4/tcp_max_syn_backlog
if/proc/sys/net/ipv4/tcp_syncookies
ist auf0
oder 100% von if/proc/sys/net/ipv4/tcp_syncookies
ist auf gesetzt1
ListenBackLog
in der Apache-Konfiguration auf die nächste Zweierpotenz aufgerundet (zB 128 -> 256)Von jedem dieser Parameter wird das Minimum verwendet. Nach einem Wechsel von somaxconn oder ListenBackLog muss Apache neu gestartet werden.
Und nach dem Erhöhen von tcp_max_syn_backlog muss auch Apache neu gestartet werden.
Ohne tcp_syncookies blockiert Apache, warum in diesem Fall nur 75% von tcp_max_syn_backlog das Limit ist, ist seltsam. Wenn Sie diesen Parameter erhöhen, werden die SYN_RECV-Verbindungen auf 100% des alten Werts erhöht, ohne dass Apache neu gestartet werden muss.
quelle
/bin/echo m >/proc/sysrq-trigger
häufig zu einer möglichen SYN-Überflutung von Port 80. Senden von Cookies .