Uccidere la connessione tcp in linux


49

Ho una connessione morta in un'applicazione che si trova in stato impiccato se la macchina client è morta.

->192.168.1.214:49029 (ESTABLISHED)

C'è un modo per terminare queste opzioni dalla riga di comando di Linux senza riavviare il server?

Dopo la ricerca ho trovato una soluzione chiamata come tcpkill. Ma non funzionerà per me. Poiché blocca definitivamente quell'ip.


La risposta sull'uso del sscomando è molto più semplice e più generale delle altre.
nealmcb,

Risposte:


35

Originario di: http://rtomaszewski.blogspot.sk/2012/11/how-to-forcibly-kill-established-tcp.html

Per "uccidere" un socket, è necessario inviare un pacchetto di ripristino TCP. Per inviarlo (ed essere accettato dall'altra parte), è necessario conoscere il numero di sequenza TCP effettivo.

1) Il tcpkillmetodo già menzionato apprende il numero SEQ annusando passivamente sulla rete e aspettando l'arrivo di pacchetti validi di questa connessione. Quindi utilizza il numero SEQ appreso per inviare i pacchetti RSET su entrambi i lati. Tuttavia, se la connessione è inattiva / impiccata e nessun flusso di dati, non farà nulla e attenderà per sempre.

2) Un altro metodo usa lo script perl chiamato killcx( link a Sourceforge ). Questo attivamente invia pacchetti SYN falsificati e apprende il numero SEQ dalla risposta. Invia quindi i pacchetti RSET nello stesso modo di tcpkill.

In alternativa, l'approccio (basato su ciò che si desidera ottenere) consiste nell'utilizzare il gdbdebugger per collegarsi a un processo che possiede questo socket / connessione ed emettere close()syscall per suo conto, come dettagliato in questa risposta .

Se si desidera gestire solo le connessioni sospese (l'altro lato è morto), esistono vari timeout (ad esempio keepalive TCP), che dovrebbero chiudere automaticamente tali connessioni se configurate correttamente sul sistema.


Funzionerebbe se chiudessimo semplicemente il socket TCP dal suo descrittore di file (fd)? exec fd> & -
Alexander Gonchiy,

@AlexanderGonchiy per le connessioni live impedirebbe al processo di rispondere ai pacchetti, causando il timeout della connessione. Per le connessioni inattive non accadrebbe nulla. Non sono sicuro se il kernel invierebbe qualcosa alla rete alla chiusura di fd.
Marki555,

Ho annusato il numero progressivo. Cosa dovrei fare allora?
user3132194

18

tcpkillpotrebbe farlo per te. In Ubuntu è nel dsniffpacchetto.

Qualcosa di simile a:

$ sudo tcpkill -i wlan0 host 192.168.1.214

(o qualche altra tcpdumpespressione simile per quale connessione uccidere).


4
Funziona solo se la connessione sta trasmettendo qualcosa. Non funzionerà per le connessioni TCP impiccate / inattive (vedere la mia risposta per i dettagli)
Marki555

17

Sul kernel Linux> = 4.9 è possibile utilizzare il sscomando da iproute2 con chiave-K

ss -K dst 192.168.1.214 dport = 49029

il kernel deve essere compilato con l' CONFIG_INET_DIAG_DESTROYopzione abilitata.


1
Per Linux, questo è davvero il modo migliore e praticamente l'unico modo se hai connessioni inattive ( tcpkillnon funzionerebbe). Tuttavia, ammetto che non ho ispezionato killcxma sembra che molti software di sicurezza lo impedirebbero di funzionare a meno che non modifichi i tuoi iptables per consentire il passaggio di questi pacchetti contraffatti.
Seth Robertson,

Grazie! Ha funzionato a meraviglia con sudo ss -K ....Ubuntu Bionic 18.04 LTS. Ho avuto un tmuxprocesso bloccato a dimensioni ridotte dello schermo a causa di una connessione remota, ma morta, ma non scaduta. Tutto risolto!
nealmcb,

6

Fare - come root netstat -tunp|grep 49029. L'ultima colonna dell'output dovrebbe mostrare il PID e il nome del programma del processo responsabile di quella connessione.

Se sei fortunato c'è un solo processo per quella connessione.

Se sei sfortunato diventa più complicato (il PID è responsabile di più di una sola connessione). Che tipo di servizio è questo?

Perché vuoi chiudere quella sessione?


8
Non posso uccidere quel processo. È il server Gearman. Voglio solo chiudere la connessione.
Vivek Goel,

0

tcpkillimpossibile chiudere una connessione morta (impiccata). Si basa libpcap, costruisce un pacchetto per il FINpacchetto inviato . Se la connessione è già interrotta, non è possibile ottenere il numero di sequenza corretto.

L'unico modo è chiudere il processo, quindi rende ovunque NON SPOF.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.