Como me livrar de soquetes no estado FIN_WAIT1?

18

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 obter essa porta desbloqueada sem reiniciar?

Gert M
fonte

Respostas:

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
fonte
2
melhoraria a resposta para primeiro tomar nota $whateveritwasantes de substituí-la.
conferiu
7

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.

innaM
fonte
6
Esta resposta não está correta. tcp_orphan_retries afeta FIN_WAIT1, tcp_fin_timeout afeta FIN_WAIT2.
suprjami
suprjami está correto, tcp_fin_timeout afeta FIN_WAIT2. O que é acionado apenas ao usar SO_LINGER.
Matt
@innaM Você pode remover esta resposta? Não é correto e acumula votos negativos. Vejo que você ainda está ativo, portanto, parece fazer mais sentido remover a resposta.
Andrew B
@ Andrew B: Parece que não é possível excluir respostas aceitas.
InnaM
6

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

user64877
fonte
11
Intimamente relacionado: 0 é o padrão, o que significa 8. serverfault.com/a/408882/152073
Andrew B
5

/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 brincar com os tempos de manutenção ao vivo /proc/sys/net/ipv4/tcp_keepalive_*para forçar uma morte pelo SO.

Ryan Ahearn
fonte
2

Executando estas etapas no ID da raiz e liberado 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
Rad Mandapati
fonte
Olá, Bem-vindo ao Serverfault. Editei sua postagem para tornar a formatação de sua resposta mais consistente com outras respostas neste site. Para sua próxima resposta, não use tantos títulos quanto você usou aqui e considere usar outras respostas como modelo para suas próprias respostas. Obrigado pela sua contribuição. Aproveite o seu passeio no serverfault.
Richard
1

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 as orientações de Manni acima.

Dave Cheney
fonte
0

No kernel do linux> = 4.9, você pode usar o sscomando 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 /unix//a/511691/43898

eri
fonte
-4

isso pode ajudar:

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
fonte
6
Pode ajudar se você explicar o que é tudo isso. Somos profissionais e, como tal, não colamos cegamente as coisas e esperamos que ajude.
Michael Hampton