Network debugging: ping, traceroute, dig, nslookup

1. Fundamentos do Diagnóstico de Rede em Scripts

1.1. Conceitos de conectividade e resolução de nomes

Diagnóstico de rede em Bash combina duas camadas essenciais: conectividade IP (ping, traceroute) e resolução DNS (dig, nslookup). Scripts robustos precisam tratar ambas de forma integrada, pois uma falha de DNS pode simular um problema de conectividade.

1.2. Códigos de saída (exit codes) e tratamento de erros

Cada ferramenta possui códigos de saída específicos. O ping retorna 0 se bem-sucedido, 1 se falhar. O dig retorna 0 para consultas bem-sucedidas (mesmo sem respostas) e 9 para erros de servidor. Use $? imediatamente após o comando:

ping -c 1 8.8.8.8 > /dev/null 2>&1
if [ $? -eq 0 ]; then
    echo "Conectividade OK"
else
    echo "Falha de conectividade"
fi

1.3. Redirecionamento de saída e supressão de mensagens indesejadas

Para scripts limpos, redirecione saídas verbose para /dev/null e capture apenas o necessário:

dig +short google.com 2>/dev/null
traceroute -n -w 1 8.8.8.8 2>/dev/null | tail -n +2

2. ping: Teste de Conectividade e Latência

2.1. Uso básico em scripts: ping -c e contagem de pacotes

O -c define número de pacotes, essencial para scripts não-bloqueantes:

ping -c 4 -W 2 8.8.8.8

2.2. Extração de métricas: tempo médio, perda de pacotes

Use grep e awk para extrair estatísticas:

PERDA=$(ping -c 10 -q 8.8.8.8 | grep -oP '\d+(?=% packet loss)')
MEDIA=$(ping -c 10 8.8.8.8 | tail -1 | awk -F '/' '{print $5}')
echo "Perda: ${PERDA}% | Latência média: ${MEDIA}ms"

2.3. Script de monitoramento contínuo com loop e alarme

#!/bin/bash
ALVO="8.8.8.8"
LIMIAR=20  # perda máxima em %

while true; do
    PERDA=$(ping -c 5 -q "$ALVO" | grep -oP '\d+(?=% packet loss)')
    if [ "$PERDA" -gt "$LIMIAR" ]; then
        echo "$(date): ALERTA - Perda de ${PERDA}% para $ALVO"
        # Enviar notificação (ex: mail, syslog)
    fi
    sleep 60
done

3. traceroute: Mapeamento de Rota e Identificação de Gargalos

3.1. Flags essenciais para scripts

  • -n: evita resolução DNS (mais rápido)
  • -w 1: timeout de 1 segundo por salto
  • -m 15: máximo de 15 saltos
traceroute -n -w 1 -m 15 8.8.8.8

3.2. Parsing de saída: extração de IPs e tempos

traceroute -n 8.8.8.8 | awk 'NR>1 {print $2, $3, $4}'

3.3. Script de diagnóstico com relatório de saltos lentos

#!/bin/bash
ALVO="$1"
traceroute -n -w 2 "$ALVO" | awk '
NR>1 {
    ip=$2
    t1=$3; t2=$4; t3=$5
    if (t1 ~ /ms/ && t2 ~ /ms/ && t3 ~ /ms/) {
        media=(t1+0 + t2+0 + t3+0)/3
        if (media > 100) print "LENTO:", ip, media "ms"
    }
}'

4. dig: Consultas DNS Avançadas e Automação

4.1. Modo breve (+short) e consultas específicas

dig +short google.com          # IP do A
dig +short MX google.com       # servidores MX
dig +short NS google.com       # nameservers

4.2. Uso de servidores DNS alternativos e timeout

dig @8.8.8.8 +time=2 +tries=1 google.com +short

4.3. Script de verificação em lote

#!/bin/bash
DOMINIOS=("google.com" "github.com" "stackoverflow.com")
TIPOS=("A" "MX" "NS")

for dominio in "${DOMINIOS[@]}"; do
    echo "=== $dominio ==="
    for tipo in "${TIPOS[@]}"; do
        RESULT=$(dig +short "$tipo" "$dominio" 2>/dev/null)
        if [ -n "$RESULT" ]; then
            echo "$tipo: $RESULT"
        else
            echo "$tipo: Sem registro"
        fi
    done
done

5. nslookup: Alternativa Clássica e Compatibilidade

5.1. Diferenças práticas entre nslookup e dig

nslookup é mais simples, mas menos flexível para parsing. dig é preferível em scripts modernos. nslookup ainda é útil em sistemas legados.

5.2. Modo batch com redirecionamento

echo "server 8.8.8.8" > /tmp/dns_cmds.txt
echo "google.com" >> /tmp/dns_cmds.txt
nslookup < /tmp/dns_cmds.txt 2>/dev/null | grep -A1 "Name:"

5.3. Script de fallback: tentar dig, depois nslookup

#!/bin/bash
DOMINIO="$1"
IP=$(dig +short "$DOMINIO" 2>/dev/null)
if [ -z "$IP" ]; then
    IP=$(nslookup "$DOMINIO" 2>/dev/null | grep -oP 'Address: \K[\d.]+')
fi
echo "IP de $DOMINIO: ${IP:-Falha na resolução}"

6. Combinação de Ferramentas em Scripts Robustos

6.1. Pipeline integrado para diagnóstico completo

#!/bin/bash
ALVO="$1"
echo "=== Diagnóstico de $ALVO ==="
echo "1. Ping:"; ping -c 3 -q "$ALVO" | tail -2
echo "2. Rota:"; traceroute -n -w 1 "$ALVO" | tail -5
echo "3. DNS:"; dig +short "$ALVO"

6.2. Tratamento de timeouts com timeout e ||

timeout 5 ping -c 1 "$ALVO" || echo "Timeout no ping"
timeout 3 dig +short "$ALVO" || echo "Timeout no DNS"

6.3. Geração de relatório CSV

#!/bin/bash
echo "data,alvo,ping_medio,perda_%,rota_saltos,dns_ip"
DATA=$(date +%Y-%m-%d_%H:%M)
ALVO="$1"
PING=$(ping -c 5 -q "$ALVO" | awk -F'[/ ]' '/rtt/{print $5}')
PERDA=$(ping -c 5 -q "$ALVO" | grep -oP '\d+(?=%)')
SALTOS=$(traceroute -n "$ALVO" | wc -l)
DNS=$(dig +short "$ALVO" | tr '\n' ' ')
echo "$DATA,$ALVO,$PING,$PERDA%,$SALTOS,$DNS"

7. Boas Práticas e Automação com Cron/Sistema

7.1. Logs rotativos e notificações

#!/bin/bash
LOG="/var/log/rede_diario.log"
exec >> "$LOG" 2>&1
echo "=== $(date) ==="
ping -c 3 8.8.8.8 || logger -p user.err "Falha no ping para 8.8.8.8"

7.2. Script de monitoramento em background

#!/bin/bash
nohup bash -c '
while true; do
    ./diagnostico.sh google.com >> /var/log/rede.log
    sleep 300
done' &

7.3. Funções modulares para reuso

testar_ping() {
    local alvo=$1
    ping -c 3 -q "$alvo" > /dev/null 2>&1
    return $?
}

testar_dns() {
    local dominio=$1
    dig +short "$dominio" > /dev/null 2>&1
    return $?
}

if testar_ping "8.8.8.8" && testar_dns "google.com"; then
    echo "Rede operacional"
fi

Referências