Ich habe in einer Anwendung eine unterbrochene Verbindung, die sich im Status "Hanged" befindet, wenn der Client-Computer nicht mehr funktioniert.
->192.168.1.214:49029 (ESTABLISHED)
Gibt es eine Möglichkeit, diese Option über die Linux-Befehlszeile zu beenden, ohne den Server neu zu starten?
Nach der Suche fand ich eine Lösung namens tcpkill. Aber es wird bei mir nicht funktionieren. Da es dauerhaft diese IP blockiert.
ss
Befehls ist viel einfacher und allgemeiner als die anderen.Antworten:
Ursprünglich von: http://rtomaszewski.blogspot.sk/2012/11/how-to-forcibly-kill-established-tcp.html
Um einen Socket zu "beenden", müssen Sie ein TCP-Reset-Paket senden. Um es zu senden (und von der anderen Seite akzeptiert zu werden), müssen Sie die tatsächliche TCP-Sequenznummer kennen.
1) Die bereits erwähnte
tcpkill
Methode lernt die SEQ-Nummer, indem sie passiv das Netzwerk abfragt und auf das Eintreffen gültiger Pakete dieser Verbindung wartet. Anschließend wird die gelernte SEQ-Nummer verwendet, um RSET-Pakete an beide Seiten zu senden. Wenn die Verbindung jedoch inaktiv ist / hängt und keine Daten fließen, wird sie nichts tun und für immer warten.2) Eine andere Methode verwendet das Perl-Skript
killcx
( Link zu Sourceforge ). Dies sendet aktiv gefälschte SYN-Pakete und lernt die SEQ-Nummer aus der Antwort. Es sendet dann RSET-Pakete auf die gleiche Weise wietcpkill
.Alternativ können Sie (basierend auf dem, was Sie erreichen möchten) den
gdb
Debugger verwenden, um eine Verbindung zu einem Prozess herzustellen, der über diesen Socket / diese Verbindung verfügt, undclose()
in seinem Namen den Befehl syscall ausgeben - wie in dieser Antwort beschrieben .Wenn Sie sich nur mit gehängten Verbindungen befassen möchten (die andere Seite ist tot), gibt es verschiedene Zeitüberschreitungen (z. B. TCP-Keepalive), die solche Verbindungen automatisch schließen sollten, wenn sie auf dem System ordnungsgemäß konfiguriert sind.
quelle
tcpkill
könnte es für dich tun. In Ubuntu ist es imdsniff
Paket.So etwas wie:
(oder ein
tcpdump
ähnlicher Ausdruck für die zu tötende Verbindung).quelle
Auf einem Linux-Kernel> = 4.9 können Sie den
ss
Befehl von iproute2 mit key verwenden-K
Der Kernel muss mit
CONFIG_INET_DIAG_DESTROY
aktivierter Option kompiliert werden .quelle
tcpkill
nicht funktionieren könnten). Ich gebe jedoch zu, dass ich nicht überprüft habe,killcx
aber es scheint, als würde eine Menge Sicherheitssoftware verhindern, dass dies funktioniert, es sei denn, Sie ändern Ihre iptables, um diese gefälschten Pakete durchzulassen.sudo ss -K ....
Ubuntu Bionic 18.04 LTS. Ich hatte einentmux
Prozess, der wegen einer entfernten, aber toten, aber nicht zeitgesteuerten Verbindung auf einem kleinen Bildschirm hängen blieb. Alles repariert!Do - als root
netstat -tunp|grep 49029
. Die letzte Spalte der Ausgabe sollte die PID und den Programmnamen des Prozesses anzeigen, der für diese Verbindung verantwortlich ist.Wenn Sie Glück haben, gibt es nur einen einzigen Prozess für diese Verbindung.
Wenn Sie Pech haben, wird es komplizierter (die PID ist für mehr als nur diese eine Verbindung verantwortlich). Was für ein Service ist das?
Warum möchten Sie diese Sitzung beenden?
quelle
tcpkill
kann eine tote (gehängte) Verbindung nicht schließen. Es basiert darauflibpcap
, dass es ein Paket zu einem gesendetenFIN
Paket zusammensetzt. Wenn die Verbindung bereits unterbrochen ist, kann sie nicht die richtige Sequenznummer erhalten.Der einzige Weg ist, den Prozess zu schließen, also macht überall NICHT SPOF.
quelle