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?
# 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
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.
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
/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.
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
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.
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.