Keine Antwort auf einige SYN-Pakete, wenn Zeitstempel aktiviert sind

9

Ich habe einen TCP-Server, der auf einem Computer ("der Server") mit Ubuntu 12.04.3 (Kernel 3.8.0-31-generic) lauscht. Es empfängt Verbindungen von 2 verschiedenen Client-Computern. Auf Maschine A wird Ubuntu 12.04.4 (3.11.0-17-generic) und auf Maschine B Ubuntu 11.10 (3.0.0-32-Server) ausgeführt.

Wenn TCP-Zeitstempel auf dem Server aktiviert sind (sysctl net.ipv4.tcp_timestamps = 1), werden manchmal SYN-Pakete von Computer A "ignoriert". Wenn ich tcpdump auf dem Server verwende (im nicht promiskuitiven Modus), kann ich sehen, dass die SYNs in Ordnung und mit korrekten Prüfsummen ankommen - es gibt nur keine Antwort - kein SYN / ACK und kein RST. Maschine A überträgt das SYN mehrmals erneut, bevor es aufgibt. Die Client-Software, die auf Computer A (in diesem Fall wget) ausgeführt wird, versucht sofort, eine neue Verbindung herzustellen, und ist erfolgreich. Sie erhält sofort eine SYN / ACK.

Maschine B hat keine Probleme mit demselben Server und der Datenverkehr sieht normal aus - er verwendet auch dieselben TCP-Optionen wie Maschine A (wie aus den Erfassungsdateien hervorgeht). Durch Deaktivieren der TCP-Zeitstempel auf dem Server funktioniert alles ordnungsgemäß.

Die Zeitstempel in den ignorierten SYN-Paketen scheinen mir jedoch gültig zu sein, daher bin ich mir nicht sicher, warum sie Probleme verursachen oder ob sie überhaupt die zugrunde liegende Ursache sind.

Ich habe hier ein anonymisiertes pcap https://www.dropbox.com/s/onimdkbyx9lim70/server-machineA.pcap platziert . Es wurde auf dem Server (10.76.0.74) aufgenommen, auf dem Computer A (10.4.0.76) erfolgreich ein HTTP-GET ausführt (Pakete 1 bis 10) und dann 1 Sekunde später versucht, dieselbe URL erneut abzurufen (Pakete 11 bis 17), aber stattdessen hat seine SYNs ignoriert. Die Pakete 18 bis 27 sind ein weiterer Erfolg.

Ich vermute, dass dies ein ähnliches Problem ist wie das unter " Warum sollte ein Server kein SYN / ACK-Paket als Antwort auf ein SYN-Paket senden " beschrieben, und während das Deaktivieren von Zeitstempeln eine Problemumgehung darstellt, möchte ich verstehen, was vor sich geht. Ist das nur ein Fehler?

Es wird keine lokale Firewall ausgeführt. Der Server verarbeitet einige TCP-Verbindungen (jeweils ca. 32 KB), verfügt jedoch über ausreichend freien Speicher / CPU. Zum Zeitpunkt des in der PCAP angezeigten Tests gab es keine weiteren TCP-Verbindungen zwischen Computer A und dem Server. Es gibt kein Anzeichen dafür, dass sich die Akzeptanzwarteschlange der Serveranwendung plötzlich füllt (außerdem sollte dies vermutlich beide Clients betreffen). Da die Pakete in einem auf dem Server aufgenommenen PCAP in Ordnung aussehen, scheint es nicht so, als ob ein dazwischenliegendes Netzwerkgerät die Dinge kaputt macht.

Ich habe dies ursprünglich in den Ubuntu-Foren gepostet, aber im Nachhinein ist dies möglicherweise ein geeigneterer Ort. Ich hoffe auf die Ausleihe eines Hinweises.

user133831
quelle

Antworten:

5

In meinem Fall hat der folgende Befehl das Problem mit fehlenden SYN / ACK-Antworten vom Linux-Server behoben:

sysctl -w net.ipv4.tcp_tw_recycle=0

Ich denke, es ist korrekter als das Deaktivieren von TCP-Zeitstempeln, da TCP-Zeitstempel schließlich nützlich sind (PAWS, Fensterskalierung usw.).

In der Dokumentation zum wird tcp_tw_recycleausdrücklich darauf hingewiesen, dass die Aktivierung nicht empfohlen wird, da viele NAT-Router Zeitstempel beibehalten und somit PAWS aktiviert wird , da Zeitstempel von derselben IP nicht konsistent sind.

   tcp_tw_recycle (Boolean; default: disabled; since Linux 2.4)
          Enable fast recycling of TIME_WAIT sockets.  Enabling this
          option is not recommended for devices communicating with the
          general Internet or using NAT (Network Address Translation).
          Since some NAT gateways pass through IP timestamp values, one
          IP can appear to have non-increasing timestamps.  See RFC 1323
          (PAWS), RFC 6191.
lav
quelle
Die fraglichen Maschinen wurden alle aktualisiert und ich glaube, dass das Problem nicht mehr auftritt, daher kann ich dies jetzt nicht versuchen. In diesem Fall war jedoch kein NAT zwischen Client und Server beteiligt. Es scheint mir immer noch verdächtig zu sein.
user133831