Cómo cerrar los puertos TCP y UDP a través de la línea de comando de Windows

160

¿Alguien sabe cómo cerrar un socket TCP o UDP para una sola conexión a través de la línea de comandos de Windows?

Buscando en Google sobre esto, vi a algunas personas preguntando lo mismo. Pero las respuestas parecían una página manual de comandos netstat o netsh centrados en cómo monitorear los puertos. No quiero respuestas sobre cómo monitorearlos (ya lo hago). Quiero cerrarlos / matarlos.

EDITAR, para aclarar: supongamos que mi servidor escucha el puerto TCP 80. Un cliente realiza una conexión y se le asigna el puerto 56789. Luego, descubro que esta conexión no es deseada (por ejemplo, este usuario está haciendo cosas malas, les pedimos que se detuvieran, pero la conexión no se cortó en algún momento). Normalmente, agregaría un firewall para hacer el trabajo, pero esto llevaría algún tiempo y estaba en una situación de emergencia. Eliminar el proceso que posee la conexión es realmente una mala idea aquí porque esto eliminaría el servidor (todos los usuarios perderían la funcionalidad cuando solo deseamos desconectar selectivamente y temporalmente esta conexión).

Victor Stafusa
fuente
1
¿Por qué? No puede cerrar puertos desde la línea de comandos, ni tampoco archivos. Tienes que cerrar los programas que los poseen. ¿O te refieres a las operaciones de firewall? Tu pregunta sigue sin estar clara.
Marqués de Lorne
9
Puedo entender el voto negativo. ¿Pero por qué los votos cerrados? Esta pregunta es legítima.
Victor Stafusa

Respuestas:

65

Si, esto es posible. No tiene que ser el proceso actual que posee el socket para cerrarlo. Considere por un momento que la máquina remota, la tarjeta de red, el cable de red y su sistema operativo pueden hacer que se cierre el zócalo.

Tenga en cuenta también que el software Fiddler y Desktop VPN pueden insertarse en la pila de la red y mostrarle todo su tráfico o redirigir todo su tráfico.

Entonces, todo lo que realmente necesita es que Windows proporcione una API que lo permita directamente, o que alguien haya escrito un programa que funcione de manera similar a una VPN o Fiddler y le brinde una forma de cerrar los enchufes que lo atraviesan.

Hay al menos un programa ( CurrPorts ) que hace exactamente esto y lo usé hoy con el fin de cerrar sockets específicos en un proceso que se inició antes de que se iniciara CurrPorts. Para hacer esto, debe ejecutarlo como administrador, por supuesto.

Tenga en cuenta que probablemente no sea posible hacer que un programa no escuche en un puerto (bueno, es posible, pero esa capacidad se conoce como firewall ...), pero no creo que se haya preguntado aquí. Creo que la pregunta es "¿cómo cierro selectivamente una conexión activa (socket) al puerto en el que mi programa está escuchando?". La redacción de la pregunta está un poco apagada porque se proporciona un número de puerto para la conexión de cliente entrante no deseada y se la denominó "puerto", pero está bastante claro que era una referencia a ese socket y no al puerto de escucha.

Huntharo
fuente
3
Sí, CP es una herramienta maravillosa: CurrPorts.exe / close <Dirección local> <Puerto local> <Dirección remota> <Puerto remoto> {Nombre del proceso} Esta sería la línea: CurrPorts.exe / close * 56789 * * server. exe
JasonXA
CurrPorts no parece poder cerrar las conexiones de multidifusión UDP provenientes de un proceso
george_h
143
  1. abierto cmd

    • escribir netstat -a -n -o

    • encontrar TCP [the IP address]:[port number] .... #[target_PID]#(lo mismo para UDP)

    • (Por cierto, kill [target_PID]no funcionó para mí)

  2. CTRL + ALT + SUPRIMIR y elija "iniciar administrador de tareas"

    • Haga clic en la pestaña "Procesos"

    • Habilite la columna "PID" yendo a: Ver> Seleccionar columnas> Marque la casilla para PID

    • Encuentre el PID de interés y "FINALIZAR PROCESO"

  3. Ahora puede volver a ejecutar el servidor en [la dirección IP]: [número de puerto] sin problemas

HaoQi Li
fuente
8
Lo que está diciendo es simplemente matar el proceso del servidor y volver a ejecutarlo, lo cual es algo que quería evitar, ya que esto interrumpiría cada conexión al servidor, no solo la no deseada.
Victor Stafusa
77
Lo siento, no ayudé a resolver tu pregunta específica. Solo estaba proporcionando mi respuesta cuando apareció su pregunta cuando busqué en Google cómo simplemente cerrar un puerto de Windows, y pensé que podría ser útil para otras personas que también tenían mi problema. :)
HaoQi Li
2
@HaoQiLi, no puedes simplemente terminar todo y cualquier cosa. Por ejemplo, el Systemproceso que maneja las conexiones de red de Windows.
Pacerier
2
@HaoQiLi creo que para cerrar podemos usar taskkill /pid 6168 /f6168 es el pid
Madhawa Priyashantha
9
¡¡¡ridícula esta respuesta tiene tantos votos positivos cuando la pregunta establece claramente ¡¡¡CONEXIÓN ÚNICA, no todo el proceso !!!
Mike
59

Por ejemplo, desea liberar el puerto 8080 Luego, siga estos comandos.

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

¡Hecho!

Rahul
fuente
55
Gracias Solo tu solución me ayudó.
vvator
1
Correcto, es útil imprimir el PID cuando se trata de localizar el PID. (¿Quienes son esas personas?).
Adrian M.
3
Esto también está matando el proceso de pid mencionado y no solo cerrando el puerto.
NDestiny
1
Esto es de ayuda.
Tural Asgar
Probé en Windows 10 y no elimina la conexión TCP solo, sino todo el proceso o subproceso que lo usa. Como Víctor declaró, ese no es su objetivo.
Sebastian
54

Si conoce el puerto que desea liberar, puede ordenar su lista de netstat buscando el puerto específico como este:

netstat -ano | findstr :8080

Entonces el pid aparecerá en el derecho que puedes matar con taskkill.

ingrese la descripción de la imagen aquí

taskkill/pid 11704 /F

También es posible que desee ver esta pregunta que es específicamente para localhost, pero creo que es relevante:

Felipe Centeno
fuente
Probé en Windows 10 y no elimina la conexión TCP solo, sino todo el proceso o subproceso que lo usa. Como Víctor declaró, ese no es su objetivo.
Sebastian
27

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

Alternativamente, si no desea utilizar SOFTWARE EXTERNO (por cierto, estas herramientas no requieren instalación), simplemente puede ejecutar PRIMERO el comando netstat (preferiblemente netstat -b) y luego configurar la Política de seguridad local para bloquear la IP dirección de la máquina del usuario en cuestión, eso es lo que he estado haciendo con conexiones no deseadas o incluso desconocidas, que le permite hacer todo SIN NINGÚN SOFTWARE EXTERNO (todo viene con Windows) ...

Vman
fuente
2
Esta es la respuesta correcta y es totalmente compatible con Microsoft.
Dan Bonachea
Me funcionó a mi también. Utilicé la Política de seguridad local -> Políticas de seguridad de IPS en la computadora local. La interfaz de usuario es bastante intuitiva.
Puterdo Borato
1
Intentado esto, la conexión cercana está atenuada para ipv6, ¿cuál es la alternativa para cerrar ipv6 si la hay?
jjxtra
7

No puede cerrar sockets sin cerrar el proceso que posee esos sockets. Los sockets son propiedad del proceso que los abrió. Entonces, para encontrar el ID de proceso (PID) para Unix / Linux. Use netstat así:

netstat -a -n -p -l

Eso imprimirá algo como:

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         

Donde -a imprime todos los sockets, -n muestra el número de puerto, -p muestra el PID, -l muestra solo lo que está escuchando (esto es opcional dependiendo de lo que esté buscando).

La información real que quieres es PID. Ahora podemos cerrar ese proceso haciendo:

kill 1879

Si está cerrando un servicio, es mejor usar:

service sendmail stop

Kill literalmente mata solo ese proceso y a todos los niños que posee. El uso del comando de servicio ejecuta el script de apagado registrado en el directorio init.d. Si usa kill en un servicio, es posible que no se inicie correctamente porque no lo cerró correctamente. Solo depende del servicio.

Desafortunadamente, Mac es diferente de Linux / Unix a este respecto. No puedes usar netstat. Lea este tutorial si está interesado en Mac:

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

Y si está en Windows, use TaskManager para eliminar procesos y servicios de interfaz de usuario para cerrar servicios. Puede usar netstat en Windows al igual que Linux / Unix para identificar el PID.

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

chubbsondubs
fuente
Ha hecho una aclaración sobre su pregunta, que son los zócalos de clientes remotos que se pueden cerrar con otras herramientas como otros han señalado. Esta respuesta se centra principalmente en los sockets del servidor que no pueden (sin tocar el sistema operativo). Esta es la forma de derribar limpiamente un proceso que posee un socket de servidor, que es lo que desea hacer si ese es el puerto. Pero, si tiene muchas conexiones entrantes a su servidor, esa es una situación diferente y definitivamente puede matarlas. No está mal, no es exactamente lo que el OP estaba preguntando.
chubbsondubs
Debe eliminar la parte "matar el proceso", porque no es una respuesta a la pregunta. ¡También podría detener el adaptador de red para detener el tráfico, pero aún así no mata el Socket solo!
Sebastian
La respuesta es correcta solo para ipv6, para ipv4 puede llamar a SetTcpEntry
jjxtra
5

Utilice CurrPorts (es gratuito y no se instala): http://www.nirsoft.net/utils/cports.html

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

Ejemplos:

# 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

También tiene una buena GUI con funciones de búsqueda y filtro.

Nota: Esta respuesta es la respuesta y el comentario de Huntharo y JasonXA juntos y simplificados para que sea más fácil para los lectores. Los ejemplos provienen de la página web de CurrPorts.

qwertzguy
fuente
3

No puede cerrar los sockets en su servidor sin poseer esos sockets, por lo tanto, no puede cerrar el socket sin tener el código ejecutándose en el proceso que posee el socket del servidor.

Sin embargo, hay otra opción que le dice al cliente que cierre su socket. Enviar un paquete TCP RST al puerto al que se conecta el cliente hará que el cliente pierda su conexión. Puede hacerlo con el escaneo RST usando nmap.

http://nmap.org/

chubbsondubs
fuente
¡Esa es una respuesta mucho mejor que tu respuesta anterior! ¡Gracias!
Sebastian
2

wkillcx es una herramienta confiable de línea de comandos de Windows para eliminar conexiones TCP desde la línea de comandos que no se ha mencionado. Sin embargo, a veces tiene problemas con servidores con una gran cantidad de conexiones. A veces uso tcpview para asesinatos interactivos, pero wkillcx se puede usar en scripts.

usuario3310805
fuente
1

Para cerrar el puerto , puede identificar el proceso que está escuchando en este puerto y eliminar este proceso.

Darin Dimitrov
fuente
2
@Victor, lo vi pero no hay forma de cerrar un puerto por la fuerza sin interrumpir el proceso. Otra posibilidad es escribir el programa del servidor de tal manera que tenga algún tipo de panel de control cuando pueda monitorear y administrar clientes.
Darin Dimitrov
1
Además, si la interfaz en la que está escuchando el socket se cae, el socket se cerrará.
rustyx
Creo que estaba pidiendo un ejemplo.
EyoelD
1

puedes usar programas como tcpview de sysinternal. Supongo que puede ayudarte mucho tanto en el monitoreo como en la eliminación de conexiones no deseadas.

Mochan
fuente
1

CurrPorts no funcionó para nosotros y solo pudimos acceder al servidor a través de ssh, por lo que tampoco TCPView. No pudimos matar el proceso tampoco, para no dejar caer otras conexiones. Lo que terminamos haciendo y aún no se sugirió fue bloquear la conexión en el Firewall de Windows. Sí, esto bloqueará todas las conexiones que se ajusten a la regla, pero en nuestro caso había una sola conexión (la que nos interesaba):

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

Reemplace la IP por la que necesita y agregue otras reglas si es necesario.

afarah
fuente
0

respuesta instantánea / factible / parcial : https://stackoverflow.com/a/20130959/2584794 a

diferencia de la respuesta anterior, donde se usó netstat -a -o -n, se debe buscar una lista increíblemente larga sin el nombre de la aplicación que usa puertos

Anup
fuente
55
Esto es casi lo mismo que la respuesta de HaoQi Li. Esto acabaría con el proceso del servidor al dejar caer cada conexión, y no solo la no deseada. El desafío es soltar solo el no deseado y nada más.
Victor Stafusa
Estoy de acuerdo con Victor. Esa no es la respuesta a la pregunta. Entonces también podría deshabilitar el adaptador de red ...
Sebastian
-3

Sí, es posible cerrar el puerto TCP o UDP, hay un comando en DOS

TASKKILL /f /pid 1234 

Espero que esto funcione para tí

Bijay Budhathoki
fuente
Probé en Windows 10 y no elimina la conexión TCP solo, sino todo el proceso o subproceso que lo usa. Como Víctor declaró, ese no es su objetivo.
Sebastian
-3

Si está ejecutando en Windows 8, `Windows Server 2012 o superior con PowerShell v4 de arriba instalado, puede usar el siguiente script. Esto encuentra los procesos asociados con el puerto y los termina.

Código

#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 

Documentación:

JohnLBevan
fuente
Probé en Windows 10 y no elimina la conexión TCP solo, sino todo el proceso o subproceso que lo usa. Como Víctor declaró, ese no es su objetivo.
Sebastian