¿Cómo me deshago de los sockets en el estado FIN_WAIT1?

18

Tengo un puerto que está bloqueado por un proceso que necesitaba matar. (un pequeño demonio telnet que se estrelló). El proceso se finalizó correctamente pero el puerto aún se encuentra en un estado 'FIN_WAIT1'. No sale de eso, el tiempo de espera para eso parece estar establecido en 'una década'.

La única forma en que he encontrado para liberar el puerto es reiniciar toda la máquina, que por supuesto es algo que no quiero hacer.

$ netstat -tulnap | grep FIN_WAIT1 
tcp        0  13937 10.0.0.153:4000         10.0.2.46:2572          FIN_WAIT1  -

¿Alguien sabe cómo puedo desbloquear este puerto sin reiniciar?

Gert M
fuente

Respuestas:

18
# record what tcp_max_orphans's current value
original_value=$(cat /proc/sys/net/ipv4/tcp_max_orphans)

#set the tcp_max_orphans to 0 temporarily
echo 0 > /proc/sys/net/ipv4/tcp_max_orphans

# watch /var/log/messages
# it will split out "kernel: TCP: too many of orphaned sockets"
# it won't take long for the connections to be killed

# restore the value of tcp_max_orphans whatever it was before. 
echo $original_value > /proc/sys/net/ipv4/tcp_max_orphans

# verify with 
netstat -an|grep FIN_WAIT1
IdaWong
fuente
2
mejoraría la respuesta a tomar nota $whateveritwasantes de sobrescribirlo.
revisé
7

Debería poder establecer el tiempo de espera con /proc/sys/net/ipv4/tcp_fin_timeout.

Realmente no parece haber ninguna forma de limpiar el zócalo manualmente.

innaM
fuente
66
Esta respuesta no es correcta. tcp_orphan_retries afecta a FIN_WAIT1, tcp_fin_timeout afecta a FIN_WAIT2.
suprjami
suprjami es correcto, tcp_fin_timeout afecta a FIN_WAIT2. Que solo se activa cuando se usa SO_LINGER.
Matt
@innaM ¿Puedes eliminar esta respuesta? No es correcto y acumula votos negativos. Veo que todavía está activo, por lo tanto, parece tener más sentido eliminar la respuesta.
Andrew B
@ Andrew B: Parece que no es posible eliminar las respuestas aceptadas.
innaM
6

Parece que la configuración tcp_orphan_retries controla cuántos intentos se realizarán antes de liberar un puerto sin servidor. Era 0 aquí, después de establecerlo en 1, los puertos se habían ido.

HTH

usuario64877
fuente
1
Muy relacionado: 0 es un valor predeterminado, lo que significa 8. serverfault.com/a/408882/152073
Andrew B
5

/proc/sys/net/ipv4/tcp_fin_timeoutes el tiempo de espera del estado FIN-WAIT-2, no FIN-WAIT-1. Debes seguir la ruta tcpkill o puedes intentar jugar con los tiempos de keepalive /proc/sys/net/ipv4/tcp_keepalive_*para forzar una muerte por parte del SO.

Ryan Ahearn
fuente
2

Ejecutando estos pasos bajo el ID de raíz y se borró para mí:

Capture la configuración del kernel para cambiar en una variable

$ orig_orphans=$(sysctl -a|grep tcp_max_orph|cut -f3 -d' ')

Establezca temporalmente los huérfanos máximos en 0

$ sysctl -w net.ipv4.tcp_max_orphans=0

Verifique para asegurarse de que el puerto problemático ya no esté en uso

$ netstat -np|grep 9716

Espere un poco y repita el paso anterior si es necesario hasta que el comando anterior no devuelva líneas

Restablezca el parámetro del núcleo tcp_max_orphans nuevamente al valor original de la variable anterior

$ sysctl -w net.ipv4.tcp_max_orphans=$orig_orphans
Rad Mandapati
fuente
Hola, bienvenido a Serverfault. Edité su publicación para que el formato de su respuesta sea más coherente con otras respuestas en este sitio. Para su próxima respuesta, no use tantos títulos como lo hizo aquí y considere tomar otras respuestas como plantilla para sus propias respuestas. Gracias por tu contribución sin embargo. Disfrute de su viaje en serverfault.
Richard
1

FIN_WAIT1

La aplicación en la máquina local ha cerrado la conexión. Se ha enviado una indicación de esto a la máquina remota.

Su aplicación ha cerrado su lado de la conexión, el socket ahora está esperando que el lado remoto confirme ese cierre. Si tiene un problema con muchos de esos sockets retenidos en FIN_WAIT1, entonces debe seguir los consejos de Manni anteriores.

Dave Cheney
fuente
0

En linux kernel> = 4.9 puede usar el sscomando de iproute2 con la tecla -K

ss -K dst 192.168.1.214 dport = 49029 el núcleo debe compilarse con la opción CONFIG_INET_DIAG_DESTROY habilitada.

a través de /unix//a/511691/43898

eri
fuente
-4

Esto puede ayudar:

net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_retries2 = 2
net.ipv4.tcp_orphan_retries = 1
net.ipv4.tcp_reordering = 5
net.ipv4.tcp_retrans_collapse = 0
wkf1436
fuente
66
Puede ayudar si explica todo lo que es eso. Somos profesionales y, como tales, no pegamos cosas a ciegas y esperamos que ayude.
Michael Hampton