Compruebe si hay puertos abiertos (de escucha) con PowerShell
En PowerShell, puede usar el cmdlet Test-NetConnection para verificar si un puerto está disponible (abierto) en una computadora remota. Puede usar este cmdlet para verificar la respuesta y la disponibilidad de un servidor remoto o un servicio de red, probar si el puerto TCP está bloqueado por un firewall, verificar la disponibilidad de ICMP y el enrutamiento. De hecho,
Test-NetConnectionreemplaza varias herramientas populares de administración de red, como
ping,
tracert,
telnet,
pathping
, escáner de puerto TCP, etc.
Compruebe si hay un puerto TCP abierto con Test-NetConnection
Puede usar el cmdlet Test-NetConnection para verificar solo los puertos TCP. Por ejemplo, para comprobar que el puerto TCP 25 (el protocolo SMTP) está abierto en el servidor de correo remoto:
Test-NetConnection -ComputerName ny-msg01 -Port 25Nota. Solo puede probar la conectividad de un puerto TCP mediante el cmdlet Test-NetConnection. Sin embargo, no puede usar el cmdlet para verificar la disponibilidad de los puertos UDP remotos.
El comando Test-NetConnection tiene el alias TNC. La versión abreviada del mismo comando se ve así:
TNC ny-msg01 -Port 25Veamos el resultado del comando:
ComputerName : ny-msg01
RemoteAddress : 10.20.1.7
RemotePort : 25
InterfaceAlias : CORP
SourceAddress : 10.20.1.79
PingSucceeded : True
PingReplyDetails (RTT) : 0 ms
TcpTestSucceeded : True
Como puede ver, el cmdlet resuelve el nombre del servidor en una dirección IP, verifica la respuesta ICMP (similar a
ping) y comprueba la respuesta del puerto TCP (disponibilidad del puerto). El servidor especificado responde a través de ICMP (
PingSucceeded = True) y el puerto TCP 25 está abierto (
RemotePort=25, TcpTestSucceeded= True).
Nota. Si el comando devuelve PingSucceeded=False y TcpTestSucceeded= True, lo más probable es que la solicitud ICMP Echo (ping) esté deshabilitada en la computadora remota.
Si ejecuta Test-NetConnection sin parámetros, verificará si la computadora está conectada a Internet (verifica la disponibilidad de la
internetbeacon.msedge.netanfitrión).
Puede agregar la opción -InformationLevel Detail para mostrar información detallada al verificar un puerto TCP remoto:
TNC 192.168.32.101 -Port 3389 -InformationLevel DetailedEl cmdlet tiene un parámetro especial: CommonTCPPort, que le permite especificar el nombre de un protocolo de red conocido (HTTP, RDP, SMB, WINRM).
Por ejemplo, para verificar la disponibilidad de un servidor web HTTP, puede usar el comando:
Test-NetConnection -ComputerName a-d.site -CommonTCPPort HTTPO verifique la disponibilidad de un puerto RDP predeterminado (TCP/3389):
Test-NetConnection ny-rds1 -CommonTCPPort RDPPuede enumerar todos los parámetros que devuelve el cmdlet Test-NetConnection:
Test-NetConnection ny-man01 -port 445|Format-List *
Si solo necesita ver si el puerto está disponible, se puede verificar más rápidamente:
TNC ny-msg1 -Port 25 -InformationLevel QuietEl cmdlet vuelve
True, lo que significa que el puerto TCP remoto está abierto.
Consejo. En versiones anteriores de Windows PowerShell (antes de la versión 4.0), podía verificar la disponibilidad de un puerto TCP remoto con el comando:
(New-Object System.Net.Sockets.TcpClient).Connect('ny-msg01', 25)Puede usar el cmdlet Test-NetConnection para rastrear una ruta a un servidor remoto usando el parámetro -TraceRoute (similar al parámetro integrado
tracertcomando en Windows). Puede limitar el número máximo de saltos durante la comprobación de la ruta utilizando el parámetro -Hops.
Test-NetConnection ny-man01 -TraceRouteCmdlet devolvió un retraso de acceso a la red de resumen en milisegundos (
PingReplyDetails (RTT): 41 ms), así como todas las direcciones IP de los enrutadores en el camino hacia el host de destino.
PowerShell: busque puertos abiertos en varios hosts
Puede usar PowerShell para verificar la disponibilidad de un puerto específico en varias computadoras remotas. Guarde la lista de nombres de host o direcciones IP en un archivo de texto sin formato con el nombre
servers.txtPor ejemplo, su tarea es encontrar hosts donde el puerto TCP/25 no responde o está cerrado en una lista de servidores:
Get-Content c:\PS\list_servers.txt | where { -NOT (Test-Netconnection $_ -Port 25 -InformationLevel Quiet)}| Format-Table -AutoSizePuede usar un script de PowerShell de monitoreo simple que verifique la disponibilidad de los servidores remotos y muestre una notificación emergente si alguno de los servidores no está disponible.
Por ejemplo, puede verificar la disponibilidad de los servicios básicos en todos los controladores de dominio durante una verificación de estado de AD (se puede obtener una lista de DC con el cmdlet Get-ADDomainController). Verifiquemos los siguientes servicios en el DC (hay una regla similar de 'Domain and trusts' en la herramienta PortQry):
RPC-TCP/135
LDAP-TCP/389
LDAP-TCP/3268
DNS-TCP/53
Kerberos-TCP/88
SMB-TCP/445
$Ports = "135","389","636","3268","53","88","445","3269", "80", "443"
$AllDCs = Get-ADDomainController -Filter * | Select-Object Hostname,Ipv4address
ForEach($DC in $AllDCs){
Foreach ($P in $Ports){
$check=Test-NetConnection $DC.Ipv4address -Port $P -WarningAction SilentlyContinue
If ($check.tcpTestSucceeded -eq $true)
{Write-Host $DC.hostname $P -ForegroundColor Green -Separator " => "}
else
{Write-Host $DC.hostname $P -Separator " => " -ForegroundColor Red}
}
}La secuencia de comandos comprueba los puertos TCP especificados en los controladores de dominio y, si alguno de los puertos no está disponible, los resalta en rojo (puede ejecutar esta secuencia de comandos de PowerShell como un servicio de Windows).
Escáner de puertos TCP/IP simple en PowerShell
Puede usar PowerShell para implementar un escáner de IP simple que escanea hosts remotos o subredes de IP en busca de puertos TCP abiertos/cerrados.
Para escanear el rango de direcciones IP entre 192.168.1.100 y 192.168.1.150 y mostrar las computadoras que tienen el puerto 3389 abierto:
foreach ($ip in 100..150) {Test-NetConnection -Port 3389 -InformationLevel "Detailed" 192.168.1.$ip}Escanee un rango de puertos TCP (del 1 al 1024) en un host remoto:
foreach ($port in 1..1024) {If (($a=Test-NetConnection srvfs01 -Port $port -WarningAction SilentlyContinue).tcpTestSucceeded -eq $true){ "TCP port $port is open!"}}Cómo enumerar los puertos abiertos en Windows con PowerShell
Use el cmdlet Get-NetTCPConnection para enumerar los puertos que están abiertos en la computadora local (este es el equivalente de PowerShell de
NETSTAT). Se puede ver una lista de todos los puertos TCP abiertos en la computadora de la siguiente manera:
Get-NetTcpConnection -State Listen | Select-Object LocalAddress,LocalPort| Sort-Object -Property LocalPort | Format-TableTambién puede usar el cmdlet Get-NetTCPConnection para enumerar las conexiones TCP/IP activas.
Si desea averiguar qué programa (proceso) está escuchando en un puerto específico de su computadora, use el siguiente comando (donde 443 es un número de puerto que desea verificar):
Get-Process -Id (Get-NetTCPConnection -LocalPort 443).OwningProcess | ft Id, ProcessName, UserName, Path








