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

Cerrar manualmente un puerto desde la línea de comandos

Quiero cerrar un puerto abierto que está en modo de escucha entre mi cliente y la aplicación del servidor.

¿Hay alguna opción de línea de comandos manual en Linux para cerrar un puerto?

NOTA: Me he enterado de que “sólo la aplicación que posee el zócalo conectado debe cerrarlo, lo que sucederá cuando la aplicación termine”.“

No entiendo por qué sólo es posible por la aplicación que lo abre… Pero todavía estoy ansioso por saber si hay alguna otra manera de hacerlo.

Respuestas (13)

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

Tuve el mismo problema, el proceso debe mantenerse vivo pero el enchufe debe cerrarse. Cerrar un zócalo en un proceso en marcha no es imposible, pero sí difícil:

  1. localizar el proceso :

  2. localizar el descriptor de archivo del zócalo en el proceso

  3. Ahora conecte el proceso:

    1. Ahora cierre el zócalo:
20
20
20
2012-02-13 08:44:54 +0000

También se puede usar el fusor

fuser -k -n *protocol portno*

Aquí el protocolo es tcp/udp y portno es el número que desea cerrar. Por ejemplo

fuser -k -n tcp 37

Más información en página del fusor

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

Podrías usar alternativamente iptables:

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

Básicamente logra lo que quieres. Esto hará caer todo el tráfico TCP al puerto 80.

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

Debería decirte, si estás ejecutando apache, “httpd” (esto es sólo un ejemplo, usa el puerto que tu aplicación está usando en lugar del 80)

pkill -9 httpd

o

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

Primero busqué los procesos de mongo y nodo, luego hice lo siguiente:

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

Una vez identificado, sólo mata los procesos con el comando de matar.

kill -9 10418
kill -9 10490

Por último, escribe meteor y debería funcionar de nuevo.

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

Probablemente podrías averiguar qué proceso abrió el socket al que está asociado el puerto y matar ese proceso.

Pero, tendrías que darte cuenta de que a menos que ese proceso tenga un handler que des-inicialice todas las cosas que estaba usando (archivos abiertos, sockets, forks, cosas que pueden perdurar a menos que se cierren correctamente al terminar) entonces habrías creado ese arrastre en el rendimiento del sistema. Además, el socket permanecerá abierto hasta que el kernel se dé cuenta de que el proceso ha sido eliminado. Eso normalmente sólo lleva un minuto.

Supongo que la mejor pregunta sería: ¿Qué puerto (perteneciente a qué proceso) quieres detener?

Si estás tratando de poner fin a una puerta trasera o a un virus que has encontrado, entonces deberías al menos aprender qué datos van y vienen antes de terminarlo. (wireshark es bueno para esto) (Y el nombre ejecutable del proceso para que puedas borrarlo y evitar que vuelva al reinicio) o, si es algo que instalaste (como HTTPD o FTPD o algo así) entonces ya deberías tener acceso al proceso en sí.

Por lo general tendrá un programa de control (HTTPD stop|start o algo así). O, si es una cosa del sistema, probablemente no deberías meterte con él. De todos modos, pensé que ya que todos los demás te están dando el ángulo de “cómo hacerlo”, debería hacerte las advertencias.

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

Si quiere que su puerto sea liberado antes, tiene que establecer el siguiente valor:

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

para fijarlo de 60 segundos (por defecto) a 1 segundo

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

Podrías escribir un guión que modificara las iptables y las reiniciara. Un script para añadir una regla que deje caer todos los paquetes en el puerto, otro script para eliminar dicha regla.

Las otras respuestas te han mostrado cómo matar el proceso ligado al puerto, puede que no sea lo que quieres. Si quiere que el servidor siga funcionando, pero para evitar las conexiones de los clientes, entonces quiere bloquear el puerto, no detener el proceso.

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

Puedes usar el comando llamado killcx, cerrando una conexión sin ningún proceso a matar.

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

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

Soy consciente de que esta respuesta no responde a la pregunta en sí misma, en sentido estricto, pero leyendo en ella podría ser información relevante:

El comportamiento por defecto de la unión de un socket a un puerto (y dirección) es que cuando el socket se cierra por la terminación abrupta del proceso, el socket permanecerá en TIME_WAIT por un tiempo. Esto significa que no puede volver a unirse inmediatamente a esta dirección/puerto. Si está desarrollando el sistema en sí mismo a través de la interfaz del socket BSD estándar, puede (al menos hasta cierto punto) controlar este comportamiento con la opción de socket SO_REUSEADDR. Esto básicamente le permitirá enlazar con la misma dirección/puerto de nuevo si el socket está en estado TIME_WAIT. Sin embargo, un socket por puerto!

Sin embargo, esta información sólo debe ser usada como ayuda al desarrollo, ya que hay una razón para que exista TIME_WAIT en primer lugar, ya explicada en las otras respuestas.

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

Una cuestión más: a veces el núcleo es dueño de los puertos. Sé que el enrutamiento NAT mantiene algunos puertos abiertos para el uso de NAT. No se puede matar un proceso para esto, esto es un kernel, y se requiere una reconfiguración y un reinicio.

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

Si no quieres que haya tráfico en el enchufe pero quieres mantener vivo el proceso: …comenzará un demonio olfativo que intercepta y destruye todo el tráfico en ese puerto. Muy útil para probar sus aplicaciones para las divisiones de la red.

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

Puedes cerrar un socket de escucha usando ss :

sudo ss --kill state listening src :1234

Donde 1234 es tu número de puerto.

ss es parte del paquete iproute2, por lo que hay un fuerte cambio que ya está instalado en un Linux moderno.

Me enteré de esto por una respuesta a una pregunta relacionada .