TCP Keepalive y firewall cortando sesiones inactivas

10

En el sitio de un cliente, el equipo de red agregó un firewall entre el cliente y el servidor. Esto hace que las conexiones inactivas se desconecten después de unos 40 minutos de inactividad. La gente de la red dice que el firewall no tiene ningún tiempo de espera de conexión inactiva, pero el hecho es que las conexiones inactivas se rompen.

Para evitar esto, primero configuramos el servidor (una máquina Linux) con TCP keepalives activado con tcp_keepalive_time = 300, tcp_keepalive_intvl = 300 y tcp_keepalive_probes = 30000. Esto funciona y las conexiones permanecen viables durante días o más. Sin embargo, también nos gustaría que el servidor detecte clientes muertos y elimine la conexión, por lo que cambiamos la configuración a tiempo = 300, intvl = 180, sondas = 10, pensando que si el cliente realmente estaba vivo, el servidor probaría cada 300 s (5 minutos) y el cliente respondería con un ACK y eso evitaría que el firewall lo vea como una conexión inactiva y lo elimine. Si el cliente estaba muerto, después de 10 sondas, el servidor abortaría la conexión. Para nuestra sorpresa, las conexiones inactivas pero vivas se matan después de unos 40 minutos como antes.

Wireshark que se ejecuta en el lado del cliente no muestra keepalives en absoluto entre el servidor y el cliente, incluso cuando los keepalives están habilitados en el servidor.

¿Qué podría estar pasando aquí?

Si la configuración de keepalive en el servidor es time = 300, intvl = 180, sondas = 10, esperaría que si el cliente está vivo pero inactivo, el servidor enviaría sondas de keepalive cada 300 segundos y dejaría la conexión sola, y si el el cliente está muerto, enviaría uno después de 300 segundos, luego 9 sondas más cada 180 segundos antes de cerrar la conexión. Estoy en lo cierto?

Una posibilidad es que el cortafuegos intercepte de alguna manera las sondas de mantenimiento del servidor y no las pase al cliente, y el hecho de que tenga una sonda hace pensar que la conexión está activa. ¿Es este comportamiento común para un firewall? No sabemos qué tipo de firewall está involucrado.

El servidor es un nodo de Teradata y la conexión es de una utilidad de cliente de Teradata al servidor de base de datos, puerto 1025 en el lado del servidor, pero hemos visto el mismo problema con una conexión SSH, por lo que creemos que afecta a todas las conexiones TCP.

Carlos A. Ibarra
fuente
2
Le falta una descripción de qué puertos o protocolos están utilizando los clientes para conectarse al servidor. ¿Es SSH?
ewwhite
Identificar el firewall también podría ayudar.
Skaperen
3
Verifique si keepalive está activado en el socket ejecutando netstat --timers -tn y verifique la palabra clave "keepalive" (ya que esto debe ser activado por el software en el socket). Más información aquí: tldp.org/HOWTO/TCP-Keepalive-HOWTO/index.html Compruebe también los valores del temporizador, el primer valor es segundos hasta el próximo paquete keepalive, y el tercero es el número de paquetes keepalive pendientes que esperan un respuesta (si no recuerdo
mal
2
Su gente de la red probablemente esté equivocada. Si están usando un firewall con estado, (casi seguro que lo están) se requiere una entrada para cada conexión realizada. Sin un tiempo de espera inactivo, la memoria en el firewall se perderá y el firewall finalmente se agotará y se bloqueará. Definitivamente tienen un tiempo de inactividad en algún lugar ...
James Shewey

Respuestas:

1

Un firewall con estado verifica los paquetes y también confirma si la conexión está activa. Creo que el firewall también debe tener la configuración ajustada de la misma manera que las computadoras. Por defecto, muchos cortafuegos solo mantienen las conexiones inactivas abiertas durante 60 minutos, pero esta vez puede cambiar según el proveedor.

Algunos proveedores tendrán características como Intercepción de TCP, Bypass de estado de TCP y Detección de conexión inactiva que permitirán manejar situaciones especiales como la suya.

Otra opción es configurar el firewall en sí con los mismos parámetros que tiene en los servidores para asegurarse de que todo sea coherente.

En un firewall de Cisco, tiene el siguiente comando para configurarlo.

hostname (config) # timeout feature time

timeout conn hh: mm: ss: el tiempo de inactividad después del cual se cierra una conexión, entre 0: 5: 0 y 1193: 0: 0. El valor predeterminado es 1 hora (1: 0: 0).

Tiene múltiples parámetros de acuerdo con sus necesidades.

Aconsejaría hablar con el equipo que administra el firewall y ajustar los tiempos de acuerdo con sus necesidades o verificar las funcionalidades.

Hugo
fuente