Como usar netstat e ss para diagnosticar conexões de rede ativas

1. Introdução às ferramentas de diagnóstico de rede

O diagnóstico de conexões de rede é uma habilidade essencial para administradores de sistemas, desenvolvedores e profissionais de segurança. Duas ferramentas clássicas — netstat e ss — permitem inspecionar conexões ativas, portas abertas e processos associados.

O netstat (network statistics) existe desde os primórdios do Unix e está disponível na maioria das distribuições Linux. Já o ss (socket statistics) foi introduzido como substituto moderno, parte do pacote iproute2, sendo significativamente mais rápido em sistemas com muitas conexões.

Quando usar cada ferramenta? Em sistemas legados, netstat pode ser a única opção disponível. Em servidores modernos com alto volume de conexões (como proxies ou servidores web), ss é preferível por sua performance superior. Ambos fornecem informações semelhantes, mas com sintaxes e saídas ligeiramente diferentes.

Instalação básica:
- netstat: geralmente parte do pacote net-tools (instalar com apt install net-tools ou yum install net-tools)
- ss: já incluso no iproute2 (presente por padrão na maioria das distribuições)

2. Listando conexões ativas com netstat

O comando fundamental para visualizar conexões ativas é:

netstat -tunap

Interpretação dos parâmetros:
- -t: exibe conexões TCP
- -u: exibe conexões UDP
- -n: mostra endereços e portas em formato numérico (evita resolução DNS)
- -a: exibe todas as conexões (incluindo escuta)
- -p: mostra o PID e nome do processo associado

Exemplo prático — identificando portas abertas:

$ netstat -tunap | grep LISTEN
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1234/sshd
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      5678/mysqld
tcp6       0      0 :::80                   :::*                    LISTEN      9012/apache2

Filtros por estado de conexão:

# Apenas conexões estabelecidas
netstat -tunap | grep ESTABLISHED

# Apenas portas em escuta (servidores)
netstat -tunap | grep LISTEN

# Contagem de conexões por estado
netstat -tunap | awk '{print $6}' | sort | uniq -c | sort -rn

3. Analisando conexões com ss (substituto moderno)

O ss oferece comandos equivalentes com sintaxe familiar:

ss -tunap

Vantagens do ss:
- Leitura direta de informações do kernel via /proc/net/tcp e /proc/net/udp
- Muito mais rápido em sistemas com milhares de conexões
- Filtros mais flexíveis e expressivos

Filtros avançados:

# Conexões em estado específico
ss -tunap state established
ss -tunap state time-wait
ss -tunap state listen

# Filtrar por porta específica
ss -tunap sport = :80
ss -tunap dport = :443

# Filtrar por endereço de origem/destino
ss -tunap src 192.168.1.100
ss -tunap dst 10.0.0.0/24

# Expressões regulares para seleção complexa
ss -tunap '( sport = :22 or sport = :80 ) and state established'

4. Diagnosticando problemas comuns de rede

Detectando vazamento de sockets (TIME_WAIT e CLOSE_WAIT):

# Verificar quantidade de conexões TIME_WAIT
ss -tan state time-wait | wc -l

# Identificar processos com muitas conexões CLOSE_WAIT
ss -tanp state close-wait

Um número excessivo de conexões em TIME_WAIT pode indicar que o servidor está criando muitas conexões curtas sem reutilização adequada. Já CLOSE_WAIT sugere que o processo não está fechando conexões corretamente.

Identificando portas em conflito:

# Verificar se uma porta específica está ocupada
ss -tunap | grep :8080

# Caso o serviço não inicie por porta ocupada
netstat -tunap | grep 8080

Monitorando conexões suspeitas:

# Listar conexões para IPs externos não usuais
ss -tunap | grep -v "192.168.\|10\.\|172\.\(1[6-9]\|2[0-9]\|3[01]\)\."

# Identificar conexões com portas de origem altas (possível malware)
ss -tunap state established | awk '$4 ~ /:[0-9]{5}$/'

5. Combinando netstat/ss com outras ferramentas

Uso com grep, awk e sort para sumarizar dados:

# Top 10 IPs com mais conexões estabelecidas
ss -tan state established | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -10

# Total de conexões por serviço
netstat -tunap | grep ESTABLISHED | awk '{print $7}' | cut -d/ -f2 | sort | uniq -c | sort -rn

Monitoramento contínuo com watch:

# Atualizar a cada 2 segundos
watch -n 2 'ss -tan state established | wc -l'

# Monitorar conexões para uma porta específica
watch -n 1 'ss -tan sport = :80'

Script simples para alertar sobre conexões anômalas:

#!/bin/bash
THRESHOLD=100
COUNT=$(ss -tan state established | wc -l)
if [ $COUNT -gt $THRESHOLD ]; then
    echo "ALERTA: $COUNT conexões estabelecidas (limite: $THRESHOLD)"
    echo "Top 10 IPs suspeitos:"
    ss -tan state established | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -10
fi

6. Exemplos práticos de diagnóstico em cenários reais

Verificando se um serviço web está escutando na porta correta:

# Verificar Apache na porta 80
ss -tlnp | grep ':80 '
tcp   LISTEN  0  128  *:80  *:*  users:(("apache2",pid=9012))

# Se não aparecer, verificar se o serviço está rodando
systemctl status apache2

Rastreando conexões de um processo específico (PID):

# Conexões do MySQL (PID 5678)
ss -tunap | grep "pid=5678"
netstat -tunap | grep "5678/"

# Ou usando o nome do processo
ss -tunap | grep "mysqld"

Comparando saídas de netstat e ss para validar resultados:

# netstat
netstat -tan | wc -l

# ss
ss -tan | wc -l

# Os números devem ser próximos. Se houver grande discrepância,
# pode indicar problemas no kernel ou versão desatualizada do netstat.

7. Boas práticas e limitações

Quando usar ss preferencialmente:
- Em servidores com mais de 1000 conexões simultâneas
- Para filtros complexos com expressões regulares
- Em sistemas modernos (kernel 4.x ou superior)

Limitações importantes:
- O netstat está obsoleto em várias distribuições (RHEL 8+, Debian 11+) e pode ser removido
- A saída do ss varia entre versões do iproute2
- Para processos em contêineres, o PID mostrado pode referir-se ao namespace do host

Alternativas modernas para casos específicos:
- lsof -i: útil para listar arquivos abertos de rede por processo
- nethogs: monitora largura de banda por processo
- iftop: monitora tráfego por conexão em tempo real
- tcpdump: captura e analisa pacotes detalhadamente

Referências