Comment fermer les ports TCP et UDP via la ligne de commande Windows

160

Quelqu'un sait-il comment fermer un socket TCP ou UDP pour une seule connexion via la ligne de commande Windows?

En cherchant sur Google à ce sujet, j'ai vu des gens demander la même chose. Mais les réponses ressemblaient à une page de manuel de commandes netstat ou netsh se concentrant sur la façon de surveiller les ports. Je ne veux pas de réponses sur la façon de les surveiller (je le fais déjà). Je veux les fermer / les tuer.

EDIT, pour clarification: disons que mon serveur écoute le port TCP 80. Un client établit une connexion et le port 56789 lui est alloué. Ensuite, je découvre que cette connexion est indésirable (par exemple, cet utilisateur fait de mauvaises choses, nous leur avons demandé de s'arrêter mais la connexion n'a pas été interrompue quelque part en cours de route). Normalement, j'ajouterais un pare-feu pour faire le travail, mais cela prendrait un certain temps et j'étais dans une situation d'urgence. Tuer le processus propriétaire de la connexion est vraiment une mauvaise idée ici car cela entraînerait la suppression du serveur (tous les utilisateurs perdraient des fonctionnalités lorsque nous souhaitons simplement supprimer cette connexion de manière sélective et temporelle).

Victor Stafusa
la source
1
Pourquoi? Vous ne pouvez pas fermer les ports depuis la ligne de commande, ni les fichiers. Vous devez fermer les programmes qui les possèdent. Ou faites-vous référence aux opérations de pare-feu? Votre question reste floue.
Marquis of Lorne
9
Je peux comprendre le vote défavorable. Mais pourquoi les votes serrés? Cette question est légitime.
Victor Stafusa

Réponses:

65

Oui, c'est possible. Vous n'avez pas besoin d'être le processus actuel propriétaire du socket pour le fermer. Considérez un instant que la machine distante, la carte réseau, le câble réseau et votre système d'exploitation peuvent tous provoquer la fermeture de la prise.

Considérez également que les logiciels Fiddler et Desktop VPN peuvent s'insérer dans la pile réseau et vous montrer tout votre trafic ou rediriger tout votre trafic.

Donc, tout ce dont vous avez vraiment besoin est soit que Windows fournisse une API qui permet cela directement, soit que quelqu'un ait écrit un programme qui fonctionne un peu comme un VPN ou un Fiddler et vous donne un moyen de fermer les sockets qui le traversent.

Il existe au moins un programme ( CurrPorts ) qui fait exactement cela et je l'ai utilisé aujourd'hui dans le but de fermer des sockets spécifiques sur un processus qui a été démarré avant le démarrage de CurrPorts. Pour ce faire, vous devez bien sûr l'exécuter en tant qu'administrateur.

Notez qu'il n'est probablement pas facilement possible de faire en sorte qu'un programme n'écoute pas sur un port (enfin, c'est possible, mais cette capacité est appelée pare-feu ...), mais je ne pense pas que ce soit demandé ici. Je crois que la question est «comment fermer sélectivement une connexion active (socket) au port sur lequel mon programme écoute?». Le libellé de la question est un peu erroné car un numéro de port pour la connexion client entrante indésirable est donné et il a été appelé "port" mais il est assez clair qu'il s'agissait d'une référence à ce socket et non au port d'écoute.

huntharo
la source
3
Oui, CP est un outil formidable: CurrPorts.exe / close <Local Address> <Local Port> <Remote Address> <Remote Port> {Process Name} Ce serait la ligne: CurrPorts.exe / close * 56789 * * server. exe
JasonXA
CurrPorts ne semble pas être en mesure de fermer les connexions multicast UDP provenant d'un processus
george_h
143
  1. ouvert cmd

    • tapez netstat -a -n -o

    • find TCP [the IP address]:[port number] .... #[target_PID]#(idem pour UDP)

    • (Btw, kill [target_PID]n'a pas fonctionné pour moi)

  2. CTRL + ALT + SUPPR et choisissez "démarrer le gestionnaire de tâches"

    • Cliquez sur l'onglet "Processus"

    • Activez la colonne «PID» en allant dans: Affichage> Sélectionner les colonnes> Cochez la case PID

    • Trouvez le PID qui vous intéresse et "END PROCESS"

  3. Vous pouvez maintenant réexécuter le serveur sur [l'adresse IP]: [numéro de port] sans problème

HaoQi Li
la source
8
Ce que vous dites, c'est juste de tuer le processus serveur et de le relancer, ce que je voulais éviter, car cela interromprait chaque connexion au serveur, pas seulement celle indésirable.
Victor Stafusa
7
Désolé, je n'ai pas aidé à résoudre votre question spécifique. J'étais juste en train de fournir ma réponse lorsque votre question est apparue lorsque je cherchais sur Google comment fermer simplement un port Windows, et j'ai pensé que cela pourrait également être utile à d'autres personnes qui avaient mon problème. :)
HaoQi Li
2
@HaoQiLi, vous ne pouvez pas simplement mettre fin à tout et n'importe quoi. Par exemple, Systemprocessus qui gère les connexions réseau Windows.
Pacerier
2
@HaoQiLi je pense que pour fermer nous pouvons utiliser taskkill /pid 6168 /f6168 est le pid
Madhawa Priyashantha
9
ridicule cette réponse a tellement de votes positifs quand la question indique clairement la CONNEXION UNIQUE et non le processus entier !!!
Mike
59

Par exemple, vous souhaitez libérer le port 8080 Ensuite, suivez ces commandes.

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

Terminé!

Rahul
la source
5
Merci. Seule votre solution m'a aidé.
vvator
1
À droite, cela aide à imprimer le PID lorsque vous essayez de localiser le PID. (Qui sont ces gens?).
Adrian M.
3
cela tue également le processus de pid mentionné et pas seulement la fermeture du port.
NDestiny
1
Ceci est utile.
Tural Asgar
J'ai testé sur Windows 10 et cela ne tue pas la connexion TCP seule mais tout le processus ou le thread qui l'utilise. Comme Victor l'a déclaré, ce n'est pas son objectif.
Sebastian
54

Si vous connaissez le port que vous souhaitez libérer, vous pouvez trier votre liste netstat en recherchant le port spécifique comme ceci:

netstat -ano | findstr :8080

Ensuite, le pid apparaîtra à la droite que vous pouvez tuer avec taskkill.

entrez la description de l'image ici

taskkill/pid 11704 /F

Aussi, vous voudrez peut-être regarder cette question qui est spécifiquement pour localhost, mais je pense qu'elle est pertinente:

Felipe Centeno
la source
J'ai testé sur Windows 10 et cela ne tue pas la connexion TCP seule mais tout le processus ou le thread qui l'utilise. Comme Victor l'a déclaré, ce n'est pas son objectif.
Sebastian
27

Utilisez TCPView: http://technet.microsoft.com/en-us/sysinternals/bb897437.aspx
ou CurrPorts: https://www.nirsoft.net/utils/cports.html

Sinon, si vous ne voulez pas utiliser de LOGICIEL EXTERNE (ces outils ne nécessitent pas d'installation d'ailleurs), vous pouvez simplement exécuter d'abord la commande netstat (de préférence netstat -b), puis configurer la politique de sécurité locale pour bloquer l'IP adresse de la machine de l'utilisateur en question, c'est ce que j'ai fait avec des connexions indésirables ou même inconnues - cela vous permet de tout faire SANS AUCUN LOGICIEL EXTERNE (tout est livré avec Windows) ...

Vman
la source
2
C'est la bonne réponse et entièrement prise en charge par Microsoft.
Dan Bonachea
A travaillé pour moi aussi. J'ai utilisé la politique de sécurité locale -> Politiques de sécurité IPS sur l'ordinateur local. L'interface utilisateur est assez intuitive.
Puterdo Borato
1
J'ai essayé cela, la connexion étroite est grisée pour ipv6, quelle est l'alternative pour fermer ipv6 le cas échéant?
jjxtra
7

Vous ne pouvez pas fermer les sockets sans arrêter le processus qui possède ces sockets. Les sockets appartiennent au processus qui les a ouverts. Donc, pour connaître l'ID de processus (PID) pour Unix / Linux. Utilisez netstat comme ceci:

netstat -a -n -p -l

Cela imprimera quelque chose comme:

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         

Où -a affiche toutes les sockets, -n montre le numéro de port, -p montre le PID, -l montre seulement ce qui écoute (ceci est facultatif selon ce que vous recherchez).

La vraie information que vous voulez est le PID. Maintenant, nous pouvons arrêter ce processus en faisant:

kill 1879

Si vous arrêtez un service, il est préférable d'utiliser:

service sendmail stop

Kill tue littéralement ce processus et tous les enfants qu'il possède. L'utilisation de la commande de service exécute le script d'arrêt enregistré dans le répertoire init.d. Si vous utilisez kill sur un service, il se peut qu'il ne démarre pas correctement car vous ne l'avez pas arrêté correctement. Cela dépend simplement du service.

Malheureusement, Mac est différent de Linux / Unix à cet égard. Vous ne pouvez pas utiliser netstat. Lisez ce tutoriel si vous êtes intéressé par Mac:

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

Et si vous êtes sous Windows, utilisez TaskManager pour tuer les processus et l'interface utilisateur des services pour arrêter les services. Vous pouvez utiliser netstat sous Windows comme Linux / Unix pour identifier le PID.

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

chubbsondubs
la source
Il a clarifié sa question qui concerne les sockets client distants qui peuvent être fermés avec d'autres outils, comme d'autres l'ont souligné. Cette réponse se concentre principalement sur les sockets serveur qui ne le peuvent pas (sans bricoler à l'intérieur du système d'exploitation). Voici comment arrêter proprement un processus qui possède un socket serveur, ce que vous voulez faire si c'est le port. Mais, si vous avez beaucoup de connexions entrantes à votre serveur, la situation est différente et vous pouvez certainement les tuer. Ce n'est pas mal ce que le PO demandait.
chubbsondubs
Vous devez supprimer la partie "tuer le processus", car ce n'est pas une réponse à la question. Vous pouvez également arrêter l'adaptateur réseau pour arrêter le trafic, mais il ne tue toujours pas uniquement le socket!
Sebastian
La réponse est correcte uniquement pour ipv6, pour ipv4, vous pouvez appeler SetTcpEntry
jjxtra
5

Utilisez CurrPorts (c'est gratuit et sans installation): http://www.nirsoft.net/utils/cports.html

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

Exemples:

# 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

Il a également une belle interface graphique avec des fonctionnalités de recherche et de filtrage.

Remarque: Cette réponse est la réponse et le commentaire de huntharo et JasonXA réunis et simplifiés pour faciliter la tâche des lecteurs. Les exemples proviennent de la page Web de CurrPorts.

qwertzguy
la source
3

Vous ne pouvez pas fermer les sockets sur votre serveur sans posséder ces sockets, donc vous ne pouvez pas réellement fermer le socket sans que le code s'exécute dans le processus qui possède le socket du serveur.

Cependant, il existe une autre option qui indique au client de fermer son socket. L'envoi d'un paquet TCP RST au port sur lequel le client se connecte entraînera le client à abandonner sa connexion. Vous pouvez le faire avec l'analyse RST à l'aide de nmap.

http://nmap.org/

chubbsondubs
la source
C'est une bien meilleure réponse que votre réponse précédente! Je vous remercie!
Sebastian
2

wkillcx est un outil de ligne de commande Windows fiable pour tuer les connexions TCP à partir de la ligne de commande qui n'a pas été mentionnée. Cependant, il a parfois des problèmes avec les serveurs avec un grand nombre de connexions. J'utilise parfois tcpview pour les kills interactifs mais wkillcx peut être utilisé dans les scripts.

user3310805
la source
1

Afin de fermer le port, vous pouvez identifier le processus qui écoute sur ce port et tuer ce processus.

Darin Dimitrov
la source
2
@Victor, je l'ai vu mais il n'y a aucun moyen de fermer de force un port sans interrompre le processus. Une autre possibilité est d'écrire le programme serveur de telle manière que vous ayez une sorte de panneau de contrôle lorsque vous pouvez surveiller et administrer les clients.
Darin Dimitrov le
1
De plus, si l'interface sur laquelle le socket écoute est arrêtée, le socket se fermera.
rustyx
Je crois qu'il demandait un exemple.
EyoelD
1

vous pouvez utiliser un programme comme tcpview de sysinternal. Je suppose que cela peut vous aider beaucoup à la fois à surveiller et à supprimer les connexions indésirables.

Mochan
la source
1

CurrPorts ne fonctionnait pas pour nous et nous ne pouvions accéder au serveur que via ssh, donc pas de TCPView non plus. Nous ne pouvions pas non plus tuer le processus, ni abandonner d'autres connexions. Ce que nous avons fini par faire et qui n'a pas encore été suggéré, c'est de bloquer la connexion sur le pare-feu de Windows. Oui, cela bloquera toutes les connexions qui correspondent à la règle, mais dans notre cas, il y avait une seule connexion (celle qui nous intéressait):

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

Remplacez l'adresse IP par celle dont vous avez besoin et ajoutez d'autres règles si nécessaire.

Afarah
la source
0

réponse instantanée / faisable / partielle : https://stackoverflow.com/a/20130959/2584794

contrairement à la réponse précédente où netstat -a -o -n était utilisé, une liste incroyablement longue devait être examinée sans le nom de l'application utilisant ces les ports

Anup
la source
5
C'est presque la même chose que la réponse de HaoQi Li. Cela tuerait le processus serveur abandonnant chaque connexion, et pas seulement la connexion indésirable. Le défi est de ne laisser tomber que le indésirable et rien de plus.
Victor Stafusa
Je suis d'accord avec Victor. Ce n'est pas la réponse à la question. Ainsi, vous pouvez également désactiver l'adaptateur réseau ...
Sebastian
-3

Oui, il est possible de fermer le port TCP ou UDP il y a une commande sous DOS

TASKKILL /f /pid 1234 

J'espère que cela fonctionnera pour vous

Bijay Budhathoki
la source
J'ai testé sur Windows 10 et cela ne tue pas la connexion TCP seule mais tout le processus ou le thread qui l'utilise. Comme Victor l'a déclaré, ce n'est pas son objectif.
Sebastian
-3

Si vous exécutez sur Windows 8, `Windows Server 2012 ou supérieur avec PowerShell v4 ci-dessus installé, vous pouvez utiliser le script ci-dessous. Cela trouve les processus associés au port et les termine.

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 

Documentation:

JohnLBevan
la source
J'ai testé sur Windows 10 et cela ne tue pas la connexion TCP seule mais tout le processus ou le thread qui l'utilise. Comme Victor l'a déclaré, ce n'est pas son objectif.
Sebastian