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

Fermeture manuelle d'un port en ligne de commande

Je veux fermer un port ouvert qui est en mode d'écoute entre mon application client et serveur.

Y a-t-il une option de ligne de commande manuelle sous Linux pour fermer un port ?

NOTE: _J'ai appris que “seule l'application qui possède la socket connectée doit la fermer, ce qui se produit lorsque l'application se termine”

Je ne comprends pas pourquoi cela n'est possible que par l'application qui l'ouvre … Mais je suis toujours impatient de savoir s'il existe un autre moyen de le faire.

Réponses (13)

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

J'ai eu le même problème, le processus doit rester en vie mais la prise doit se fermer. Fermer une socket dans un processus en cours n'est pas impossible mais difficile :

  1. localiser le processus :

  2. localiser le descripteur de fichier de la socket dans le processus

  3. Connectez maintenant le processus :

  4. Fermez maintenant la socket :

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

Fuser peut également être utilisé

fuser -k -n *protocol portno*

Ici, le protocole est tcp/udp et portno est le numéro que vous souhaitez fermer. Par exemple,

fuser -k -n tcp 37

Plus d'informations sur la page de manuel du fuser ](http://linux.die.net/man/1/fuser)

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

Vous pouvez aussi utiliser iptables :

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

Il permet d'obtenir ce que vous voulez. Cela fera tomber tout le trafic TCP au port 80.

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

Il devrait vous indiquer, si vous utilisez apache, “httpd” (ce n'est qu'un exemple, utilisez le port que votre application utilise au lieu de 80)

pkill -9 httpd

ou

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

J'ai d'abord cherché les processus mongo et node, puis j'ai fait ce qui suit :

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

Une fois identifiés, il suffit de tuer les processus avec la commande kill.

kill -9 10418
kill -9 10490

Enfin, tapez meteor et cela devrait fonctionner à nouveau.

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

Vous pourriez probablement juste trouver quel processus a ouvert la socket à laquelle le port est associé, et tuer ce processus.

Mais, vous devriez réaliser qu'à moins que ce processus n'ait un gestionnaire qui désinitialise tous les éléments qu'il utilisait (fichiers ouverts, sockets, forks, éléments qui peuvent persister à moins qu'ils ne soient fermés correctement à la fin), alors vous auriez créé cette entrave aux performances du système. De plus, la socket restera ouverte jusqu'à ce que le noyau se rende compte que le processus a été tué. Cela ne prend généralement qu'une minute.

Je suppose que la meilleure question serait : Quel port (appartenant à quel processus) voulez-vous arrêter ?

Si vous essayez de mettre fin à une porte dérobée ou à un virus que vous avez trouvé, alors vous devriez au moins apprendre quelles données vont et viennent avant de le terminer. (wireshark est bon pour cela) (Et le nom exécutable du processus afin que vous puissiez le supprimer et l'empêcher de revenir au redémarrage) ou, si c'est quelque chose que vous avez installé (comme HTTPD ou FTPD ou autre) alors vous devriez déjà avoir accès au processus lui-même.

En général, il aura un programme de contrôle (HTTPD stop|start ou autre). Ou, s'il s'agit d'un élément du système, vous ne devriez probablement pas y toucher. Quoi qu'il en soit, j'ai pensé que puisque tout le monde vous donne le “comment faire”, je devrais vous donner les avertissements.

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

Si vous souhaitez que votre port soit libéré plus tôt, vous devez définir la valeur suivante :

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

pour qu'il passe de 60 secondes (par défaut) à 1 seconde

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

Vous pourriez écrire un script qui modifie les iptables et les redémarre. Un script pour ajouter une règle déposant tous les paquets sur le port, un autre script pour supprimer ladite règle.

Les autres réponses vous ont montré comment tuer le processus lié au port - ce n'est peut-être pas ce que vous voulez. Si vous voulez que le serveur continue à fonctionner, mais que vous voulez empêcher les connexions des clients, alors vous voulez bloquer le port, et non pas arrêter le processus.

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

Vous pouvez utiliser la commande nommée killcx, fermant une connexion sans qu'aucun processus ne soit tué.

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

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

Je suis conscient que cette réponse ne répond pas à la question elle-même, à proprement parler, mais à la lecture de cette réponse, il pourrait y avoir des informations pertinentes :

Le comportement par défaut de la liaison d'une socket à un port (et à une adresse) est que lorsque la socket est fermée par la fin abrupte du processus, la socket restera dans TIME_WAIT pendant un certain temps. Cela signifie que vous ne pouvez pas vous reconnecter immédiatement à cette adresse/port. Si vous développez le système lui-même via l'interface socket BSD standard, vous pouvez (au moins dans une certaine mesure) contrôler ce comportement avec l'option socket SO_REUSEADDR. Cela vous permettra de vous lier à nouveau à la même adresse/port si la socket est en état TIME_WAIT. Cependant, cette information ne doit être utilisée qu'à des fins d'aide au développement, car il y a une raison à l'existence de TIME_WAIT, déjà expliquée dans les autres réponses.

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

Autre problème : il arrive que le noyau possède lui-même des ports. Je sais que le routage NAT maintient certains ports ouverts pour une utilisation NAT. Vous ne pouvez pas tuer un processus pour cela, c'est un noyau, et une reconfiguration et un redémarrage sont nécessaires.

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

Si vous ne voulez pas de trafic sur la prise mais que vous voulez maintenir le processus en cours : tcpkill .

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

Lancera un démon renifleur qui intercepte et détruit tout le trafic sur ce port. Très pratique pour tester vos applications en cas de fractionnement du réseau.

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

Vous pouvez fermer une prise d'écoute en utilisant ss :

sudo ss --kill state listening src :1234

Où 1234 est votre numéro de port.

ss fait partie du paquet iproute2, il y a donc un changement important, il est déjà installé sur un Linux moderne.

J'ai appris cela de une réponse à une question connexe .