Zufällige TCP-RSTs auf bestimmten Websites, was ist los?

34

Kurzversion: Ein Windows Server 2012-Computer in meinem Netzwerk erhält dauerhafte, aber zeitweise auftretende TCP-RSTs, wenn eine Verbindung zu bestimmten Websites hergestellt wird. Keine Ahnung, woher sie kommen. Sehen Sie sich das Wireshark-Protokoll für meine Analysen und Fragen an.

Lange Version:

Wir betreiben einen Caching-Web-Proxy auf einem unserer Server, um unser kleines Büro zu bedienen. Ein Mitarbeiter meldete, dass beim Herstellen einer Verbindung zu bestimmten Websites viele Fehler beim Zurücksetzen der Verbindung oder beim Anzeigen der Seite nicht angezeigt werden. Durch diese Aktualisierung wird der Fehler jedoch in der Regel behoben.

Ich habe das Browserverhalten überprüft und dann direkter, indem ich einen nicht-Proxy-Browser auf dem Server selbst ausprobiert habe. Aber Pings und Traceroutes zu problematischen Sites zeigen keine Probleme, die Probleme schienen sich auf TCP-Verbindungen zu beschränken.

Ich habe dann ein Skript erstellt, um die betroffenen Sites zu testen, indem ich ihnen HTTP-HEAD-Anforderungen direkt über cURL schickte und überprüfte, wie oft sie erfolgreich waren. Ein typischer Test sieht folgendermaßen aus: (Dieser Test ist nicht überarbeitet und wird direkt auf dem fehlerhaften Server ausgeführt.)

C:\sdk\Apache24\htdocs>php rhTest.php
Sending HTTP HEAD requests to "http://www.washingtonpost.com/":
20:21:42: Length: 0     Response Code: NULL (0%)
20:22:02: Length: 0     Response Code: NULL (0%)
20:22:22: Length: 0     Response Code: NULL (0%)
20:22:42: Length: 0     Response Code: NULL (0%)
20:23:02: Length: 3173  Response Code: HTTP/1.1 302 Moved Temporarily (20%)
20:23:22: Length: 3174  Response Code: HTTP/1.1 302 Moved Temporarily (33.33%)
20:23:43: Length: 0     Response Code: NULL (28.57%)
20:24:03: Length: 3171  Response Code: HTTP/1.1 302 Moved Temporarily (37.5%)
20:24:23: Length: 3173  Response Code: HTTP/1.1 302 Moved Temporarily (44.44%)
20:24:43: Length: 3172  Response Code: HTTP/1.1 302 Moved Temporarily (50%)
20:25:03: Length: 0     Response Code: NULL (45.45%)

Langfristig sind nur etwa 60% der Anfragen erfolgreich, der Rest gibt nichts zurück, mit einem Curl-Fehlercode von: "cURL-Fehler (56): Fehler beim Empfangen von Daten vom Peer". Das schlechte Verhalten ist für die Websites I konsistent Test (keine Website wurde jemals "besser") und es ist ziemlich hartnäckig. Ich habe seit einer Woche eine Fehlerbehebung durchgeführt, und Mitarbeiter berichten, dass das Problem anscheinend schon seit Monaten besteht.

Ich habe das HEAD-Anforderungsskript auf anderen Computern in unserem Netzwerk getestet: Keine Probleme, alle Verbindungen werden zu allen Sites auf meiner Testliste durchlaufen. Dann richte ich auf meinem persönlichen Desktop einen Proxy ein, und wenn ich die HEAD-Anforderungen vom problematischen Server durchführe, werden alle Verbindungen hergestellt. Was auch immer das Problem ist, es ist sehr spezifisch für diesen Server.

Als nächstes habe ich versucht herauszufinden, auf welchen Websites das Verhalten beim Zurücksetzen der Verbindung auftritt:

  • Keine unserer Intranetsites (192.168.xx) unterbricht Verbindungen.
  • Keine IPv6-Site, auf der ich Drop-Verbindungen getestet habe. (Wir sind Dual-Stack)
  • Nur eine kleine Minderheit von Internet-IPv4-Sites unterbricht Verbindungen.
  • Jede Site, die Cloudflare als CDN verwendet (die ich getestet habe), unterbricht Verbindungen. (aber das Problem scheint nicht ausschließlich für Cloudflare-Sites zu sein)

Dieser Winkel entwickelte sich nicht zu etwas wirklich Nützlichem. Als nächstes installierte ich wireshark, um zu sehen, was los war, wenn eine Anfrage fehlschlug. Eine fehlgeschlagene HEAD-Anfrage sieht folgendermaßen aus: (größerer Screenshot hier: http://imgur.com/TNfRUtX )

127 48.709776000    192.168.1.142   192.33.31.56    TCP 66  52667 > http [SYN, ECN, CWR] Seq=0 Win=8192 Len=0 MSS=8960 WS=256 SACK_PERM=1
128 48.728207000    192.33.31.56    192.168.1.142   TCP 66  http > 52667 [SYN, ACK, ECN] Seq=0 Ack=1 Win=42340 Len=0 MSS=1460 SACK_PERM=1 WS=128
129 48.728255000    192.168.1.142   192.33.31.56    TCP 54  52667 > http [ACK] Seq=1 Ack=1 Win=65536 Len=0
130 48.739371000    192.168.1.142   192.33.31.56    HTTP    234 HEAD / HTTP/1.1 
131 48.740917000    192.33.31.56    192.168.1.142   TCP 60  http > 52667 [RST] Seq=1 Win=0 Len=0
132 48.757766000    192.33.31.56    192.168.1.142   TCP 60  http > 52667 [ACK] Seq=1 Ack=181 Win=42240 Len=0
133 48.770314000    192.33.31.56    192.168.1.142   TCP 951 [TCP segment of a reassembled PDU]
134 48.807831000    192.33.31.56    192.168.1.142   TCP 951 [TCP Retransmission] http > 52667 [PSH, ACK] Seq=1 Ack=181 Win=42240 Len=897
135 48.859592000    192.33.31.56    192.168.1.142   TCP 951 [TCP Retransmission] http > 52667 [PSH, ACK] Seq=1 Ack=181 Win=42240 Len=897
138 49.400675000    192.33.31.56    192.168.1.142   TCP 951 [TCP Retransmission] http > 52667 [PSH, ACK] Seq=1 Ack=181 Win=42240 Len=897
139 50.121655000    192.33.31.56    192.168.1.142   TCP 951 [TCP Retransmission] http > 52667 [PSH, ACK] Seq=1 Ack=181 Win=42240 Len=897
141 51.564009000    192.33.31.56    192.168.1.142   TCP 951 [TCP Retransmission] http > 52667 [PSH, ACK] Seq=1 Ack=181 Win=42240 Len=897
143 54.452561000    192.33.31.56    192.168.1.142   TCP 951 [TCP Retransmission] http > 52667 [PSH, ACK] Seq=1 Ack=181 Win=42240 Len=897

Die Art und Weise, wie ich das lese (korrigiere mich, wenn ich mich irre, das ist nicht wirklich meine Gegend), ist folgende:

  • Wir öffnen eine TCP-Verbindung zum Webserver
  • Webserver ACK's
  • HTTP-HEAD-Anforderung wird gesendet
  • Es gibt ein RST-Paket, das als von der Webserver-IP markiert ist und die Verbindung beendet.
  • Webserver sendet ACK
  • Webserver (versucht), auf HEAD-Anfrage mit gültigen HTTP-Daten zu antworten (Die 951-Byte-Antwort enthält den richtigen HTTP-Header)
  • Der Webserver überträgt die gültige HTTP-Antwort erneut (mehrmals über mehrere Sekunden), kann jedoch keinen Erfolg erzielen, da die Verbindung über RST hergestellt wurde

Also, wenn der Webserver eine gültige RST gesendet hat, warum versucht er immer wieder, die Anforderung zu erfüllen? Und wenn der Webserver die RST nicht generiert hat, was zum Teufel hat das getan?

Dinge, die ich ausprobiert habe und die keine Wirkung hatten:

  • NIC-Teaming deaktivieren
  • Auswechseln des Netzwerkadapters (Ersatz-NIC funktionierte bekanntermaßen)
  • Zuweisen einer statischen IP.
  • Ipv6 deaktivieren.
  • Jumbo Frames deaktivieren.
  • Schließen Sie den Server eines Nachts direkt an unser Modem an und umgehen Sie dabei unsere Switches und Router.
  • Windows Firewall ausschalten.
  • Zurücksetzen der TCP-Einstellungen über Netsh
  • Deaktivieren Sie praktisch jeden anderen Dienst auf dem Server. (Wir benutzen es meistens als Dateiserver, aber es gibt Apache & ein paar DBs)
  • Kopf auf Schreibtisch schlagen (mehrmals)

Ich vermute, dass etwas auf dem Server die RST-Pakete generiert, aber für das Leben von mir kann ich es nicht finden. Ich fühle mich wie wenn ich wüsste: Warum ist es nur dieser Server? ODER warum nur einige Websites? es würde sehr helfen. Während ich noch neugierig bin, neige ich immer mehr dazu, aus dem Orbit auszubrechen und von vorne zu beginnen.

Ideen / Vorschläge?

-Vielen Dank

Morty
quelle
Unter welchem ​​Betriebssystem läuft dieser Caching-Proxy-Server? Und was ist die Proxy-Server-Software?
Michael Hampton
1
Auf dem Server wird Windows Server 2012 ausgeführt, der Proxy ist Squid 3.3.3, das über Cygwin ausgeführt wird. Dies geschieht jedoch für alle TCP-Verbindungen vom Computer, nicht nur für die Verbindungen des Proxys. Das Skript für den Curl-Test ist nicht enthalten.
Morty

Antworten:

38

Ihre Paketerfassung hatte etwas Ungewöhnliches: Die ECN-Bits wurden im ausgehenden SYN-Paket gesetzt.

Explizite Überlastungsbenachrichtigung ist eine Erweiterung des IP-Protokolls, mit der Hosts schneller auf Überlastungen des Netzwerks reagieren können. Es wurde vor 15 Jahren zum ersten Mal im Internet eingeführt, es wurden jedoch schwerwiegende Probleme festgestellt, als es zum ersten Mal bereitgestellt wurde. Am schwerwiegendsten war, dass viele Firewalls beim Empfang eines SYN-Pakets mit gesetzten ECN-Bits entweder Pakete verwerfen oder ein RST zurückgeben .

Infolgedessen haben die meisten Betriebssysteme ECN standardmäßig deaktiviert, zumindest für ausgehende Verbindungen. Daher vermute ich, dass viele Websites (und Firewall-Anbieter!) Ihre Firewalls einfach nie repariert haben .

Bis Windows Server 2012 veröffentlicht wurde. Microsoft hat ECN ab dieser Betriebssystemversion standardmäßig aktiviert .

Leider hat in letzter Zeit noch niemand die Reaktionen von Internetseiten auf ECN ausführlich getestet. Es ist daher schwer einzuschätzen, ob die Probleme aus den frühen 2000er Jahren noch bestehen, aber ich vermute, dass dies der Fall ist und zumindest Ihr Datenverkehr manchmal durchlaufen solche Geräte.

Nachdem ich ECN auf meinem Desktop aktiviert und Wireshark dann gestartet hatte, dauerte es nur ein paar Sekunden, bis ich ein Beispiel für einen Host entdeckte, von dem ich eine RST für ein Paket mit SYN und ECN erhielt, obwohl die meisten Hosts gut zu funktionieren scheinen. Vielleicht gehe ich selbst ins Internet ...

Sie können versuchen, ECN auf Ihrem Server zu deaktivieren, um festzustellen, ob das Problem behoben ist. Dies führt auch dazu, dass Sie DCTCP nicht verwenden können. In einem kleinen Büro ist es jedoch sehr unwahrscheinlich, dass Sie dies tun oder dies tun müssen.

netsh int tcp set global ecncapability=disabled
Michael Hampton
quelle
4
Danke dir! Nach dem Deaktivieren von ECN sehe ich eine Erfolgsquote von 100% für Verbindungen zu den problematischsten Sites! Ich muss am nächsten Morgen weitere Tests durchführen, bevor ich unseren Proxy wieder einschalte, aber ich werde fortfahren und dies als sowohl beantwortet als auch als einen weiteren überwältigenden Sieg im anhaltenden Krieg von Microsoft QA gegen Benutzer kennzeichnen.
Morty
9
Fairerweise halte ich es nicht für die Schuld von Microsoft, dass einige Firewall-Administratoren Idioten sind. ECN ist sehr schön zu haben, da es sehr hilfreich ist, und es wäre schön, wenn wir alle damit anfangen könnten ... eines Tages.
Michael Hampton
Oh, ich frage mich, ob dies die Unmengen von Resets erklärt, die ich seit Ewigkeiten von Imgur und Wikia bekomme (passiert mit zwei verschiedenen lokalen ISPs, aber niemals, wenn VPNs durch ein anderes Land gehen, was mich verwirrt)
Grawity
Ich vermute (kann aber offensichtlich nicht beweisen), dass einige der dafür verantwortlichen Maschinen in der standardfreien Zone lauern.
Michael Hampton