Cómo hacer que se agote el tiempo de espera de un socket TCP

20

Para las simulaciones de catástrofes de red de nuestro entorno de servidor, estamos buscando una manera de expirar intencionalmente un socket TCP. ¿Hay formas simples de enchufes existentes? Además, el pequeño programa de casos de prueba C sería una ventaja.

Ya hemos intentado desactivar las interfaces de red durante la lectura del búfer TCP y la lectura de recursos montados desconectados (samba).

Nuestro servidor de prueba es Ubuntu 12.04.4.

er453r
fuente

Respuestas:

19

Para provocar una conexión existente al tiempo de espera puede usar iptables. Simplemente habilite una DROPregla en el puerto que desea deshabilitar. Entonces, para simular un tiempo de espera para su servidor Samaba, mientras una conexión activa está activa, ejecute lo siguiente en el servidor:

sudo iptables -A INPUT -p tcp --dport 445 -j DROP

El DROPobjetivo no responderá con un RSTpaquete o ICMPerror al remitente del paquete. El cliente dejará de recibir paquetes del servidor y, finalmente, el tiempo de espera.

Dependiendo de si / cómo ha iptablesconfigurado, es posible que desee insertar la regla más arriba en el INPUTconjunto de reglas.

Arroyo
fuente
Intenté esto usando netcat (para escuchar / enviar datos) y esperé para siempre ... sin tiempo de espera: / Y puedo confirmar que los datos se descartaron. Incluso cambié /proc/sys/net/ipv4/tcp_keepalive_timea un número muy pequeño
er453r
@ er453r intente habilitar la salida detallada ncat -vpara ver qué ncatestá haciendo exactamente . Me tomó 2m7.291s en una instalación vainilla de Ubuntu 12.04 a tiempo de espera
Creek
correcto: no estaba enviando nada a través del zócalo durante esa primera prueba. Finalmente dominé los tiempos de espera y los describí en detalle a continuación :)
er453r
16

La primera respuesta es correcta, pero he descubierto cómo funcionan estos tiempos de espera, para que pueda observarlos y probarlos (¡no olvide bloquear el puerto!).

Hay 4 parámetros de kernel más interesantes que tratan con los tiempos de espera de TCP:

/proc/sys/net/ipv4/tcp_keepalive_time
/proc/sys/net/ipv4/tcp_keepalive_intvl
/proc/sys/net/ipv4/tcp_keepalive_probes
/proc/sys/net/ipv4/tcp_retries2

Ahora hay 2 escenarios:

  1. El socket se abre e intenta transmitir; luego (si no hay respuesta del otro lado), el sistema vuelve a intentarlo tcp_retries2. Con el valor predeterminado de retiros, se tarda más de 2 minutos y el socket agota el tiempo de espera.

  2. El zócalo está abierto e inactivo, entonces los límites de actividad son interesantes. Con un sistema de socket inactivo esperará tcp_keepalive_timesegundos, y luego intente tcp_keepalive_probesenviar un TCP KEEPALIVE en intervalos de tcp_keepalive_intvlsegundos. Y solo después de eso, todo falla, el tiempo de espera se agota.

er453r
fuente
1
también, puede monitorear estos tiempos de espera usandonetstat -o
er453r