Originalmente: http://rtomaszewski.blogspot.sk/2012/11/how-to-forcibly-kill-established-tcp.html
Para "matar" um soquete, você deve enviar um pacote de redefinição de TCP. Para enviá-lo (e ser aceito pelo outro lado), você deve saber o número de sequência TCP real.
1) O tcpkill
método já mencionado aprende o número SEQ farejando passivamente a rede e aguardando a chegada de pacotes válidos dessa conexão. Em seguida, ele usa o número SEQ aprendido para enviar pacotes RSET para os dois lados. No entanto, se a conexão estiver ociosa / travada e nenhum fluxo de dados, ela não fará nada e aguardará para sempre.
2) Outro método usa o script perl chamado killcx
( link para Sourceforge ). Isso envia ativamente pacotes SYN falsificados e aprende o número SEQ com a resposta. Em seguida, envia pacotes RSET da mesma maneira que tcpkill
.
Alternativamente, a abordagem (com base no que você deseja obter) é usar o gdb
depurador para se conectar a um processo que possui esse soquete / conexão e emitir o close()
syscall em seu nome - conforme detalhado nesta resposta .
Se você deseja lidar apenas com conexões suspensas (o outro lado está inoperante), existem vários tempos limite (keepalive TCP, por exemplo), que devem fechar automaticamente essas conexões se configurados corretamente no sistema.
ss
comando é muito mais fácil e mais geral que as outras.