it-swarm-pt.tech

Como me livrar de soquetes no estado FIN_WAIT1?

Eu tenho uma porta que está bloqueada por um processo que eu precisava matar. (um pequeno daemon de telnet que travou). O processo foi interrompido com sucesso, mas a porta ainda está no estado 'FIN_WAIT1'. Não sai disso, o tempo limite parece estar definido para 'uma década'.

A única maneira que encontrei para liberar a porta é reiniciar a máquina inteira, o que é obviamente algo que eu não quero fazer.

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

Alguém sabe como posso desbloquear essa porta sem 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

Você deve poder definir o tempo limite com /proc/sys/net/ipv4/tcp_fin_timeout.

Realmente não parece haver nenhuma maneira de limpar o soquete manualmente.

7
innaM

Parece que a configuração tcp_Orphan_retries controla quantas tentativas serão feitas antes que uma porta sem servidor seja liberada. Era 0 aqui, depois de defini-lo como 1, as portas se foram.

HTH

6
user64877

/proc/sys/net/ipv4/tcp_fin_timeout é o tempo limite do estado FIN-WAIT-2, não FIN-WAIT-1. Você deve seguir a rota tcpkill ou pode tentar jogar com os tempos de vida ativa em /proc/sys/net/ipv4/tcp_keepalive_* para forçar uma morte pelo SO.

5
Fabricio González

A execução destas etapas no ID raiz e foi liberada para mim:

Capture a configuração do kernel para alterar em uma variável

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

Defina temporariamente o máximo de órfãos como 0

$ sysctl -w net.ipv4.tcp_max_orphans=0

Verifique se a porta problemática não está mais em uso

$ netstat -np|grep 9716

Aguarde um pouco e repita a etapa acima, se necessário, até que o comando acima não retorne linhas

Redefina o parâmetro do kernel tcp_max_orphans de volta ao valor original da variável acima

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

FIN_WAIT1

O aplicativo na máquina local fechou a conexão. A indicação disso foi enviada para a máquina remota.

Seu aplicativo fechou o lado da conexão, o soquete está aguardando o lado remoto confirmar esse fechamento. Se você tiver um problema com muitos desses soquetes em FIN_WAIT1, siga os conselhos de Manni acima.

1
Dave Cheney

No kernel do linux> = 4.9, você pode usar o comando ss do iproute2 com a tecla -K

ss -K dst 192.168.1.214 dport = 49029 o kernel precisa ser compilado com a opção CONFIG_INET_DIAG_DESTROY ativada.

via https://unix.stackexchange.com/a/511691/43898

0
eri