Випадкові TCP RST на певних веб-сайтах, що відбувається?


34

Коротка версія: Один апарат Windows Server 2012 у моїй мережі отримує стійкі, але переривчасті TCP RST під час підключення до певних веб-сайтів. Данно, звідки вони родом. Ознайомтеся з журналом проводів про мої аналізи та запитання.

Довга версія:

Ми запускаємо кешування веб-проксі на одному з наших серверів для обслуговування нашого маленького офісу. Співробітник повідомив, що під час підключення до певних сайтів виникає багато помилок "Скидання з’єднання" або "Сторінка не може бути відображена", але оновлення зазвичай виправляє це.

Я перевірив поведінку веб-переглядача, а потім безпосередньо, спробувавши непроксі-браузер на самому сервері. Але пінг та відстеження до проблемних сайтів не показують жодних проблем; проблеми, здається, обмежуються підключенням tcp.

Потім я створив сценарій для тестування постраждалих сайтів, надсилаючи їм запити HTTP HEAD безпосередньо через CURL і перевіряючи, наскільки часто вони досягають успіху. Типовий тест виглядає приблизно так: (це непроксимоване, працює безпосередньо на поганому сервері)

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

В довгостроковій перспективі лише близько 60% запитів досягають успіху, решта не повертає нічого, з кодом помилки згортання: "CURL-помилка (56): Невдача при отриманні даних від однорангової" Погане поведінка узгоджується з веб-сайтами I тест (жоден сайт ніколи не став «кращим»), і він досить наполегливий, я вже тиждень виправляю неполадки, і співробітники повідомляють, що проблема існує місяцями.

Я протестував сценарій запиту HEAD на інших машинах в нашій мережі: немає проблем, усі з'єднання проходять на всі сайти мого тестового списку. Потім я встановив проксі-сервер на своєму персональному робочому столі, і коли я запускаю HEAD-запити з проблемного сервера, хоча це, всі з'єднання проходять через. Отже, яка б проблема не була, вона дуже специфічна для цього сервера.

Далі я спробував визначити, які веб-сайти демонструють поведінку для скидання з'єднання:

  • Жоден з наших інтранет-сайтів (192.168.xx) не перериває з'єднання.
  • Жоден ipv6 сайт, який я перевіряв, не підключає з'єднання. (Ми з двома стеками)
  • Лише невелика частина сайтів ipv4 в Інтернеті припиняє з'єднання.
  • Кожен сайт, який використовує cloudflare як CDN (що я тестував), припиняє з'єднання. (але здається, що проблема не є виключною для сайтів, що працюють із хмарними областями)

Цей кут не перетворювався на щось дійсно корисне, тому наступним чином я встановив провідну ручку, щоб подивитися, що відбувається, коли запит не вдався. Невдалі запити HEAD виглядають так: (більший скріншот тут: 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

Я читаю це (виправте мене, якщо я не прав, це насправді не моя область):

  • Ми відкриваємо tcp-з'єднання з веб-сервером
  • веб-сервер ACK
  • Запит HTTP HEAD надсилається
  • Існує пакет RST, позначений як IP-адреса веб-сервера, який вбиває з'єднання.
  • Веб-сервер надсилає ACK
  • Веб-сервер (намагається) відповісти на запит HEAD з дійсними даними HTTP (відповідь 951 байт містить правильний заголовок HTTP)
  • Веб-сервер повторно передає (кілька разів протягом декількох секунд) дійсну відповідь HTTP, але вона не може досягти успіху, оскільки з'єднання було RST

Отже, якщо веб-сервер надіслав дійсну RST, чому він продовжує намагатися заповнити запит? І якщо веб-сервер не генерував RST, що, до біса?

Те, що я спробував, не мав ефекту:

  • Відключення об’єднання в NIC
  • Зміна мережного адаптера (відомо, що NIC заміни працював)
  • Призначення статичного ip.
  • Відключення ipv6.
  • Відключення джамбо-кадрів.
  • Підключіть сервер безпосередньо до нашого модему на одну ніч, минаючи наші комутатори та маршрутизатор.
  • Відключення брандмауера Windows.
  • Скидання параметрів TCP через мережу
  • Відключення практично будь-якого іншого сервера на сервері. (Ми в основному використовуємо це як сервер файлів, але є апачі та пара БД)
  • Стукаючи головою по столу (повторно)

Я підозрюю, що щось на сервері генерує пакети RST, але все життя я не можу його знайти. Мені здається, ніби я знав: чому це просто цей сервер? А Чому лише деякі веб-сайти? це б дуже допомогло Поки мені все ще цікаво, я все більше схильний нукерувати з орбіти і починати спочатку.

Ідеї ​​/ пропозиції?

-Спасибі


У якій операційній системі працює цей кешуючий проксі-сервер? А що таке програмне забезпечення проксі-сервера?
Майкл Хемптон

1
Сервер працює під управлінням Windows Server 2012, проксі - це кальмар 3.3.3, який працює через cygwin; але це відбувається з усіма підключеннями TCP від ​​машини, а не лише з підключеннями проксі. Сценарій тесту на завиток не є проксі.
Морті

Відповіді:


38

У вашому захопленні пакету було щось незвичне: біти ECN були встановлені у вихідному SYN-пакеті.

Явне сповіщення про перевантаження - це розширення до протоколу IP, що дозволяє хостам швидше реагувати на перевантаженість мережі. Вперше він був представлений в Інтернеті 15 років тому, але були помічені серйозні проблеми, коли він був вперше розгорнутий. Найсерйозніший з них полягав у тому, що багато брандмауерів або скидатимуть пакети, або повернуть RST при отриманні пакету SYN із встановленими бітами ECN.

Як результат, більшість операційних систем відключили ECN за замовчуванням, принаймні для вихідних з'єднань. Як результат, я підозрюю, що багато сайтів (і продавців брандмауера!) Просто ніколи не фіксували брандмауери .

До виходу Windows Server 2012. Microsoft дозволила ECN за замовчуванням , починаючи з цією версією операційної системи.

На жаль, останнім часом ніхто не робив жодного істотного тестування відповідей Інтернет-сайтів на ECN, тому важко оцінити, чи існують проблеми, які спостерігаються на початку 2000-х, але я сильно підозрюю, що вони є і що ваш трафік принаймні деякий час, проходячи через таке обладнання.

Після ввімкнення ECN на моєму робочому столі, а потім запуску Wireshark було лише кілька секунд, перш ніж я знайшов приклад хоста, від якого я отримав RST до пакету з набором SYN та ECN, хоча більшість хостів, здається, працюють добре. Можливо, я сам піду сканувати Інтернет ...

Ви можете спробувати відключити ECN на своєму сервері, щоб побачити, чи проблема усувається. Це також змусить вас не використовувати DCTCP, але в невеликому офісі це малоймовірно, що ви робите це чи у вас є потреба в цьому.

netsh int tcp set global ecncapability=disabled

4
Дякую тобі! Після відключення ECN я бачу 100% успішність для підключення до найбільш проблемних сайтів! Мені доведеться більше перевірити вранці, перш ніж увімкнути наш проксі-сервер, але я продовжую відзначати це як відповідь, і як чергову грізну перемогу в постійній війні Microsoft QA для користувачів.
Морті

9
Якщо чесно, я не думаю, що виною Microsoft є те, що деякі адміністратори брандмауера - ідіоти. ECN це дуже приємно, оскільки це дуже допомагає, і було б добре, якби ми всі могли почати його використовувати ... колись.
Майкл Хемптон

О, мені цікаво, чи це пояснює тонна кількість скидів, які я отримував від Imgur та Wikia протягом століть (трапляється з двома різними локальними провайдерами, але ніколи, коли VPN'd через іншу країну, що мене бентежить)
grawity

Я підозрюю (але, очевидно, не можу довести), що деякі машини, відповідальні за це, ховаються у зоні, що не містить стандартних умов.
Майкл Хемптон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.