networking - una - Cómo cerrar los puertos TCP y UDP a través de la línea de comandos de Windows
netstat puertos abiertos (16)
¿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 los comandos netstat o netsh que se enfocaban en cómo monitorear los puertos. No quiero respuestas sobre cómo controlarlos (ya lo hago). Quiero cerrar / matarlos.
EDITAR, para aclarar: Digamos que mi servidor escucha el puerto TCP 80. Un cliente hace una conexión y el puerto 56789 se asigna para él. Luego, descubro que esta conexión no es deseada (por ejemplo, este usuario está haciendo cosas malas, les pedimos que se detengan, pero la conexión no se eliminó en algún momento). Normalmente, agregaría un firewall para hacer el trabajo, pero esto tomaría algo de tiempo, y estaba en una situación de emergencia. Asesinar el proceso que posee la conexión realmente es una mala idea porque esto derribaría el servidor (todos los usuarios perderían la funcionalidad cuando solo deseamos soltar esta conexión de forma selectiva y temporal).
cmd
abiertoescriba
netstat -a -n -o
encuentre
TCP [the IP address]:[port number] .... #[target_PID]#
(ídem para UDP)(Por cierto,
kill [target_PID]
no funcionó para mí)
CTRL + ALT + SUPR y elige "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 "PROCESO DE FINALIZACIÓN"
Ahora puede volver a ejecutar el servidor en [la dirección IP]: [número de puerto] sin problema
Encontré la respuesta correcta a esta. Pruebe TCPView desde Sysinternals, ahora propiedad de Microsoft. Puede encontrarlo en http://technet.microsoft.com/en-us/sysinternals/bb897437
No puede cerrar sockets en su servidor sin tener 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 RST TCP al puerto en el que se conecta el cliente provocará que el cliente desconecte su conexión. Puede hacerlo con escaneo RST usando nmap.
Para cerrar el puerto , puede identificar el proceso que está escuchando en este puerto y matar este proceso.
Por ejemplo, desea liberar el puerto 8080. Luego, siga estos comandos.
- netstat -ano
- taskkill / f / im [pid del puerto 8080 obtenido del comando anterior]
¡Hecho!
Pruebe la herramienta sysinternals / microsoft tcpview (gui) y Tcpvcon (línea de comandos)
Sí, es posible cerrar el puerto TCP o UDP, hay un comando en DOS
TASKKILL /pid 1234
Espero que esto funcione para tí
Sí, esto es posible No es necesario que sea 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 SO pueden hacer que el socket se cierre.
Considere también que el software Fiddler and Desktop VPN puede insertarse en la pila de la red y mostrarle todo el tráfico o redirigir todo el 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 alguna manera como una VPN o Fiddler y le brinde una manera de cerrar los sockets que lo atraviesan.
Hay al menos un programa ( CurrPorts ) que hace exactamente esto y lo usé hoy con el propósito de cerrar tomas específicas en un proceso que se inició antes de que se iniciara CurrPorts. Para hacer esto debes 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 un 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 desaprobada porque se proporciona un número de puerto para la conexión del cliente entrante no deseado y se lo denominó "puerto", pero está bastante claro que era una referencia a ese socket y no al puerto de escucha.
Si conoce el puerto que desea liberar, puede ordenar su lista netstat buscando el puerto específico de esta manera:
netstat -ano | findstr: 8080
Entonces, el pid aparecerá en el rigth, que puedes matar con taskkill.
TaskKill / pid YOURPID
También es posible que desee ver esta question que es específicamente para localhost, pero creo que es relevante:
Si está ejecutando en Windows 8
, Windows Server 2012
o superior con PowerShell v4
de arriba, puede usar la secuencia de comandos siguiente. Esto encuentra los procesos asociados con el puerto y los finaliza.
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:
- Get-NetTCPConnection : equivalente de
NetStat
de PowerShell - Select-Object - Retirar propiedades específicas de un objeto / eliminar duplicados
- Where-Object - Filtra valores basados en alguna condición
- Stop-Process - equivalente a
TaskKill
de PowerShell
Use CurrPorts (es gratis y no se instala): CurrPorts
/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 características de búsqueda y filtro.
Nota: Esta respuesta es huntharo y la respuesta y el comentario de JasonXA juntos y simplificados para que sea más fácil para los lectores. Los ejemplos provienen de la página web de CurrPorts.
Use TCPView ( http://technet.microsoft.com/en-us/sysinternals/bb897437.aspx ) o CurrPorts ( CurrPorts ).
Alternativamente, si no desea utilizar el SOFTWARE EXTERNO (estas herramientas no requieren una instalación por cierto), simplemente puede PRIMERO ejecutar el comando netstat (preferiblemente netstat -b) y luego configurar la Política de seguridad local para bloquear el 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, eso te permite hacer todo SIN SOFTWARE EXTERNO (todo viene con Windows) ...
puede usar el programa como tcpview desde sysinternal. Supongo que puede ayudarte mucho a controlar y matar conexiones no deseadas.
wkillcx es una herramienta de línea de comandos de Windows confiable para eliminar conexiones tcp de la línea de comandos que no se ha mencionado. Sin embargo, tiene problemas con servidores con gran cantidad de conexiones. A veces uso tcpview para kill interactivos, pero wkillcx puede usarse en scripts.
No puede cerrar los sockets sin cerrar el proceso que posee esos sockets. Los sockets son propiedad del proceso que los abrió. Entonces, para descubrir el ID de proceso (PID) para Unix / Linux. Use netstat como tal:
netstat -a -n -p -l
Eso imprimirá algo así 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 busque).
La información real que desea es PID. Ahora podemos cerrar ese proceso haciendo:
kill 1879
Si está cerrando un servicio, es mejor usar:
service sendmail stop
Matar literalmente mata solo ese proceso y cualquier niño que posea. 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 la copia de seguridad porque no se cerró correctamente. Solo depende del servicio.
Desafortunadamente, Mac es diferente de Linux / Unix a este respecto. No puedes usar netstat. Lee este tutorial si estás 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 el Administrador de tareas para eliminar procesos y la IU de servicios para cerrar los servicios. Puede usar netstat en Windows como Linux / Unix para identificar el PID.
http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/netstat.mspx?mfr=true
respuesta instantánea / factible / parcial : https://.com/a/20130959/2584794
a diferencia de la respuesta anterior donde netstat -a -o -n se usó, se buscó una lista increíblemente larga sin el nombre de la aplicación que usa esos puertos