J'ai une connexion morte dans une application qui est à l'état suspendu si la machine cliente est morte.
->192.168.1.214:49029 (ESTABLISHED)
Existe-t-il un moyen de mettre fin à ces options à partir de la ligne de commande linux sans redémarrer le serveur?
Après la recherche, j’ai trouvé la solution appelée tcpkill. Mais cela ne fonctionnera pas pour moi. Comme il bloque en permanence cette ip.
ss
commande est beaucoup plus simple et plus générale que les autres.Réponses:
Originaire de: http://rtomaszewski.blogspot.sk/2012/11/how-toforcibly-kill-established-tcp.html
Pour "tuer" une socket, vous devez envoyer un paquet de réinitialisation TCP. Pour l'envoyer (et être accepté par l'autre partie), vous devez connaître le numéro de séquence TCP actuel.
1) La
tcpkill
méthode déjà mentionnée apprend le numéro SEQ en reniflant de manière passive sur le réseau et en attendant que des paquets valides de cette connexion arrivent. Ensuite, il utilise le numéro de SEQ appris pour envoyer des paquets RSET aux deux côtés. Cependant, si la connexion est inactive / suspendue et qu’aucun flux de données n’est transmis, il ne fera rien et attendra pour toujours.2) Une autre méthode utilise un script perl appelé
killcx
( lien vers Sourceforge ). Ceci envoie activement des paquets SYN falsifiés et apprend le numéro SEQ de la réponse. Il envoie ensuite les paquets RSET de la même manière quetcpkill
.L’approche alternative (basée sur ce que vous voulez réaliser) consiste à utiliser le
gdb
débogueur pour s’attacher à un processus possédant ce socket / connexion et émettre unclose()
appel système en son nom - comme détaillé dans cette réponse .Si vous souhaitez traiter uniquement les connexions suspendues (l'autre côté est mort), il existe différents délais (TCP keepalive par exemple), qui doivent automatiquement fermer ces connexions si elles sont configurées correctement sur le système.
la source
tcpkill
pourrait le faire pour vous. Dans Ubuntu, c'est dans ledsniff
package.Quelque chose comme:
(ou une autre
tcpdump
expression similaire pour quelle connexion tuer).la source
Sur le noyau Linux> = 4.9, vous pouvez utiliser la
ss
commande de iproute2 avec la clé-K
le noyau doit être compilé avec l'
CONFIG_INET_DIAG_DESTROY
option activée.la source
tcpkill
cela ne fonctionne pas). Cependant, je vous avouerai que je n’ai pas inspecté le site,killcx
mais j’ai l’ impression qu’un grand nombre de logiciels de sécurité l’empêcheraient de fonctionner à moins que vous ne modifiiez vos iptables afin de permettre l’acheminement de ces paquets spoofés.sudo ss -K ....
Ubuntu Bionic 18.04 LTS. J'ai eu untmux
processus qui était bloqué à une petite taille d'écran en raison d'une connexion distante, mais morte, mais pas dépassée. Tout est réglé!Faites - en tant que root
netstat -tunp|grep 49029
. La dernière colonne de la sortie devrait vous montrer le PID et le nom du programme responsable du processus responsable de cette connexion.Si vous êtes chanceux, il existe un seul processus pour cette connexion.
Si vous êtes malchanceux, cela devient plus compliqué (le PID est responsable de plus d'une connexion). Quel genre de service est-ce?
Pourquoi voulez-vous mettre fin à cette session?
la source
tcpkill
ne peut pas fermer une connexion morte (pendue). Il est basélibpcap
, il construit un paquet à envoyer unFIN
paquet. Si la connexion est déjà morte, il ne peut pas obtenir le bon numéro de séquence.Le seul moyen est de fermer le processus, donc rend partout n'est pas SPOF.
la source