Losowe TCP RST na niektórych stronach internetowych, co się dzieje?

34

Krótka wersja: Jeden komputer z systemem Windows Server 2012 w mojej sieci staje się trwały, ale sporadyczny, gdy połączenia RST TCP są połączone z pewnymi stronami internetowymi. Nie wiem skąd pochodzą. Sprawdź dziennik wireshark dla mojej analizy i pytań.

Długa wersja:

Na jednym z naszych serwerów uruchamiamy buforujący serwer proxy w celu obsługi naszego małego biura. Współpracownik zgłosił występowanie wielu błędów „Resetuj połączenie” lub „Nie można wyświetlić strony” podczas łączenia się z niektórymi witrynami, ale odświeżenie zazwyczaj to naprawia.

Sprawdziłem zachowanie przeglądarki, a następnie bardziej bezpośrednio, wypróbowując przeglądarkę bez serwera proxy na samym serwerze. Ale pingi i traceroute do kłopotliwych stron nie wykazują żadnych problemów, wydawało się, że problemy ograniczają się do połączeń TCP.

Następnie stworzyłem skrypt do testowania dotkniętych stron, wysyłając im żądania HTTP HEAD bezpośrednio przez cURL i sprawdzając, jak często się to udaje. Typowy test wygląda następująco: (to nie przeszkadza, działa bezpośrednio na złym serwerze)

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%)

W dłuższej perspektywie tylko około 60% żądań się udaje, reszta nic nie zwraca, z kodem błędu zwijania się: „błąd cURL (56): Błąd podczas odbierania danych od elementu równorzędnego” Złe zachowanie jest spójne dla stron I test (żadna strona nigdy nie „poprawiła się”) i jest dość trwała, rozwiązuję problemy już od tygodnia, a współpracownicy zgłaszają, że problem istniał od miesięcy.

Testowałem skrypt żądania HEAD na innych komputerach w naszej sieci: bez problemów, wszystkie połączenia przechodzą do wszystkich stron na mojej liście testów. Następnie konfiguruję serwer proxy na moim osobistym pulpicie i kiedy uruchamiam żądania HEAD z problematycznego serwera, wszystkie połączenia przechodzą. Niezależnie od problemu, jest on bardzo specyficzny dla tego serwera.

Następnie próbowałem ustalić, które strony internetowe zachowują się podczas resetowania połączenia:

  • Żadna z naszych witryn intranetowych (192.168.xx) nie odrzuca połączeń.
  • Żadna witryna ipv6, w której testowałem, nie usuwa połączeń. (Mamy podwójny stos)
  • Tylko niewielka część internetowych witryn ipv4 zrywa połączenia.
  • Każda witryna, która korzysta z CloudFlare jako CDN (który testowałem) porzuca połączenia. (ale problem nie wydaje się występować wyłącznie w witrynach chmurowych)

Ten kąt nie przekształcił się w nic naprawdę pomocnego, więc następnie zainstalowałem wireshark, aby zobaczyć, co się dzieje, gdy żądanie nie powiedzie się. Nieudane żądania HEAD wyglądają tak: (większy zrzut ekranu tutaj: 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

Sposób, w jaki to czytam (popraw mnie, jeśli się mylę, to nie jest moja dziedzina):

  • Otwieramy połączenie TCP z serwerem WWW
  • ACK serwera sieci
  • Żądanie HTTP HEAD zostało wysłane
  • Istnieje pakiet RST, oznaczony jako z adresu IP serwera WWW, który zabija połączenie.
  • Serwer WWW wysyła ACK
  • Serwer WWW próbuje odpowiedzieć na żądanie HEAD prawidłowymi danymi HTTP (odpowiedź w bajcie 951 zawiera poprawny nagłówek HTTP)
  • Serwer WWW retransmituje (kilka razy w ciągu kilku sekund) prawidłową odpowiedź HTTP, ale nie może się powieść, ponieważ połączenie zostało wykonane RST

Jeśli więc serwer sieciowy wysłał prawidłowy RST, dlaczego wciąż próbuje wypełnić żądanie? A jeśli serwer nie wygenerował RST, co do cholery zrobił?

Rzeczy, których próbowałem, nie przyniosły efektu:

  • Wyłączanie zespołu kart sieciowych
  • Wymiana karty sieciowej (wiadomo, że działała zastępcza karta sieciowa)
  • Przypisywanie statycznego adresu IP.
  • Wyłączanie ipv6.
  • Wyłączanie ramek jumbo.
  • Podłączanie serwera bezpośrednio do naszego modemu jednej nocy, omijając nasze przełączniki i router.
  • Wyłączanie zapory systemu Windows.
  • Resetowanie ustawień TCP przez netsh
  • Wyłączanie praktycznie każdej innej usługi na serwerze. (Używamy go głównie jako serwera plików, ale jest apache i kilka baz danych)
  • Walić głową w biurko (wielokrotnie)

Podejrzewam, że coś na serwerze generuje pakiety RST, ale przez całe życie nie mogę tego znaleźć. Czuję się, jakbym wiedział: dlaczego to tylko ten serwer? LUB dlaczego tylko niektóre strony internetowe? bardzo by to pomogło. Chociaż wciąż jestem ciekawy, coraz bardziej mam ochotę nuke z orbity i zacząć od nowa.

Pomysły / sugestie?

-Dzięki

Morty
źródło
W jakim systemie operacyjnym działa buforowany serwer proxy? A jakie jest oprogramowanie serwera proxy?
Michael Hampton
1
Na serwerze działa system Windows Server 2012, proxy to squid 3.3.3 działający przez cygwin; ale dzieje się tak ze wszystkimi połączeniami TCP z komputera, nie tylko z połączeniami proxy. Skrypt testu zwijania jest niezabezpieczony.
Morty,

Odpowiedzi:

38

Przechwytywanie pakietów miało coś niezwykłego: bity ECN zostały ustawione w wychodzącym pakiecie SYN.

Wyraźne powiadomienie o przeciążeniu jest rozszerzeniem protokołu IP, który pozwala hostom szybciej reagować na przeciążenie sieci. Po raz pierwszy wprowadzono go do Internetu 15 lat temu, ale zauważono poważne problemy podczas jego pierwszego wdrożenia. Najpoważniejszym z nich było to, że wiele zapór ogniowych albo upuszczało pakiety, albo zwracało RST po otrzymaniu pakietu SYN z zestawem bitów ECN.

W rezultacie większość systemów operacyjnych domyślnie wyłączała ECN, przynajmniej dla połączeń wychodzących. W rezultacie podejrzewam, że wiele witryn (i dostawców zapór ogniowych!) Po prostu nigdy nie naprawia swoich zapór ogniowych .

Do czasu wydania Windows Server 2012. Microsoft włączony domyślnie ECN, zaczynając od tej wersji systemu operacyjnego.

Niestety nikt w niedawnej pamięci nie przeprowadził żadnych znaczących testów odpowiedzi stron internetowych na ECN, więc trudno jest ocenić, czy problemy zaobserwowane na początku XXI wieku nadal występują, ale mocno podejrzewam, że tak jest i że ruch jest przynajmniej czasami przechodząc przez taki sprzęt.

Po włączeniu ECN na pulpicie i uruchomieniu Wiresharka minęło zaledwie kilka sekund, zanim złapałem przykład hosta, z którego dostałem RST do pakietu z zestawem SYN i ECN, chociaż większość hostów wydaje się działać dobrze. Może sam pójdę zeskanować Internet ...

Możesz spróbować wyłączyć ECN na serwerze, aby sprawdzić, czy problem zniknie. Uniemożliwi to również korzystanie z DCTCP, ale w małym biurze jest bardzo mało prawdopodobne, abyś to robił lub miał taką potrzebę.

netsh int tcp set global ecncapability=disabled
Michael Hampton
źródło
4
Dziękuję Ci! Po wyłączeniu ECN widzę 100% sukcesu dla połączeń z najbardziej kłopotliwymi stronami! Będę musiał rano przetestować więcej przed ponownym włączeniem naszego serwera proxy, ale zamierzam zaznaczyć to jako odpowiedź na oba pytania i jako kolejne wielkie zwycięstwo w ciągłej wojnie Microsoft QA z użytkownikami.
Morty,
9
Szczerze mówiąc, nie sądzę, że to wina Microsoftu, że niektórzy administratorzy zapory są idiotami. ECN jest bardzo miły, ponieważ bardzo pomaga, i byłoby miło, gdybyśmy wszyscy mogli zacząć go używać ... pewnego dnia.
Michael Hampton
Och, zastanawiam się, czy to tłumaczy mnóstwo resetów, które otrzymywałem od Imgur i Wikii od wieków (dzieje się to z dwoma różnymi lokalnymi dostawcami usług internetowych, ale nigdy, gdy VPN przeszedł przez inny kraj, co mnie myli)
grawity
I podejrzewam (ale oczywiście nie można udowodnić), że niektóre z maszyn odpowiedzialnych za to czają się w domyślnej strefie wolnej.
Michael Hampton