Nesta aula, vamos explorar os principais comandos de rede do PowerShell, fundamentais para administradores de sistemas e profissionais de TI que precisam diagnosticar problemas de conectividade, resolver nomes e avaliar a saúde da rede. Dominar essas ferramentas é essencial para automatizar tarefas de troubleshooting e monitoramento.

O PowerShell oferece uma variedade de cmdlets nativos que substituem ou complementam ferramentas clássicas como ping, nslookup e tracert. Esses cmdlets retornam objetos estruturados, permitindo que você filtre, formate e integre os resultados em scripts complexos. Vamos analisar cada um em detalhes, com exemplos práticos e boas práticas.

Test-Connection

O cmdlet Test-Connection é o equivalente moderno do comando ping, mas com muito mais recursos. Ele envia pacotes ICMP (Internet Control Message Protocol) para um ou mais computadores remotos e retorna informações detalhadas sobre a resposta, como tempo de ida e volta (RTT), endereço IP resolvido e status da resposta.

Além de verificar a conectividade básica, o Test-Connection pode ser usado para aguardar um computador ficar online, testar múltiplos endereços simultaneamente e até mesmo executar uma ação quando uma resposta for recebida. Isso o torna uma ferramenta indispensável em scripts de provisionamento e monitoramento.

# Teste básico de conectividade
Test-Connection -ComputerName 'google.com'

# Teste com contagem de pacotes e intervalo
Test-Connection -ComputerName '8.8.8.8' -Count 4 -Interval 1

# Teste silencioso (retorna apenas True/False)
Test-Connection -ComputerName 'servidor01' -Quiet

# Testar vários computadores ao mesmo tempo
Test-Connection -ComputerName 'servidor01', 'servidor02', 'servidor03'

# Aguardar até que o computador responda (útil em scripts)
Test-Connection -ComputerName 'servidor01' -Count 1 -Delay 5 -Quiet

O parâmetro -Quiet retorna um valor booleano (True ou False), facilitando o uso em estruturas condicionais. Já o parâmetro -Delay define o intervalo entre tentativas quando usado com -Count maior que 1. É importante notar que, por padrão, o cmdlet usa o protocolo ICMP, mas pode ser configurado para usar TCP em algumas versões do PowerShell 7+.

Test-NetConnection

O cmdlet Test-NetConnection é uma ferramenta mais avançada que combina várias funcionalidades de diagnóstico em um único comando. Ele pode testar conectividade de rede, portas TCP específicas, resolução de DNS, e até mesmo realizar um trace de rota (traceroute). É especialmente útil para verificar se um serviço está acessível em uma porta específica.

Diferentemente do Test-Connection, que usa ICMP, o Test-NetConnection permite testar portas TCP, o que é crucial para validar serviços web (porta 80/443), SSH (22), RDP (3389), entre outros. Ele também fornece informações detalhadas sobre a interface de rede utilizada e o endereço IP local.

# Testar conectividade básica (equivalente a ping)
Test-NetConnection -ComputerName 'google.com'

# Testar uma porta específica (ex.: HTTP)
Test-NetConnection -ComputerName 'google.com' -Port 80

# Testar uma porta e exibir apenas o resultado
Test-NetConnection -ComputerName 'servidor01' -Port 3389 -InformationLevel Quiet

# Testar várias portas de uma vez
'80', '443', '22' | ForEach-Object {
    Test-NetConnection -ComputerName 'servidor01' -Port $_
}

# Realizar um traceroute
Test-NetConnection -ComputerName 'google.com' -TraceRoute

O parâmetro -InformationLevel permite controlar a quantidade de detalhes retornados. Com Quiet, o cmdlet retorna apenas um valor booleano, enquanto Detailed (padrão) fornece todas as informações. O parâmetro -TraceRoute executa um traceroute, mostrando todos os saltos até o destino.

Resolve-DnsName

O cmdlet Resolve-DnsName é a ferramenta moderna para consultas DNS no PowerShell, substituindo o antigo nslookup. Ele permite consultar registros A, AAAA, CNAME, MX, NS, TXT, e muitos outros, retornando objetos estruturados que podem ser facilmente manipulados.

Com esse cmdlet, você pode verificar se um nome de domínio resolve corretamente, obter o endereço IP associado, listar servidores de e-mail, e até mesmo consultar servidores DNS específicos. Isso é essencial para diagnosticar problemas de resolução de nomes e para automatizar verificações de DNS em scripts.

# Resolver um nome de host para IP
Resolve-DnsName -Name 'google.com'

# Consultar um tipo específico de registro (ex.: MX)
Resolve-DnsName -Name 'gmail.com' -Type MX

# Consultar um registro TXT
Resolve-DnsName -Name 'exemplo.com' -Type TXT

# Usar um servidor DNS específico
Resolve-DnsName -Name 'exemplo.com' -Server '8.8.8.8'

# Obter apenas o endereço IP (simplificado)
(Resolve-DnsName -Name 'google.com' -Type A).IPAddress

O parâmetro -Type permite especificar o tipo de registro DNS desejado. Se omitido, retorna todos os tipos. O parâmetro -Server permite consultar um servidor DNS específico, útil para testar servidores internos ou alternativos. A saída é um objeto com propriedades como Name, Type, IPAddress, NameHost (para CNAME), etc.

Diagnóstico

Além dos três cmdlets principais, o PowerShell oferece outras ferramentas de diagnóstico de rede que podem ser combinadas para uma análise abrangente. O cmdlet Get-NetAdapter exibe informações sobre as interfaces de rede, Get-NetIPConfiguration mostra configurações de IP, e Test-NetConnection com -TraceRoute pode ser usado para identificar gargalos na rota.

Para um diagnóstico completo, é comum usar uma combinação desses comandos em um script. Por exemplo, você pode verificar se o servidor está acessível (Test-Connection), se a porta do serviço está aberta (Test-NetConnection), e se o DNS está resolvendo corretamente (Resolve-DnsName). Essas verificações em sequência podem identificar rapidamente onde está o problema.

# Exemplo de diagnóstico combinado
$servidor = 'servidor01'

# 1. Testar conectividade ICMP
if (Test-Connection -ComputerName $servidor -Count 1 -Quiet) {
    Write-Host "$servidor está acessível via ping" -ForegroundColor Green
} else {
    Write-Host "$servidor não responde ao ping" -ForegroundColor Red
}

# 2. Testar porta RDP
$portaTeste = Test-NetConnection -ComputerName $servidor -Port 3389 -InformationLevel Quiet
if ($portaTeste) {
    Write-Host "Porta 3389 (RDP) está aberta" -ForegroundColor Green
} else {
    Write-Host "Porta 3389 (RDP) não está acessível" -ForegroundColor Red
}

# 3. Resolver nome DNS
$dnsResult = Resolve-DnsName -Name $servidor -ErrorAction SilentlyContinue
if ($dnsResult) {
    Write-Host "DNS resolveu para: $($dnsResult.IPAddress)" -ForegroundColor Green
} else {
    Write-Host "Falha na resolução DNS" -ForegroundColor Red
}

Outra ferramenta útil é o Get-NetRoute, que exibe a tabela de roteamento. Combinado com Test-NetConnection -TraceRoute, você pode mapear o caminho até o destino e identificar onde os pacotes estão sendo perdidos. Essas informações são vitais para administradores de rede.

Boas Práticas

Ao usar esses comandos em scripts, considere as seguintes boas práticas:

  • Use -Quiet quando precisar apenas de um valor booleano para tomada de decisão.
  • Defina timeouts adequados para evitar que scripts fiquem travados aguardando resposta.
  • Trate erros com -ErrorAction para evitar interrupções inesperadas.
  • Combine os cmdlets para criar um script de diagnóstico completo, mas organize a lógica para que seja fácil de entender.
  • Documente seus scripts para que outros administradores possam entender o propósito de cada teste.

Referências

Exercícios

  1. Exercício 1: Escreva um comando que teste a conectividade com o servidor 'contoso.com' enviando 4 pacotes e exibindo o resultado detalhado.

    ✓ Resposta:
    Test-Connection -ComputerName 'contoso.com' -Count 4
  2. Exercício 2: Verifique se a porta 443 do site 'exemplo.com' está acessível. Use o parâmetro que retorna apenas um valor booleano.

    ✓ Resposta:
    Test-NetConnection -ComputerName 'exemplo.com' -Port 443 -InformationLevel Quiet
  3. Exercício 3: Consulte o registro MX do domínio 'gmail.com' e exiba o campo 'NameExchange' e 'Preference' de cada registro.

    ✓ Resposta:
    Resolve-DnsName -Name 'gmail.com' -Type MX | Select-Object NameExchange, Preference
  4. Exercício 4: Crie um script que testa a conectividade com 'servidor01' e, se falhar, executa um traceroute para diagnosticar a rota.

    ✓ Resposta:
    if (-not (Test-Connection -ComputerName 'servidor01' -Count 1 -Quiet)) {
        Test-NetConnection -ComputerName 'servidor01' -TraceRoute
    }
  5. Exercício 5: Escreva um comando que resolva o nome 'www.microsoft.com' e mostre apenas os endereços IPv4 resultantes.

    ✓ Resposta:
    (Resolve-DnsName -Name 'www.microsoft.com' -Type A).IPAddress