2010-04-06 03:39:57 +0000 2010-04-06 03:39:57 +0000
116
116

Manuelles Schließen eines Ports von der Kommandozeile aus

Ich möchte einen offenen Port schließen, der sich im Abhörmodus zwischen meiner Client- und Server-Anwendung befindet.

Gibt es eine manuelle Kommandozeilenoption unter Linux, um einen Port zu schließen?

NOTE: Ich habe erfahren, dass “nur die Anwendung, die den angeschlossenen Socket besitzt, diesen schließen sollte, was passieren wird, wenn die Anwendung beendet wird…”

Ich verstehe nicht, warum es nur durch die Anwendung möglich ist, die ihn öffnet … Aber ich bin immer noch gespannt, ob es eine andere Möglichkeit gibt, dies zu tun.

Antworten (13)

137
137
137
2013-11-01 01:43:00 +0000

Ich hatte das gleiche Problem, der Prozess muss am Leben bleiben, aber der Sockel muss sich schließen. Das Schließen eines Sockets in einem laufenden Prozess ist nicht unmöglich, aber schwierig:

  1. den Prozess lokalisieren :

  2. den Dateideskriptor des Sockets im Prozess lokalisieren

  3. Verbinden Sie nun den Prozess:

  4. Schließen Sie nun den Socket:

20
20
20
2012-02-13 08:44:54 +0000

Fuser kann auch verwendet werden

fuser -k -n *protocol portno*

Hier ist das Protokoll tcp/udp und portno ist die Nummer, die Sie schließen möchten. Z.B.

fuser -k -n tcp 37

Weitere Informationen unter fuser man page

6
6
6
2010-04-06 09:38:15 +0000

Sie könnten alternativ iptables verwenden:

iptables -I INPUT -p tcp --dport 80 -j DROP

Es erreicht im Grunde, was Sie wollen. Dadurch wird der gesamte TCP-Verkehr auf Port 80 fallengelassen.

3
3
3
2010-04-06 03:45:53 +0000
netstat -anp | grep 80

Es sollte Ihnen mitteilen, ob Sie Apache “httpd” ausführen (dies ist nur ein Beispiel, verwenden Sie den Port, den Ihre Anwendung verwendet, anstatt 80)

pkill -9 httpd

oder

killall -9 httpd
2
2
2
2015-05-27 03:46:19 +0000

Ich habe zunächst nach den Prozessen mongo und node gesucht und dann Folgendes getan:

ps -A | grep node

10418 pts/23 00:00:05 node

10551 pts/23 00:00:00 node

ps -A | grep mongo

10490 pts/23 00:00:00 mongod

Einmal identifiziert, beenden Sie die Prozesse einfach mit dem Befehl kill.

kill -9 10418
kill -9 10490

Schließlich geben Sie meteor ein, und es sollte wieder funktionieren.

2
2
2
2012-04-22 05:02:17 +0000

Sie könnten wahrscheinlich einfach herausfinden, welcher Prozess den Socket geöffnet hat, mit dem der Port verbunden ist, und diesen Prozess beenden.

Aber Sie müssten sich darüber im Klaren sein, dass Sie diese Belastung der Systemleistung verursacht hätten, wenn dieser Prozess keinen Handler hätte, der all das Zeug de-initialisiert, das er benutzt (offene Dateien, Sockets, Forks, Zeug, das zurückbleiben kann, wenn es beim Beenden nicht richtig geschlossen wird). Außerdem bleibt der Socket offen, bis der Kernel merkt, dass der Prozess beendet wurde. Das dauert normalerweise nur etwa eine Minute.

Ich nehme an, die bessere Frage wäre: Welchen Port (der zu welchem Prozess gehört) wollen Sie stoppen?

Wenn Sie versuchen, eine Hintertür oder einen Virus, den Sie gefunden haben, zu beenden, dann sollten Sie zumindest erfahren, welche Daten hin- und herlaufen, bevor Sie sie beenden. (Wireshark ist dafür gut geeignet.) (Und der Name der ausführbaren Datei des Prozesses, damit Sie ihn löschen und verhindern können, dass er beim Neustart zurückkommt) oder, wenn es sich um etwas handelt, das Sie installiert haben (wie HTTPD oder FTPD oder so), dann sollten Sie bereits Zugriff auf den Prozess selbst haben.

Normalerweise wird er ein Kontrollprogramm haben (HTTPD stop|start oder so). Oder, wenn es sich um ein System-Ding handelt, sollten Sie wahrscheinlich nicht damit herumspielen. Wie auch immer, ich dachte, da alle anderen Ihnen den “How-to”-Winkel geben, sollte ich Ihnen die Vorbehalte mitteilen.

2
2
2
2015-04-23 06:06:09 +0000

Wenn Sie möchten, dass Ihr Port früher freigegeben wird, müssen Sie den folgenden Wert einstellen:

echo 1 > /proc/sys/net/ipv4/tcp_fin_timeout

, um ihn von 60 Sekunden (Standard) auf 1 Sekunde einzustellen

1
1
1
2010-04-06 04:10:46 +0000

Sie könnten ein Skript schreiben, das die iptables modifiziert und neu startet. Ein Skript, um eine Regel hinzuzufügen, die alle Pakete auf dem Port ablegt, ein anderes Skript, um diese Regel zu entfernen.

Die anderen Antworten haben Ihnen gezeigt, wie Sie den an den Port gebundenen Prozess beenden können - dies ist vielleicht nicht das, was Sie wollen. Wenn Sie wollen, dass der Server weiter läuft, aber Verbindungen von Clients verhindern wollen, dann wollen Sie den Port blockieren, nicht den Prozess stoppen.

1
1
1
2015-07-29 02:25:58 +0000

Sie können den Befehl namens killcx verwenden, der eine Verbindung schließt, ohne dass ein Prozess abgebaut wird.

  • Syntax:
killcx [dest_ip:dest_port] {interface}

dest_ip : remote IP
dest_port : remote port
interface (optional) : network interface (eth0, lo etc).
  • Beispiel:
killcx 120.121.122.123:1234
killcx 120.121.122.123:1234 eth0
1
1
1
2015-10-15 08:45:34 +0000

Ich bin mir bewusst, dass diese Antwort streng genommen nicht die Frage selbst beantwortet, aber wenn man in sie hineinliest, könnte dies eine relevante Information sein:

Das Standardverhalten beim Binden eines Sockets an einen Port (und eine Adresse) ist, dass wenn ein Socket durch abruptes Beenden des Prozesses geschlossen wird, der Socket für eine Weile in TIME_WAIT bleibt. Das bedeutet, dass Sie sich nicht sofort wieder an diese Adresse/Port binden können. Wenn Sie das System selbst über die Standard-BSD-Socket-Schnittstelle entwickeln, können Sie dieses Verhalten (zumindest bis zu einem gewissen Grad) mit der Socket-Option SO_REUSEADDR steuern. Dadurch können Sie sich grundsätzlich erneut an dieselbe Adresse/Port binden, wenn sich der Socket im TIME_WAIT-Status befindet. Trotzdem immer noch ein Socket pro Port!

Diese Information sollte jedoch nur als Entwicklungshilfe verwendet werden, da es einen Grund für die Existenz von TIME_WAIT gibt, der bereits in den anderen Antworten erläutert wurde.

1
1
1
2013-11-01 02:08:35 +0000

Ein weiteres Problem: Irgendwann besitzt der Kernel selbst Ports. Ich weiß, dass NAT-Routing einige Ports für NAT-Nutzung offen hält. Sie koennen dafuer keinen Prozess toeten, dies ist ein Kernel, und eine Neukonfiguration und ein Neustart ist erforderlich.

0
0
0
2016-03-30 10:02:54 +0000

Wenn Sie keinen Verkehr über den Socket wollen, aber den Prozess am Leben erhalten wollen: tcpkill .

tcpkill -i eth0 host xxx.xxx.xxx.xxx and port yyyy

Startet einen Sniff-Daemon, der den gesamten Verkehr auf diesem Port abfängt und vernichtet. Sehr praktisch, um Ihre Anwendungen auf Netzwerk-Splits zu testen.

0
0
0
2019-08-07 15:17:33 +0000

Sie können einen zuhörenden Socket mit ss :

sudo ss --kill state listening src :1234

schließen, wobei 1234 Ihre Portnummer ist.

ss ist Teil des iproute2-Pakets, daher gibt es eine starke Änderung, daß es auf einem modernen Linux bereits installiert ist.

Ich habe davon durch eine Antwort auf eine verwandte Frage erfahren.