Network - PowerShell

Test-NetConnection: diagnostica di rete in PowerShell

Strumenti classici come ping, tracert o il vecchio client telnet sono fondamentali, ma spesso restituiscono risultati frammentati. Windows offre un’alternativa moderna, potente e integrata in PowerShell: il cmdlet Test-NetConnection.

Il comando Test-NetConnection permette di verificare la raggiungibilità di un host non solo tramite il classico protocollo ICMP (ping), ma anche testando le porte TCP.

Nota: attualmente Test-NetConnection supporta esclusivamente il protocollo TCP. Per test UDP è necessario affidarsi a strumenti esterni come PortQry o script .NET personalizzati.

Esempi di utilizzo

Vediamo come verificare se un host o un sito è raggiungibile

Test-NetConnection -ComputerName google.com

ComputerName           : google.com
RemoteAddress          : 142.250.181.174
InterfaceAlias         : LAN
SourceAddress          : 192.168.0.247
PingSucceeded          : True
PingReplyDetails (RTT) : 17 ms

Oltre al semplice “risponde/non risponde”, il comando restituirà l’indirizzo IP risolto e i dettagli dell’interfaccia di rete utilizzata per la connessione. La riga più importante è PingSucceded che ha restituito True.

Utilizziamo ora il comando per verificare se una porta è aperta su un server remoto (es. RDP-3389 o SQL-1433)

Test-NetConnection -ComputerName 192.168.0.41 -Port 3389

ComputerName     : 192.168.0.41
RemoteAddress    : 192.168.0.41
RemotePort       : 3389
InterfaceAlias   : LAN
SourceAddress    : 192.168.0.247
TcpTestSucceeded : True

In questo caso, il valore da osservare nell’output è TcpTestSucceeded. Se è True, la porta è aperta e il servizio è raggiungibile.

Quando si analizzano problemi di rete viene spesso utilizzato il comando traceroute. Il cmdlet Test-NetConnection può effettuare questo test

Test-NetConnection -ComputerName 8.8.8.8 -TraceRoute

ComputerName           : 8.8.8.8
RemoteAddress          : 8.8.8.8
InterfaceAlias         : LAN
SourceAddress          : 192.168.0.247
PingSucceeded          : True
PingReplyDetails (RTT) : 20 ms
TraceRoute             : 192.168.0.1
                         201.47.79.246
                         0.0.0.0
                         0.0.0.0
                         0.0.0.0
                         0.0.0.0
                         8.8.8.8

Come visto nel primo esempio anche in questo caso abbiamo il valore PingSucceded che ha restituito True e sono inoltre presenti tutti gli hosts attraversati dal pacchetto per arrivare a destinazione.

Nell’output possono esserci hops contrassegnati da asterischi o senza IP. Questo significa che quel particolare nodo è configurato per non rispondere alle richieste ICMP per motivi di sicurezza, ma non indica necessariamente un guasto se i salti successivi funzionano.

Test-NetConnection può essere utilizzato all’interno di script più o meno complessi. In questo caso non servono output dettagliati, ma solo un valore “Vero/Falso”. Il parametro -InformationLevel Quiet permette di ottenere questo risultato

$isOnline = Test-NetConnection -ComputerName "google.com" -Port 443 -InformationLevel Quiet
if ($isOnline) { Write-Host "Il server è raggiungibile" }

Il server è raggiungibile

In questo caso il server risponde sulla porta 443 e di conseguenza $isOnline sarà valorizzato a True eseguendo il comando tra parentesi graffe.

Test-NetConnection non permette nativamente di inserire un range (es. 3388-3390), ma possiamo facilmente bypassare questo limite con un ciclo

3388..3390 | ForEach-Object { 
    Test-NetConnection -ComputerName "192.168.0.41" -Port $_ | Select-Object RemotePort, TcpTestSucceeded 
}

RemotePort TcpTestSucceeded
---------- ----------------
      3388            False
      3389             True
      3390            False

restituendo l’esito per ogni porta. Qualora le porte non siano consecutive possiamo modificare il comando come segue

$ports = 80, 443, 1433, 3389
foreach ($p in $ports) {
    Test-NetConnection -ComputerName "ComputerName.Domain" -Port $p | Select-Object RemotePort, TcpTestSucceeded
}

RemotePort TcpTestSucceeded
---------- ----------------
        80            False
       443             True
      1433            False
      3389             True

Nota: qualora il numero di porte da testare è elevato il tempo di esecuzione potrebbe essere molto elevato. Questo in quanto Test-NetConnection attende il timeout di rete per ogni porta chiusa (circa 2 secondi per porta).

Riepilogo dei principali parametri

ParametroFunzione
-ComputerNameL’host o l’IP di destinazione
-PortLa porta TCP da testare
-CommonTCPPortUsa nomi standard come HTTP, HTTPS, RDP, SMB
-TraceRouteEsegue il traceroute
-InformationLevelRegola il dettaglio (Quiet per solo True/False, Detailed per il massimo dei dati)

Conclusione

Test-NetConnection elimina la necessità di installare client telnet o strumenti di terze parti per i test di base. È presente di base in Windows, è potente e perfetto per essere inserito in script di automazione.