Versión corta: una máquina Windows Server 2012 en mi red se está volviendo TCP RST persistentes pero intermitentes cuando se conecta a ciertos sitios web. No sé de dónde vienen. Consulte el registro de Wirehark para ver mis análisis y preguntas.
Versión larga:
Ejecutamos un proxy web de almacenamiento en caché en uno de nuestros servidores para dar servicio a nuestra pequeña oficina. Un compañero de trabajo informó haber recibido muchos errores de 'Restablecimiento de conexión' o 'No se puede mostrar la página' al conectarse a ciertos sitios, pero esa actualización generalmente lo soluciona.
Verifiqué el comportamiento del navegador, y luego más directamente probando un navegador no proxy en el servidor. Pero los pings y traceroutes a sitios problemáticos no muestran ningún problema, los problemas parecían estar limitados a las conexiones tcp.
Luego hice un script para probar los sitios afectados enviándoles solicitudes HTTP HEAD directamente a través de cURL y comprobando con qué frecuencia tienen éxito. Una prueba típica se ve así: (esto no tiene proxy, se ejecuta directamente en el servidor defectuoso)
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%)
A largo plazo, solo alrededor del 60% de las solicitudes tienen éxito, el resto no devuelve nada, con un código de error curl de: "error cURL (56): error al recibir datos del igual" El mal comportamiento es consistente para los sitios web I prueba (ningún sitio ha "mejorado") y es bastante persistente, he estado solucionando problemas durante una semana y los compañeros de trabajo informan que el problema ha estado allí durante meses aparentemente.
Probé el script de solicitud HEAD en otras máquinas de nuestra red: no hay problemas, todas las conexiones pasan a todos los sitios en mi lista de prueba. Luego configuré un proxy en mi escritorio personal, y cuando ejecuto las solicitudes HEAD del servidor problemático, todas las conexiones pasan. Cualquiera sea el problema, es muy específico para este servidor.
Luego intenté aislar qué sitios web exhiben el comportamiento de restablecimiento de conexión:
- Ninguno de nuestros sitios de intranet (192.168.xx) interrumpe las conexiones.
- Ningún sitio ipv6 que he probado deja caer las conexiones. (Somos de doble pila)
- Solo una pequeña minoría de sitios de internet ipv4 desconecta conexiones
- Cada sitio que usa cloudflare como CDN (que he probado) deja caer las conexiones. (pero el problema no parece ser exclusivo de los sitios de Cloudflare)
Este ángulo no se estaba convirtiendo en algo realmente útil, por lo que luego instalé wireshark para ver qué sucedía cuando fallaba una solicitud. Las solicitudes HEAD fallidas se ven así: (captura de pantalla más grande aquí: 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
La forma en que estoy leyendo esto (corrígeme si me equivoco, esta no es realmente mi área) es que:
- Abrimos una conexión TCP al servidor web
- servidor web ACK's
- Se envía la solicitud HTTP HEAD
- Hay un paquete RST, marcado como desde la IP del servidor web, que mata la conexión.
- El servidor web envía ACK
- El servidor web (intenta) responder a la solicitud HEAD con datos HTTP válidos (la respuesta de 951 bytes contiene el encabezado HTTP correcto)
- El servidor web retransmite (varias veces durante varios segundos) la respuesta HTTP válida, pero no puede tener éxito ya que la conexión ha sido RST
Entonces, si el servidor web ha enviado un RST válido, ¿por qué sigue intentando completar la solicitud? Y si el servidor web no generó el RST, ¿qué diablos hizo?
Cosas que he probado que no han tenido efecto:
- Deshabilitar el equipo de NIC
- Cambio del adaptador de red (se sabía que la NIC de reemplazo funcionaba)
- Asignación de una ip estática.
- Deshabilitar ipv6.
- Deshabilitar marcos jumbo.
- Conectando el servidor directamente a nuestro módem una noche, evitando nuestros conmutadores y enrutadores.
- Desactivar el firewall de Windows.
- Restablecer la configuración de TCP a través de netsh
- Desactivar prácticamente cualquier otro servicio en el servidor. (Principalmente lo usamos como servidor de archivos, pero hay apache y un par de bases de datos)
- Golpeando la cabeza en el escritorio (repetidamente)
Sospecho que algo en el servidor está generando los paquetes RST, pero por mi vida no puedo encontrarlo. Siento que si lo supiera: ¿por qué es solo este servidor? ¿O por qué solo algunos sitios web? Ayudaría mucho. Aunque todavía tengo curiosidad, estoy cada vez más inclinado a atacar desde la órbita y comenzar de nuevo.
Ideas / Sugerencias?
-Gracias