Matando a conexão TCP no Linux

49

Eu tenho alguma conexão inoperante em um aplicativo que está no estado suspenso se a máquina cliente estiver inoperante.

->192.168.1.214:49029 (ESTABLISHED)

Existe uma maneira de encerrar essas opções na linha de comando linux sem reiniciar o servidor?

Após a pesquisa, encontrei a solução chamada tcpkill. Mas isso não vai funcionar para mim. Como ele bloqueia permanentemente esse ip.

Vivek Goel
fonte
A resposta sobre o uso do sscomando é muito mais fácil e mais geral que as outras.
nealmcb 4/11

Respostas:

35

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 tcpkillmé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 gdbdepurador 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.

Marki555
fonte
Funcionaria se simplesmente fechasse o soquete TCP pelo seu descritor de arquivo (fd)? exec fd> & -
Alexander Gonchiy
@AlexanderGonchiy, para conexões ativas, impediria que o processo respondesse aos pacotes, causando o tempo limite da conexão. Para conexões inativas, nada aconteceria. Não tenho certeza se o kernel enviaria algo para a rede ao fechar o fd.
precisa saber é o seguinte
Eu cheirei o número da sequência. O que devo fazer então?
user3132194
18

tcpkillpode fazer isso por você. No Ubuntu está no dsniffpacote.

Algo como:

$ sudo tcpkill -i wlan0 host 192.168.1.214

(ou alguma outra tcpdumpexpressão semelhante para qual conexão matar).

jcv
fonte
4
Isso funciona apenas se a conexão estiver transmitindo alguma coisa. Não vai funcionar para conexões enforcado / ocioso TCP (ver minha resposta para mais detalhes)
Marki555
17

No kernel do linux> = 4.9, você pode usar o sscomando iproute2 com a chave-K

ss -K dst 192.168.1.214 dport = 49029

o kernel precisa ser compilado com a CONFIG_INET_DIAG_DESTROYopção habilitada.

Pavel
fonte
1
Para o Linux, essa é realmente a melhor maneira e praticamente a única maneira se você tiver conexões inativas ( tcpkillnão funcionaria). No entanto, admito que não inspecionei, killcxmas parece que muitos softwares de segurança impediriam que isso funcionasse, a menos que você modifique suas tabelas de ip para permitir a passagem desses pacotes falsificados.
Seth Robertson
Obrigado! Funcionou como um encanto sudo ss -K ....no Ubuntu Bionic 18.04 LTS. Eu tive um tmuxprocesso que estava preso em um tamanho de tela pequeno por causa de uma conexão remota, mas inoperante, mas não excedeu o tempo limite. Tudo consertado!
nealmcb 04/11
6

Faça - como raiz netstat -tunp|grep 49029. A última coluna da saída deve mostrar o PID e o nome do programa do processo responsável por essa conexão.

Se você tiver sorte, existe um processo único para essa conexão.

Se você tiver azar, fica mais complicado (o PID é responsável por mais do que apenas uma conexão). Que tipo de serviço é esse?

Por que você deseja encerrar essa sessão?

Nils
fonte
8
Eu não posso matar esse processo. É servidor gearman. Eu quero apenas fechar a conexão.
Vivek Goel
0

tcpkillnão pode fechar uma conexão morta (travada). É baseado libpcap, constrói um pacote para o FINpacote enviado . Se a conexão já estiver desativada, não será possível obter o número de sequência correto.

A única maneira é fechar o processo, de modo que em todos os lugares NÃO seja SPOF.

alswl
fonte