"Mögliches SYN-Flooding" im Protokoll trotz geringer Anzahl von SYN_RECV-Verbindungen

30

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 -tunamit 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 -lIch 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 -pSyncookies 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.

Alex Forbes
quelle

Antworten:

27

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:
    • Das Erhöhen dieser Einstellung hat keine positiven Auswirkungen auf die eingehenden Verbindungen, die gefälscht werden, und auch nicht auf Verbindungen, die anstelle des serverseitigen Status ein SYN-Cookie erhalten (auch keine Wiederholungsversuche).
    • Bei eingehenden gefälschten Verbindungen erhöht sich durch Erhöhen die Anzahl der Pakete, die Sie an eine gefälschte Adresse senden, und möglicherweise die Zeit, die diese gefälschte Adresse in Ihrer Verbindungstabelle verbleibt (dies kann ein erheblicher negativer Effekt sein).
    • Bei normaler Auslastung / Anzahl eingehender Verbindungen ist es umso wahrscheinlicher, dass Sie Verbindungen über Verbindungen, die Pakete verwerfen, schnell und erfolgreich abschließen, je höher diese Zahl ist. Es gibt abnehmende Renditen für die Erhöhung dieser.
  • 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).

Slartibartfast
quelle
Danke - das ist eine interessante und informative Antwort. Es beantwortet sicherlich meine Frage nach der Beziehung zwischen den Verbindungen im SYN_RECV-Status und dem Senden von Cookies. Der Computer reagierte auf Nicht-HTTP, einschließlich SSH und HTTPS, das viel weniger Verkehr als HTTP empfängt. Aus diesem Grund haben wir beschlossen, den Verkehr zu reduzieren.
Alex Forbes
Im Hinblick darauf, dass ein Netzwerktechniker einen Blick darauf wirft - ein guter Vorschlag, aber wir migrieren von diesem Rechenzentrum weg. Daher lohnt es sich wahrscheinlich nicht, wenn wir ein paar neue Server an anderer Stelle online stellen. Ich glaube, Sie haben Recht, wenn es sich um ein Netzwerkproblem handelt - vielleicht um ein Problem mit dem Load Balancer oder der Firewall. Nochmals vielen Dank für Ihre Erkenntnisse!
Alex Forbes
13

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:

Kernel: [739408.882650] TCP: Mögliches SYN-Flooding auf Port 80. Senden von Cookies.

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_backlogParameters 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.confoder eine der anderen .conf-Dateien hinzu, die von Apache geladen werden ( /etc/apache2/apache2.confsollte auch in Ordnung sein):

ListenBackLog 5000

Sie sollten auch den net.ipv4.tcp_max_syn_backlogWert 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:

sudo sysctl -w net.ipv4.tcp_max_syn_backlog=5000

Vergessen Sie nicht, nach dem Einstellen der Konfiguration Ihren Apache neu zu starten:

sudo service apache2 restart ( or sudo /etc/init.d/apache2 restart )

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.

Jeff
quelle
2
Gute Antwort. Angenommen, was Sie sagen, ist korrekt, dann würde ich dies als akzeptierte Antwort markieren, aber ich kann es nicht wirklich testen. Durch Verringern der Last wurde das Problem behoben, und ich habe die Richtlinie, nicht ohne guten Grund an Produktionsservern herumzubasteln :)
Alex Forbes
Ich kann bestätigen, dass dies funktioniert. Im Wesentlichen handelt es sich um eine Kernel-Anti-DDOS-Funktion. Wenn Sie jedoch sagen, dass viel Webverkehr vorliegt, werden Ihre legitimen Benutzer blockiert!
Areeb Soo Yasir
5

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)
  • 75% von /proc/sys/net/ipv4/tcp_max_syn_backlogif /proc/sys/net/ipv4/tcp_syncookiesist auf 0oder 100% von if /proc/sys/net/ipv4/tcp_syncookiesist 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.

usoft
quelle
Außerdem führt der Anruf /bin/echo m >/proc/sysrq-triggerhäufig zu einer möglichen SYN-Überflutung von Port 80. Senden von Cookies .
usoft