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
- ping(8) - Linux man page — Documentação oficial do comando ping, incluindo todas as opções e códigos de saída.
- traceroute(8) - Linux man page — Manual completo do traceroute com exemplos de uso e flags.
- dig(1) - Linux man page — Documentação oficial do dig, incluindo modos de consulta e opções de saída.
- nslookup(1) - Linux man page — Manual do nslookup com modos interativo e batch.
- Advanced Bash-Scripting Guide: Network Programming — Guia avançado de scripts de rede em Bash, incluindo exemplos práticos com ping, traceroute e DNS.
- Bash Network Diagnostic Scripts - DigitalOcean — Tutorial prático da DigitalOcean sobre diagnóstico de rede com ferramentas de linha de comando.