Welche Konsequenzen hat es, wenn tcp_tw_recycle / reuse auf 1 gesetzt wird?

10

Ich habe beide tcp_tw_recycle / reuse in meiner Konfigurationsdatei auf 1 gesetzt.

Was sind die Konsequenzen davon?

Wenn ein TCP-Socket wiederverwendet wird, stellt dies ein Sicherheitsrisiko dar? dh 2 verschiedene Verbindungen, die beide möglicherweise Daten senden können?

Ist es für kurzlebige Verbindungen mit geringer Wahrscheinlichkeit einer erneuten Verbindung geeignet?

Code-Vervollständigung
quelle
Die offensichtliche Frage ist, was erwarten Sie von dieser Änderung?
Robert Munteanu
1
@RobertMunteanu zu: serverfault.com/questions/342501/...
codecompleting

Antworten:

24

Wenn beide tcp_tw_reuseund tcp_tw_recycledeaktiviert sind, stellt der Kernel standardmäßig sicher, dass Sockets im TIME_WAITStatus lange genug in diesem Status bleiben - lange genug, um sicherzustellen, dass Pakete, die zu zukünftigen Verbindungen gehören, nicht mit späten Paketen der alten Verbindung verwechselt werden.

Wenn Sie diese Option aktivieren tcp_tw_reuse, können Sockets im TIME_WAITStatus verwendet werden, bevor sie ablaufen, und der Kernel versucht sicherzustellen, dass keine Kollision mit TCP-Sequenznummern vorliegt. Wenn Sie tcp_timestamps(auch bekannt als PAWS, zum Schutz vor verpackten Sequenznummern) aktivieren , wird sichergestellt, dass diese Kollisionen nicht auftreten können. Sie müssen jedoch TCP-Zeitstempel an beiden Enden aktivieren (zumindest nach meinem Verständnis). Weitere Informationen finden Sie in der Definition von tcp_twsk_unique .

Wenn Sie aktivieren tcp_tw_recycle, wird der Kernel viel aggressiver und nimmt Annahmen zu den Zeitstempeln vor, die von Remote-Hosts verwendet werden. Es verfolgt den letzten Zeitstempel, der von jedem Remote-Host mit einer Verbindung im TIME_WAITStatus verwendet wird, und ermöglicht die Wiederverwendung eines Sockets, wenn der Zeitstempel korrekt erhöht wurde. Wenn sich jedoch der vom Host verwendete Zeitstempel ändert (dh die Zeit zurückversetzt), wird das SYNPaket stillschweigend verworfen und die Verbindung wird nicht hergestellt (es wird ein Fehler angezeigt, der dem "Verbindungszeitlimit" ähnelt). Wenn Sie in den Kernel-Code eintauchen möchten, ist die Definition von tcp_timewait_state_process möglicherweise ein guter Ausgangspunkt.

Jetzt sollten Zeitstempel niemals in der Zeit zurückgehen. es sei denn:

  • Der Host wird neu gestartet (aber bis er wieder hochgefahren ist, ist der TIME_WAITSocket wahrscheinlich abgelaufen, sodass dies kein Problem darstellt.)
  • Die IP-Adresse wird schnell von etwas anderem wiederverwendet ( TIME_WAITVerbindungen bleiben etwas erhalten, andere Verbindungen werden jedoch wahrscheinlich unterbrochen TCP RST, wodurch Speicherplatz frei wird).
  • Die Netzwerkadressübersetzung (oder eine Smarty-Pants-Firewall) ist in der Mitte der Verbindung beteiligt.

Im letzteren Fall können Sie mehrere Hosts hinter derselben IP-Adresse haben und daher unterschiedliche Sequenzen von Zeitstempeln (oder die Zeitstempel werden bei jeder Verbindung von der Firewall zufällig ausgewählt). In diesem Fall können einige Hosts nach dem Zufallsprinzip keine Verbindung herstellen, da sie einem Port zugeordnet sind, für den der TIME_WAITBucket des Servers einen neueren Zeitstempel hat. Aus diesem Grund wird in den Dokumenten angegeben, dass "NAT-Geräte oder Load Balancer aufgrund der Einstellung möglicherweise Drop-Frames starten".

Einige Leute empfehlen, in Ruhe zu lassen tcp_tw_recycle, aber aktivieren tcp_tw_reuseund senkentcp_timewait_len . Ich stimme zu :-)

jpetazzo
quelle
tolle Erklärung
Yanglei
6

Ich hatte gerade diesen Biss, also könnte vielleicht jemand von meinen Schmerzen und Leiden profitieren. Zunächst ein Link mit vielen Informationen: http://vincent.bernat.im/en/blog/2014-tcp-time-wait-state-linux.html

Bestimmtes:

Das bloße Ergebnis dieses Mangels an Dokumentation ist, dass wir zahlreiche Tuning-Anleitungen finden, die empfehlen, beide Einstellungen auf 1 zu setzen, um die Anzahl der Einträge im Status TIME-WAIT zu verringern. Wie in der Handbuchseite von tcp (7) angegeben, ist die Option net.ipv4.tcp_tw_recycle für öffentlich zugängliche Server jedoch recht problematisch, da sie keine Verbindungen von zwei verschiedenen Computern hinter demselben NAT-Gerät verarbeitet, was ein schwer zu bewältigendes Problem darstellt erkennen und warten, um Sie zu beißen:

Ich habe diese recht erfolgreich aktiviert, um eine möglichst geringe Latenz und Haproxy-Konnektivität von Clients zu einem MySql-NDB-Cluster bereitzustellen. Dies war in einer privaten Cloud, und es gab überhaupt keine Verbindungen von irgendjemandem zu irgendeiner Art von NAT in der Mischung. Der Anwendungsfall machte Sinn, die Latenz für Radius-Clients, die NDB über Haproxy treffen, so weit wie möglich zu verringern. Es tat es.

Ich habe es erneut auf einem öffentlich zugänglichen Haproxy-System gemacht, den Web-Verkehr ausgeglichen, ohne die Auswirkungen wirklich zu untersuchen (dumm, richtig?!), Und nach langem Beheben und Verfolgen von Geistern festgestellt, dass:

  • Es wird Chaos für Clients verursachen, die sich über ein NAT verbinden.
  • Es ist fast unmöglich zu identifizieren, da es völlig zufällig und zeitweise ist und die Symptome Kunden A zu völlig anderen (oder nicht) Zeiten als Kunden B usw. treffen.

Auf Kundenseite sehen sie Zeiträume, in denen sie keine Antworten mehr auf die SYN-Pakete erhalten, manchmal hier und da und manchmal für längere Zeit. Wieder zufällig.

Die Kurzgeschichte hier, in meiner jüngsten, schmerzhaften Erfahrung, ist , diese auf öffentlich zugänglichen Servern unabhängig von ihrer Rolle in Ruhe zu lassen / zu deaktivieren!

Mac
quelle
4

Aus 'man 7 tcp' sehen Sie Folgendes:

   tcp_tw_recycle (Boolean; default: disabled; since Linux 2.4)
          Enable fast recycling of TIME_WAIT sockets.  Enabling this option is not recommended since this causes problems when working with NAT
          (Network Address Translation).

   tcp_tw_reuse (Boolean; default: disabled; since Linux 2.4.19/2.6)
          Allow  to  reuse  TIME_WAIT  sockets  for  new connections when it is safe from protocol viewpoint.  It should not be changed without
          advice/request of technical experts.

Da hilft nicht viel. Diese Frage hat auch einige gute Einsichten:

/programming/6426253/tcp-tw-reuse-vs-tcp-tw-recycle-which-to-use-or-both

Aber keine spezifischen Informationen darüber, warum die Wiederverwendung sicherer ist als das Recycling. Die grundlegende Antwort lautet, dass mit tcp_tw_reuse derselbe Socket verwendet werden kann, wenn in TIME_WAIT bereits einer mit denselben TCP-Parametern vorhanden ist und sich in einem Zustand befindet, in dem kein weiterer Datenverkehr erwartet wird (ich glaube, dies ist der Zeitpunkt, an dem eine FIN gesendet wurde ). tcp_tw_recycle hingegen verwendet nur die Sockets in TIME_WAIT mit denselben Parametern, unabhängig vom Status, was Stateful Firewalls verwirren kann, die möglicherweise unterschiedliche Pakete erwarten.

tcp_tw_reuse kann selektiv im Code ausgeführt werden, indem die Socket-Option SO_REUSEADDR festgelegt wird, die man 7 socketals solche dokumentiert ist :

   SO_REUSEADDR
          Indicates that the rules used in validating addresses supplied in a bind(2) call should allow reuse of local addresses.  For  AF_INET
          sockets  this means that a socket may bind, except when there is an active listening socket bound to the address.  When the listening
          socket is bound to INADDR_ANY with a specific port then it is not possible to bind to this port for any local address.   Argument  is
          an integer boolean flag.
SpamapS
quelle
1
Sind Sie sicher, dass SO_REUSEADDRdas mit verbunden ist tcp_tw_reuse? Soweit ich weiß, SO_REUSEADDRgilt dies nur, wenn Sie möchten bind(), während tcp_tw_reuseder Kernel angewiesen wird, den Port eines lokalen Sockets im TIME_WAITStatus wiederzuverwenden, wenn eine neue ausgehende Verbindung erstellt werden muss.
Jpetazzo
Nein, ich bin mir nicht sicher. :-P
SpamapS