it-swarm-es.com

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

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?

20
Gert M
# 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
19
IdaWong

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

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

7
innaM

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

6
user64877

/proc/sys/net/ipv4/tcp_fin_timeout es 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 bajo /proc/sys/net/ipv4/tcp_keepalive_* para forzar una muerte por el SO.

5
Fabricio González

Ejecutando estos pasos bajo el ID de raíz y me borró:

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 de nuevo al valor original de la variable anterior

$ sysctl -w net.ipv4.tcp_max_orphans=$orig_orphans
2
Rad Mandapati

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.

1
Dave Cheney

En linux kernel> = 4.9 puede usar el comando ss 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.

vía https://unix.stackexchange.com/a/511691/43898

0
eri