So schließen Sie TCP- und UDP-Ports über die Windows-Befehlszeile

160

Weiß jemand, wie man einen TCP- oder UDP-Socket für eine einzelne Verbindung über die Windows-Befehlszeile schließt?

Als ich darüber googelte, sah ich einige Leute, die dasselbe fragten. Die Antworten sahen jedoch wie eine manuelle Seite mit netstat- oder netsh-Befehlen aus, die sich auf die Überwachung der Ports konzentrierten. Ich möchte keine Antworten darauf, wie ich sie überwachen soll (das mache ich bereits). Ich möchte sie schließen / töten.

EDIT zur Verdeutlichung: Nehmen wir an, mein Server überwacht den TCP-Port 80. Ein Client stellt eine Verbindung her und Port 56789 wird ihm zugewiesen. Dann stelle ich fest, dass diese Verbindung unerwünscht ist (z. B. wenn dieser Benutzer schlechte Dinge tut, haben wir ihn gebeten, die Verbindung zu beenden, aber die Verbindung wurde unterwegs nicht unterbrochen). Normalerweise würde ich eine Firewall hinzufügen, um die Arbeit zu erledigen, aber dies würde einige Zeit dauern und ich war in einer Notsituation. Das Beenden des Prozesses, dem die Verbindung gehört, ist hier wirklich eine schlechte Idee, da dies den Server herunterfahren würde (alle Benutzer würden die Funktionalität verlieren, wenn wir nur diese eine Verbindung selektiv und zeitlich trennen möchten).

Victor Stafusa
quelle
1
Warum? Sie können keine Ports über die Befehlszeile oder Dateien schließen. Sie müssen die Programme schließen, denen sie gehören. Oder beziehen Sie sich auf Firewall-Vorgänge? Ihre Frage bleibt unklar.
Marquis von Lorne
9
Ich kann die Abwärtsabstimmung verstehen. Aber warum die engen Stimmen? Diese Frage ist legitim.
Victor Stafusa
37
@EJP: Es ist eine echte Frage, da ich um etwas gebeten habe und eine Antwort erwartet habe (auch wenn die Antwort ein trügerisches "Nein, das kannst du nicht" war). Und es wurde beantwortet und ich akzeptierte eine Antwort. Darüber hinaus ist auch Ihr "Es kann nicht getan werden" eine gültige Antwort. Somit ist diese Frage gültig.
Victor Stafusa
1
@EJP, bitte antworte nicht so, wir haben hier genug Leute, die in der einen oder anderen Form im Grunde sagen: "Wenn du die Antwort wüsstest, würdest du diese Frage nicht stellen" - ich bin sicher, du kannst die Torheit sehen davon.
Chalky

Antworten:

65

Ja, das ist möglich. Sie müssen nicht der aktuelle Prozess sein, dem der Socket gehört, um ihn zu schließen. Denken Sie für einen Moment daran, dass der Remote-Computer, die Netzwerkkarte, das Netzwerkkabel und Ihr Betriebssystem dazu führen können, dass der Socket geschlossen wird.

Bedenken Sie auch, dass sich die Fiddler- und Desktop-VPN-Software in den Netzwerkstapel einfügen und Ihnen den gesamten Datenverkehr anzeigen oder den gesamten Datenverkehr umleiten kann.

Alles, was Sie wirklich brauchen, ist, dass Windows entweder eine API bereitstellt, die dies direkt ermöglicht, oder dass jemand ein Programm geschrieben hat, das wie ein VPN oder Fiddler funktioniert und Ihnen die Möglichkeit gibt, Sockets zu schließen, die es passieren.

Es gibt mindestens ein Programm ( CurrPorts ), das genau dies tut, und ich habe es heute verwendet, um bestimmte Sockets für einen Prozess zu schließen, der vor dem Start von CurrPorts gestartet wurde. Dazu müssen Sie es natürlich als Administrator ausführen.

Beachten Sie, dass es wahrscheinlich nicht einfach ist, ein Programm dazu zu bringen, einen Port nicht abzuhören (nun, es ist möglich, aber diese Funktion wird als Firewall bezeichnet ...), aber ich glaube nicht, dass dies hier gefragt wurde. Ich glaube, die Frage lautet: "Wie schließe ich selektiv eine aktive Verbindung (Socket) zu dem Port, den mein Programm abhört?". Der Wortlaut der Frage ist etwas falsch, da eine Portnummer für die unerwünschte eingehende Clientverbindung angegeben wird und als "Port" bezeichnet wurde, aber es ist ziemlich klar, dass es sich um einen Verweis auf diesen einen Socket und nicht auf den Überwachungsport handelt.

Huntharo
quelle
3
Ja, CP ist ein wunderbares Tool: CurrPorts.exe / close <Lokale Adresse> <Lokaler Port> <Remote-Adresse> <Remote-Port> {Prozessname} Dies wäre die Zeile: CurrPorts.exe / close * 56789 * * Server. exe
JasonXA
CurrPorts scheint nicht in der Lage zu sein, UDP-Multicast-Verbindungen zu schließen, die von einem Prozess stammen
george_h
143
  1. öffnen cmd

    • eintippen netstat -a -n -o

    • find TCP [the IP address]:[port number] .... #[target_PID]#(dito für UDP)

    • (Übrigens kill [target_PID]hat bei mir nicht funktioniert)

  2. STRG + ALT + LÖSCHEN und wählen Sie "Task-Manager starten"

    • Klicken Sie auf die Registerkarte "Prozesse"

    • Aktivieren Sie die Spalte "PID", indem Sie zu: Ansicht> Spalten auswählen> Aktivieren Sie das Kontrollkästchen für PID

    • Finden Sie die PID von Interesse und "END PROCESS"

  3. Jetzt können Sie den Server unter [der IP-Adresse]: [Portnummer] problemlos erneut ausführen

HaoQi Li
quelle
8
Was Sie sagen, ist nur, den Serverprozess abzubrechen und erneut auszuführen, was ich vermeiden wollte, da dadurch jede Verbindung zum Server unterbrochen würde, nicht nur die unerwünschte.
Victor Stafusa
7
Entschuldigung, ich habe nicht geholfen, Ihre spezielle Frage zu lösen. Ich habe nur meine Antwort gegeben, als Ihre Frage auftauchte, als ich nach dem einfachen Schließen eines Windows-Ports googelte, und dachte, dass dies auch für andere hilfreich sein könnte, die mein Problem hatten. :)
HaoQi Li
2
@HaoQiLi, du kannst nicht einfach alles und alles beenden. ZB SystemProzess, der die Windows-Netzwerkverbindungen verwaltet.
Pacerier
2
@HaoQiLi Ich denke zu schließen, wir können taskkill /pid 6168 /f6168 verwenden ist die
PID
9
lächerlich, diese Antwort hat so viele positive Stimmen, wenn die Frage eindeutig besagt, dass EINZELNE VERBINDUNG nicht der gesamte Prozess ist !!!
Mike
59

Zum Beispiel möchten Sie den Port 8080 freigeben. Befolgen Sie dann diese Befehle.

 netstat -ano
 taskkill /f /im [PID of the port 8080 got from previous command]

Getan!

Rahul
quelle
5
Danke. Nur Ihre Lösung hat mir geholfen.
Vvator
1
Richtig, es ist hilfreich, die PID tatsächlich auszudrucken, wenn Sie versuchen, die PID zu finden. (Wer sind diese Leute?).
Adrian M.
3
Dies beendet auch den Prozess des erwähnten PID und nicht nur das Schließen des Ports.
NDestiny
1
Das ist hilfreich.
Tural Asgar
Ich habe unter Windows 10 getestet und es beendet nicht nur die TCP-Verbindung, sondern den gesamten Prozess oder Thread, der sie verwendet. Wie Victor sagte, ist das nicht sein Ziel.
Sebastian
53

Wenn Sie den Port kennen, den Sie freigeben möchten, können Sie Ihre Netstat-Liste sortieren, indem Sie nach dem angegebenen Port wie folgt suchen:

netstat -ano | findstr :8080

Dann erscheint die PID an der Stelle, die Sie mit Taskkill töten können.

Geben Sie hier die Bildbeschreibung ein

taskkill/pid 11704 /F

Vielleicht möchten Sie sich auch diese Frage ansehen , die speziell für localhost bestimmt ist, aber ich denke, sie ist relevant:

Felipe Centeno
quelle
Ich habe unter Windows 10 getestet und es beendet nicht nur die TCP-Verbindung, sondern den gesamten Prozess oder Thread, der sie verwendet. Wie Victor sagte, ist das nicht sein Ziel.
Sebastian
27

Verwenden Sie TCPView ( http://technet.microsoft.com/en-us/sysinternals/bb897437.aspx ) oder CurrPorts ( http://www.nirsoft.net/utils/cports.html ).

Wenn Sie keine EXTERNE SOFTWARE verwenden möchten (diese Tools erfordern übrigens keine Installation), können Sie alternativ zuerst den Befehl netstat (vorzugsweise netstat -b) ausführen und dann die lokale Sicherheitsrichtlinie einrichten, um die IP zu blockieren Adresse des betreffenden Computers des Benutzers, das habe ich mit unerwünschten oder sogar unbekannten Verbindungen gemacht - damit können Sie alles OHNE EXTERNE SOFTWARE ausführen (alles wird mit Windows geliefert) ...

Vman
quelle
2
Dies ist die richtige Antwort und wird von Microsoft vollständig unterstützt.
Dan Bonachea
Hat auch für mich gearbeitet. Ich habe die lokale Sicherheitsrichtlinie -> IPSecurity-Richtlinien auf dem lokalen Computer verwendet. Die Benutzeroberfläche ist sehr intuitiv.
Puterdo Borato
1
Versucht, die enge Verbindung ist für IPv6 ausgegraut. Was ist die Alternative zum Schließen von IPv6, wenn überhaupt?
jjxtra
23

Probieren Sie das Sysinternals / Microsoft-Tool tcpview (GUI) und Tcpvcon (Befehlszeile) aus.

Patrick
quelle
7

Sie können Sockets nicht schließen, ohne den Prozess herunterzufahren, dem diese Sockets gehören. Sockets gehören dem Prozess, der sie geöffnet hat. So finden Sie die Prozess-ID (PID) für Unix / Linux heraus. Verwenden Sie netstat wie folgt:

netstat -a -n -p -l

Das wird so etwas wie drucken:

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State     PID/Program name   
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN     1879/sendmail: acce 
tcp        0      0 0.0.0.0:21                  0.0.0.0:*                   LISTEN     1860/xinetd         

Wobei -a alle Sockets druckt, -n die Portnummer anzeigt, -p die PID anzeigt, -l nur anzeigt, was zuhört (dies ist optional, je nachdem, was Sie suchen).

Die eigentliche Information, die Sie wollen, ist PID. Jetzt können wir diesen Prozess beenden, indem wir Folgendes tun:

kill 1879

Wenn Sie einen Dienst herunterfahren, ist es besser, Folgendes zu verwenden:

service sendmail stop

Töten tötet buchstäblich nur diesen Prozess und alle Kinder, die es besitzt. Mit dem Dienstbefehl wird das im Verzeichnis init.d registrierte Shutdown-Skript ausgeführt. Wenn Sie kill für einen Dienst verwenden, wird er möglicherweise nicht ordnungsgemäß neu gestartet, da Sie ihn nicht ordnungsgemäß heruntergefahren haben. Es kommt nur auf den Service an.

Leider unterscheidet sich Mac in dieser Hinsicht von Linux / Unix. Sie können netstat nicht verwenden. Lesen Sie dieses Tutorial, wenn Sie sich für Mac interessieren:

http://www.tech-recipes.com/rx/227/find-out-which-process-is-holding-which-socket-open/

Wenn Sie unter Windows arbeiten, verwenden Sie TaskManager, um Prozesse zu beenden, und die Benutzeroberfläche für Dienste, um Dienste herunterzufahren. Sie können netstat unter Windows genau wie Linux / Unix verwenden, um die PID zu identifizieren.

http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/netstat.mspx?mfr=true

Chubbsondubs
quelle
Er hat eine Klarstellung zu seiner Frage gemacht, bei der es sich um Remote-Client-Sockets handelt, die mit anderen Tools geschlossen werden können, wie andere bereits betont haben. Diese Antwort konzentriert sich hauptsächlich auf Server-Sockets, die dies nicht können (ohne im Betriebssystem herumzuspielen). Auf diese Weise können Sie einen Prozess, der einen Server-Socket besitzt, sauber herunterfahren. Dies ist das, was Sie tun möchten, wenn dies der Port ist. Wenn Sie jedoch viele eingehende Verbindungen zu Ihrem Server haben, ist dies eine andere Situation, und Sie können diese definitiv beenden. Es ist nicht falsch, nur nicht ganz das, was das OP verlangt hat.
Chubbsondubs
Sie sollten den Teil "Prozess beenden" entfernen, da er keine Antwort auf die Frage ist. Sie können auch den Netzwerkadapter stoppen, um den Datenverkehr zu stoppen, aber er tötet immer noch nicht nur den Socket!
Sebastian
Die Antwort ist nur für ipv6 richtig, für ipv4 können Sie SetTcpEntry
jjxtra
5

Verwenden Sie CurrPorts (kostenlos und ohne Installation): http://www.nirsoft.net/utils/cports.html

/close <Local Address> <Local Port> <Remote Address> <Remote Port> {Process Name}

Beispiele:

# Close all connections with remote port 80 and remote address 192.168.1.10: 
/close * * 192.168.1.10 80
# Close all connections with remote port 80 (for all remote addresses): 
/close * * * 80
# Close all connections to remote address 192.168.20.30: 
/close * * 192.168.20.30 *
# Close all connections with local port 80: 
/close * 80 * *
# Close all connections of Firefox with remote port 80: 
/close * * * 80 firefox.exe

Es hat auch eine schöne GUI mit Such- und Filterfunktionen.

Hinweis: Diese Antwort ist die Antwort und der Kommentar von huntharo und JasonXA, die zusammengestellt und vereinfacht wurden, um es den Lesern zu erleichtern. Beispiele stammen von der CurrPorts-Webseite.

qwertzguy
quelle
3

Sie können Sockets auf Ihrem Server nicht schließen, ohne diese Sockets zu besitzen. Daher können Sie den Socket nicht schließen, ohne dass Code in dem Prozess ausgeführt wird, dem der Server-Socket gehört.

Es gibt jedoch eine andere Option, die den Client anweist, seinen Socket zu schließen. Durch das Senden eines RST-TCP-Pakets an den Port, an dem der Client eine Verbindung herstellt, wird die Verbindung vom Client getrennt. Sie können dies mit RST-Scannen mit nmap tun.

http://nmap.org/

Chubbsondubs
quelle
Das ist eine viel bessere Antwort als Ihre vorherige Antwort! Danke dir!
Sebastian
2

wkillcx ist ein zuverlässiges Windows-Befehlszeilentool zum Beenden von TCP- Verbindungen über die nicht erwähnte Befehlszeile. Es gibt jedoch manchmal Probleme mit Servern mit einer großen Anzahl von Verbindungen. Ich benutze manchmal tcpview für interaktive Kills, aber wkillcx kann in Skripten verwendet werden.

user3310805
quelle
1

Um den Port zu schließen, können Sie den Prozess identifizieren, der diesen Port überwacht, und diesen Prozess beenden.

Darin Dimitrov
quelle
2
@ Victor, ich habe es gesehen, aber es gibt keine Möglichkeit, einen Port zwangsweise zu schließen, ohne den Prozess zu beenden. Eine andere Möglichkeit besteht darin, das Serverprogramm so zu schreiben, dass Sie eine Art Systemsteuerung haben, in der Sie Clients überwachen und verwalten können.
Darin Dimitrov
1
Wenn die Schnittstelle, auf der der Socket lauscht, heruntergefahren wird, wird der Socket geschlossen.
Rustyx
Ich glaube, er hat nach einem Beispiel gefragt.
EyoelD
@rustyx Danke! Das dachte ich mir, nachdem ich all diese "Kill the Process" -Antworten gelesen hatte ... aber seine Antwort ist nur ein Vorschlag, also ist es okay für mich (aber keine gute Antwort), die anderen Antworten sind so, als gäbe es keine Möglichkeit, dies zu tun.
Sebastian
1

Sie können ein Programm wie tcpview von sysinternal verwenden. Ich denke, es kann Ihnen sehr helfen, unerwünschte Verbindungen zu überwachen und zu beenden.

Mochan
quelle
1

CurrPorts hat bei uns nicht funktioniert und wir konnten nur über ssh auf den Server zugreifen, also auch nicht über TCPView. Wir konnten den Prozess auch nicht beenden, um andere Verbindungen nicht zu trennen. Am Ende haben wir die Verbindung zur Windows-Firewall blockiert. Ja, dies blockiert alle Verbindungen, die der Regel entsprechen, aber in unserem Fall gab es eine einzige Verbindung (die, an der wir interessiert waren):

netsh advfirewall firewall add rule name="Conn hotfix" dir=out action=block protocol=T
CP remoteip=192.168.38.13

Ersetzen Sie die IP durch die von Ihnen benötigte und fügen Sie bei Bedarf weitere Regeln hinzu.

afarah
quelle
0

Sofortige / machbare / teilweise Antwort : https://stackoverflow.com/a/20130959/2584794 Im

Gegensatz zu der vorherigen Antwort, bei der netstat -a -o -n verwendet wurde, sollte eine unglaublich lange Liste ohne den Namen der Anwendung untersucht werden, die diese verwendet Häfen

Anup
quelle
5
Dies ist fast dasselbe wie die Antwort von HaoQi Li. Dies würde den Serverprozess beenden und jede Verbindung trennen, und nicht nur die unerwünschte. Die Herausforderung besteht darin, nur den Unerwünschten fallen zu lassen und nichts weiter.
Victor Stafusa
Ich stimme Victor zu. Das ist nicht die Antwort auf die Frage. Sie können also auch den Netzwerkadapter deaktivieren ...
Sebastian
-3

Ja, es ist möglich, den TCP- oder UDP-Port zu schließen. Unter DOS gibt es einen Befehl

TASKKILL /f /pid 1234 

Ich hoffe das wird für dich funktionieren

Bijay Budhathoki
quelle
Ich habe unter Windows 10 getestet und es beendet nicht nur die TCP-Verbindung, sondern den gesamten Prozess oder Thread, der sie verwendet. Wie Victor sagte, ist das nicht sein Ziel.
Sebastian
-3

Wenn Sie unter Windows 8, Windows Server 2012 oder höher mit PowerShell v4 der oben genannten Version ausgeführt werden, können Sie das folgende Skript verwenden. Dadurch werden die dem Port zugeordneten Prozesse gefunden und beendet.

Code

#which port do you want to kill
[int]$portOfInterest = 80

#fetch the process ids related to this port
[int[]]$processId = Get-NetTCPConnection -LocalPort $portOfInterest | 
    Select-Object -ExpandProperty OwningProcess -Unique | 
    Where-Object {$_ -gt 0} 

#kill those processes
Stop-Process -Id $processId 

Dokumentation:

  • Get-NetTCPConnection - PowerShell- NetStatÄquivalent
  • Objekt auswählen - Ziehen Sie bestimmte Eigenschaften von einem Objekt zurück / entfernen Sie Duplikate
  • Where-Object - Filterwerte basierend auf einer bestimmten Bedingung
  • Stop-Process - PowerShell- TaskKillÄquivalent
JohnLBevan
quelle
Ich habe unter Windows 10 getestet und es beendet nicht nur die TCP-Verbindung, sondern den gesamten Prozess oder Thread, der sie verwendet. Wie Victor sagte, ist das nicht sein Ziel.
Sebastian