Test-NetConnection: comprobar puertos abiertos / cerrados desde PowerShell

Test-NetConnection – Ha aparecido un cmdlet listo para usar para comprobar la conexión de red en PowerShell 4.0 (Windows 2012 R2, Windows 8.1 y versiones posteriores). Puede usar este cmdlet para verificar la respuesta y disponibilidad de un servidor remoto o servicio de red en él, los puertos TCP bloqueados por firewalls, verificar la disponibilidad y el enrutamiento de ICMP. De hecho, el Test-NetConnection cmdlet puede reemplazar varias herramientas de administración de red estándar a la vez: ping, traceroute, escáner de puerto TCP, etc.

De vez en cuando, cualquier administrador debe verificar la disponibilidad del servicio en un servidor remoto verificando la respuesta del puerto TCP remoto (por ejemplo, la disponibilidad de un correo electrónico o servidor web). Además, la mayoría de los administradores están acostumbrados a realizar dicha verificación de puerto con el telnet mando. Por ejemplo, para asegurarse de que el servicio SMTP responde en el servidor de correo electrónico (de forma predeterminada, responde en el puerto TCP 25) es suficiente ejecutar telnet ny-msg01.woshub.com 25 mando. Pero a partir de Windows 7, el cliente telnet se ha convertido en una función que se instala por separado. Veamos cómo verificar puertos TCP abiertos / cerrados usando PowerShell.

El principal beneficio del Test-NetConnection cmdlet es que ya forma parte de todas las versiones modernas de Windows y no es necesario instalarlo por separado. El cmdlet es parte del NetTCPIP módulo (comenzando con PoSh v4.0).

Consejo. Puede verificar la versión instalada actual de PowerShell con el comando: $PSVersionTable.PSVersion

El valor 4 en la columna Mayor significa que PowerShell 4.0 está instalado en su computadora.

Prueba de puertos TCP de servidor abiertos / cerrados con Test-NetConnection

Comprobemos si el puerto TCP 25 (protocolo SMTP) está abierto (disponible) en el servidor de correo electrónico remoto usando Test-NetConnection:

Test-NetConnection -ComputerName ny-msg01 -Port 25

Nota. Con el cmdlet Test-NetConnection, puede verificar solo la conexión del puerto TCP y no es aplicable verificar la disponibilidad de los puertos UDP remotos.

La versión abreviada del mismo comando se ve así: TNC ny-msg01 -Port 25

Consideremos 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 la dirección IP, verifica la respuesta ICMP (similar a ping) y la disponibilidad del puerto TCP. El servidor especificado responde a través de ICMP (PingSucceeded = True) y el puerto TCP 25 está abierto (RemotePort=25, TcpTestSucceeded= True).

Nota. En algunos casos, puede ocurrir que PingSucceeded = False y TcpTestSucceeded = True. Es probable que signifique que ICMP Ping está prohibido en el servidor remoto.

El 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 woshub.com -CommonTCPPort HTTP

O disponibilidad del puerto RDP (3389):

Test-NetConnection ny-rds1 –CommonTCPPort RDP

Puede enumerar todos los parámetros que devuelve el cmdlet Test-NetConnection:

Test-NetConnection ny-man01 -port 445|Format-List *

Test-NetConnection todas las propiedades del estado de conexión

Si solo necesita ver si el puerto está disponible, puede verificarlo más rápidamente:

TNC ny-msg1 -Port 25 -InformationLevel Quiet

El cmdlet regresó True, lo que significa que se puede acceder al puerto remoto.

TNC ny-msg1 -Puerto 25 -InformationLevel Quiet

Consejo. En versiones anteriores de PowerShell, podía verificar la disponibilidad del puerto TCP de la siguiente manera:

(New-Object System.Net.Sockets.TcpClient).Connect(‘ny-msg01’, 25)

(Nuevo objeto System.Net.Sockets.TcpClient) .Connect

En Windows 10 / Windows Server 2016, puede usar el cmdlet Test-NetConnection para rastrear la ruta a un servidor remoto usando el –TraceRoute parámetro (análogo al comando tracert en Windows). Utilizando la –Hops parámetro, puede limitar el número máximo de esperanzas durante la verificación de ruta.

Test-NetConnection ny-man01 –TraceRoute

El cmdlet devolvió el retraso del resumen de red al acceder al servidor en milisegundos (PingReplyDetails (RTT): 41 ms) y todas las direcciones IP de los enrutadores en el camino hacia el servidor de destino.

Test-NetConnection: powershell TraceRoute

Test-NetConnection en scripts de supervisión de PowerShell

El siguiente comando le permite verificar la disponibilidad de un puerto específico en varios servidores, cuya lista se almacena en un archivo de texto sin formato list_servers.txt. Necesitamos los servidores donde el servicio especificado no responde:

Get-Content c:PSlist_servers.txt |  where { -NOT (Test-Netconnection $_ -Port 25  -InformationLevel Quiet)}| Format-Table -AutoSize

De manera similar, puede crear un script de monitoreo simple que verifique la disponibilidad de los servidores y muestre una notificación si uno de los servidores no está disponible.

Por ejemplo, puede verificar la disponibilidad de los servicios básicos en todos los controladores de dominio (se puede obtener una lista de DC con el cmdlet Get-ADDomainController). Comprobemos los siguientes servicios en DC (la herramienta PortQry tiene una regla similar de «Dominio y fideicomisos»):

  • 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,isGlobalCatalog,Site,Forest,OperatingSystem
ForEach($DC in $AllDCs)
{
Foreach ($P in $Ports){
$check=Test-NetConnection $DC -Port $P -WarningAction SilentlyContinue
If ($check.tcpTestSucceeded -eq $true)
{Write-Host $DC.name $P -ForegroundColor Green -Separator " => "}
else
{Write-Host $DC.name $P -Separator " => " -ForegroundColor Red}
}

La secuencia de comandos verificará los puertos TCP especificados en los controladores de dominio y, si uno de los puertos no está disponible, lo resaltará en rojo (puede ejecutar esta secuencia de comandos de PowerShell como un servicio de Windows).

poweshell: prueba para puertos abiertos y cerrados en un controlador de dominio de directorio activo

Escáner de puerto / red IP simple con PowerShell

También puede implementar un puerto simple y un escáner de red de subredes IP para escanear servidores remotos o subredes en busca de puertos TCP abiertos / cerrados.

Escanee el rango de direcciones IP en el puerto abierto 3389:

foreach ($ip in 100..150) {Test-NetConnection -Port 3389 -InformationLevel "Detailed" 192.168.1.$ip}

Escanee el rango de puertos TCP de 1 a 1024 en el servidor remoto especificado:

foreach ($port in 1..1024) {If (($a=Test-NetConnection srvfs01 -Port $port -WarningAction SilentlyContinue).tcpTestSucceeded -eq $true){ "TCP port $port is open!"}}

secuencia de comandos del escáner de puerto de red powershell

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *