it-swarm.com.de

TCP-Verbindung unter Linux beenden

Ich habe eine tote Verbindung in einer Anwendung, die sich im blockierten Zustand befindet, wenn der Clientcomputer tot ist.

->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 diese IP dauerhaft blockiert.

58
Vivek Goel

Ursprünglich von: http://rtomaszewski.blogspot.sk/2012/11/how-to-forcibly-kill-established-tcp.html

Um einen Socket zu "töten", 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 Methode tcpkill lernt die SEQ-Nummer, indem sie passiv im Netzwerk schnüffelt und auf das Eintreffen gültiger Pakete dieser Verbindung wartet. Dann verwendet es die gelernte SEQ-Nummer, um RSET-Pakete an beide Seiten zu senden. Wenn die Verbindung jedoch inaktiv/hängen bleibt 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 wie tcpkill.

Alternativ besteht der Ansatz (basierend auf dem, was Sie erreichen möchten) darin, den Debugger gdb zu verwenden, um eine Verbindung zu einem Prozess herzustellen, der diesen Socket/diese Verbindung besitzt, und close() syscall in seinem Namen auszugeben - wie in diesem Abschnitt beschrieben. Antwort .

Wenn Sie nur mit blockierten Verbindungen arbeiten 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 im System ordnungsgemäß konfiguriert sind.

36
Marki555

Unter Linux Kernel> = 4.9 können Sie den Befehl ss von iproute2 mit dem Schlüssel -K Verwenden.

ss -K dst 192.168.1.214 dport = 49029

der Kernel muss mit aktivierter Option CONFIG_INET_DIAG_DESTROY kompiliert werden.

32
Pavel

tcpkill könnte es für Sie tun. In Ubuntu befindet es sich im Paket dsniff.

Etwas wie:

$ Sudo tcpkill -i wlan0 Host 192.168.1.214

(oder ein anderer tcpdump ähnlicher Ausdruck für die zu tötende Verbindung).

19
jcv

Do - as root netstat -tunp|grep 49029. In der letzten Spalte der Ausgabe sollten die PID und der Programmname des für diese Verbindung verantwortlichen Prozesses angezeigt werden.

Wenn Sie Glück haben, gibt es nur für diese Verbindung einen einzigen Prozess.

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?

6
Nils

tcpkill kann eine tote (aufgehängte) Verbindung nicht schließen. Es basiert auf libpcap und erstellt ein Paket zum Senden eines FIN -Pakets. 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.

1
alswl

Sie können versuchen, iptablesREJECT mit --reject-with tcp-reset Zu verwenden, wodurch RST an remote gesendet wird, wenn es mit einem Paket übereinstimmt.

0
Runlong Lin

Hinzufügen zu Marki555 Antwort, die eine große Liste von Optionen, wie dies zu tun ist.

Ich habe eine andere Option gefunden - die lang ist - aber auch für Leerlaufverbindungen funktioniert. Es wird ein Kernel-Debugger verwendet, um die Sequenznummer TCP) abzurufen und dann FIN-Pakete (glaube ich) mit hping3 zu senden. Von https://blog.habets.se/2017 /03/Killing-idle-TCP.html

0
Lars Nordin