Test-NetConnection: testar portas remotas com PowerShell

Test-NetConnection: testar portas remotas com PowerShell

O servidor do cliente está respondendo ping, mas a aplicação não abre. A porta 443 está liberada no firewall ou não? Em vez de instalar o telnet — que a Microsoft removeu do Windows por padrão — ou depender do ping que só testa ICMP, o PowerShell oferece um cmdlet que faz tudo isso junto: Test-NetConnection. Um comando substitui ping, telnet e traceroute, e ainda entrega a saída em objeto para você filtrar e automatizar.

O que é Test-NetConnection?

O Test-NetConnection faz parte do módulo NetTCPIP, disponível por padrão no Windows 8.1/Server 2012 R2 em diante. Ele testa quatro coisas em uma execução:

  • Resolução de DNS do hostname
  • Alcançabilidade ICMP (equivalente ao ping)
  • Conectividade TCP em uma porta específica (equivalente ao antigo telnet host porta)
  • Rota de rede até o destino (-TraceRoute)

A saída é um objeto PowerShell — não texto puro — o que significa que você pode filtrar por propriedade, comparar resultados e integrar em scripts de monitoramento sem precisar fazer parse de string.

Sintaxe básica

Test-NetConnection -ComputerName "host-ou-ip" -Port 443

Os parâmetros mais usados:

  • -ComputerName: hostname ou IP de destino
  • -Port: porta TCP a testar
  • -CommonTCPPort: atalho para portas conhecidas — aceita HTTP, HTTPS, RDP, SMB, WINRM
  • -TraceRoute: ativa o trace route pelo caminho
  • -InformationLevel: Detailed (saída completa) ou Quiet (retorna apenas True/False — ideal para scripts)

Como testar se uma porta está aberta remotamente?

Como saber se uma porta TCP está aberta em um servidor remoto?

Execute Test-NetConnection -ComputerName "servidor" -Port 443 no PowerShell. Se TcpTestSucceeded retornar True, a porta está acessível. Se retornar False, ou a porta está fechada, ou um firewall está bloqueando o tráfego.

Exemplo prático testando HTTPS de um servidor web:

Test-NetConnection -ComputerName "meuservidor.empresa.com" -Port 443

Saída típica:

ComputerName           : meuservidor.empresa.com
RemoteAddress          : 10.0.0.50
RemotePort             : 443
InterfaceAlias         : Ethernet
SourceAddress          : 10.0.0.10
TcpTestSucceeded       : True

O campo que importa para diagnóstico rápido é TcpTestSucceeded. Mas preste atenção: um firewall que responde RST vai retornar False de imediato; já um que descarta silenciosamente o pacote (DROP em vez de REJECT) vai travar no timeout antes de retornar False.

Exemplos práticos por caso de uso

Testar acesso RDP (porta 3389)

Antes de tentar conectar via Remote Desktop, confirme que o serviço está respondendo na porta certa. Se você quer ir além e bloquear força bruta no RDP, veja como proteger o RDP contra ataques de força bruta.

Test-NetConnection -ComputerName "192.168.1.100" -CommonTCPPort RDP

Testar SMB (porta 445) antes de mapear unidade de rede

Test-NetConnection -ComputerName "fileserver" -CommonTCPPort SMB

Verificar se o serviço HTTP está no ar

Test-NetConnection -ComputerName "intranet.empresa.com" -CommonTCPPort HTTP

Modo silencioso para scripts e monitoramento

O parâmetro -InformationLevel Quiet faz o cmdlet retornar diretamente True ou False, sem a saída formatada. Perfeito para condicionais em scripts:

if (Test-NetConnection -ComputerName "api.empresa.com" -Port 8080 -InformationLevel Quiet) {
    Write-Output "Serviço disponível"
} else {
    Write-Output "ATENÇÃO: porta 8080 inacessível"
    # Enviar alerta, registrar em log, etc.
}

Combinando com um array de hosts, você monta um scanner rápido de disponibilidade:

$hosts = @("web01", "web02", "api01", "db01")
foreach ($h in $hosts) {
    $status = if (Test-NetConnection -ComputerName $h -Port 443 -InformationLevel Quiet) { "OK" } else { "FALHOU" }
    Write-Output "$h : $status"
}

Isso é muito mais limpo do que fazer parse da saída do ping ou netstat. Se quiser também inspecionar o que está escutando localmente, o cmdlet complementar é o Get-NetTCPConnection, que lista todas as conexões e portas abertas na máquina local.

Trace route pelo PowerShell

O parâmetro -TraceRoute mostra cada salto entre sua máquina e o destino, equivalente ao tracert clássico — mas com saída em objeto:

Test-NetConnection -ComputerName "8.8.8.8" -TraceRoute

A saída inclui o campo TraceRoute com a lista de IPs intermediários. Se um salto demorar muito ou aparecer como *, é aí que o tráfego está travando. Útil para identificar gargalos de rede ou confirmar que o roteamento está passando pelo caminho esperado.

Verificar se um serviço Windows está em pé antes de testar a porta

Às vezes a porta está fechada simplesmente porque o serviço não está rodando. Combine o teste de porta com uma verificação de serviço local para chegar mais rápido ao ponto. O Get-Service faz essa parte:

# Verificar se o W3SVC (IIS) está rodando antes de testar a porta 80
if ((Get-Service -Name W3SVC).Status -ne "Running") {
    Write-Warning "IIS está parado — inicie o serviço antes de testar"
} else {
    Test-NetConnection -ComputerName "localhost" -Port 80
}

Considerações de segurança

Test-NetConnection também é útil para auditar segmentação de rede: testar de uma VLAN de usuários se portas administrativas (como RDP/3389 ou WinRM/5985) de servidores estão acessíveis quando não deveriam. Se TcpTestSucceeded: True em uma combinação que viola sua política de firewall, você tem um problema de regra mal configurada para corrigir — e descobriu isso sem precisar sair da linha de comando.

Se você ainda está começando com PowerShell e quer entender os fundamentos antes dos cmdlets de rede, o post PowerShell para iniciantes cobre a base necessária.

Conclusão

Test-NetConnection é um dos cmdlets mais práticos do arsenal de qualquer sysadmin Windows: testa ping, porta TCP e rota em um único comando, retorna objetos filtráveis e funciona sem instalar nada. Se você suspeita de problema de conectividade entre sistemas, essa deve ser a primeira ferramenta que você puxa — antes de checar firewall, antes de ligar pro provedor, antes de qualquer outra coisa.

Se quiser aprofundar o diagnóstico de rede via PowerShell, vale explorar também o Get-NetTCPConnection para mapear conexões abertas na máquina local.

Comentários