tcpdump: Capturando e Analisando pacotes do servidor

Compartilhe:

tcpdump capturando trafego de outros hosts a partir de um servidor linux

tcpdump é uma ferramenta de linha de comando excelente para investigar problemas de conectividade entre servidores, principalmente aqueles que não possuem interface gráfica.

Ao capturar pacotes em tempo real para análise é possível depurar falhas de comunicação e até mesmo validar regras de firewall.

Neste artigo, você aprenderá o que é o tcpdump, como capturar trafego com exemplos práticos e os principais parâmetros para auxiliar no filtro de pacotes.

O que é tcpdump ?

O tcpdump é um programa usado na interface de linha de comando para capturar e analisar pacotes que trafegam pelas interfaces de rede.

Ele utiliza a biblioteca libpcap para realizar a captura e consegue trabalhar com protocolos como TCP, UDP, ICMP, IPv4 e IPv6.

Por padrão, o comando tcpdump não vêm instalado na maioria das distribuições linux, mas ele está presente nos repositórios de grande parte das distribuições.

Para instala-lo no ubuntu, debian e distros derivadas, execute os seguintes comandos:

Em sistemas RHEL, incluindo AlmaLinux, Rocky Linux e Fedora instale com o seguinte comando:

Como usar o comando tcpdump ?

Para usar o comando tcpdump no linux é necessário primeiro aprender sua sintaxe básica que é:

Explicação:

tcpdump – comando que captura o trafego e exibe na tela em tempo real ou salva em um arquivo.

opções – São argumentos que modificam o comportamento do tcpdump.

filtro – O filtro determina quais pacotes serão selecionados para captura.

Para facilitar o aprendizado, abaixo tem uma lista com as opções mais comuns do tcpdump:

OpçãoDescriçãoExemplos de Uso
-DLista as interfaces disponíveis para captura de trafego.tcpdump -D
-iDefine a placa de rede onde será capturado os pacotes.tcpdump -i eth0 port 80
-cDefine a quantidade de pacotes interceptados.tcpdump -i any -c 20
-vvModo verbose com mais detalhes.tcpdump -vv -i eth1
-wSalva o trafego capturado em um arquivo.tcpdump -w traff.pcap

Para aprender mair a seguir será abordado alguns exemplos práticos de uso do comando tcpdump.

Primeira captura de pacotes com tcpdump

Para capturar o trafego com o comando tcpdump basta executa-lo sem opções, quando nenhuma opção é passada é selecionado uma placa de rede automaticamente para captura dos pacotes.

Para interromper o comando utilize a combinação de teclasCtrl+C”. A imagem acima mostra uma parte da captura de trafego feita. Os campos podem variar dependendo do tipo de pacote enviado.

O primeiro campo é o carimbo de data/hora do pacote recebido, de acordo com o relógio local do sistema, na imagem o primeiro pacote tem o horário “23:47:39.234188”.

Em seguida “IP” representa o protocolo da camada de rede, neste caso, IPv4. Para pacotes IPv6 o valor é IP6.

O próximo campo é o endereço IP de origem e a porta (192.168.213.228.ssh). O nome da porta, no caso “ssh” é obtido pela resolução feita no arquivo “/etc/services” do linux.

Em seguida, vem o endereço IP de destino e a porta, representados por “192.168.213.3.34714”.

Após a origem e o destino, caso seja um pacote do protocolo TCP você encontrará Flags entre colchetes, os valores típicos para este campo incluem:

ValorTipo de FlagDescrição
.ACK (Acknowledgment)O caractere “.ponto representa um pacote TCP com ACK, sendo usado para confirmar o recebimento de dados ou de pacotes de controle.
SSYN (Synchronize)Inicia uma conexão TCP. É usada durante o estabelecimento da conexão, sendo normalmente o primeiro pacote enviado no three-way handshake.
PPUSHSolicita que os dados recebidos sejam entregues à aplicação.
FFIN (Finish)Solicita o encerramento da conexão TCP. Cada lado da conexão pode enviar seu próprio FIN quando não tiver mais dados para transmitir.
RRST (Reset)Reinicia ou rejeita uma conexão TCP. Pode aparecer quando uma conexão é recusada, quando um segmento chega para uma porta que não está aceitando conexões.

Visualizar pacotes em uma placa de rede específica

No ambiente de produção, um servidor pode conter múltiplas placas de rede virtuais ou físicas. Para analisar o que passa por uma interface de rede específica, primeiro liste todas as placas que o tcpdump pode utilizar:

Os nomes das placas de rede ilustradas na imagem é “enp0s3”, “enp0s8”, “lo” e também tem a “any” que é utilizado para capturar os pacotes em todas as interfaces de rede.

O uso do parâmetro “-i” permite direcionar a análise exatamente para a interface por onde o tráfego de interesse trafega. Por exemplo, para analisar somente o trafego que passa por “enp0s3” o comando é:

Utilize este comando em rotinas de diagnóstico para validar se a placa correta está de fato recebendo pacotes que devem passar por ela.

Filtrar o tráfego por um endereço IP de origem ou destino

Ao investigar falhas na comunicação, você também pode restringir a captura de pacotes enviados por determinado endereço de origem usando a expressão “src” seguido do IP:

No exemplo acima, somente os pacotes cujo endereço de origem seja “122.200.201.2” serão apresentados. A opção “-n” é utilizada para não resolver nomes DNS em IPs e também não converte números de portas para nomes de serviços.

Para analisar o trafego do endereço IP de destino específico, por exemplo “122.200.201.1” utilize a expressão “dst”.

Para filtrar a comunicação feita por um IP específico, tanto para origem quanto para o destino use a expressão “host” do comando tcpdump.

Esse filtro é ideal quando você precisa isolar a comunicação entre a sua aplicação e um host específico.

Monitorar requisições em uma porta especifica

Quando um cliente não tem resposta de um serviço presente em um servidor, interceptar o tráfego direcionado à porta do serviço permite checar se os pacotes chegam ao destino.

Por exemplo, para filtrar o trafego da porta “53” (origem ou destino) execute o comando:

A expressão “port” indica qual porta o comando tcpdump interceptará os pacotes enviados ou recebidos.

Capturar uma quantidade limitada de pacotes

Durante um diagnóstico, deixar o tcpdump executando indefinidamente pode gerar uma quantidade enorme de informações.

A opção “-c” faz a captura terminar automaticamente depois da quantidade especificada, por exemplo para interceptar somente 10 pacotes o comando é:

Isso é útil quando você precisa coletar uma amostra rápida do tráfego para identificar problemas em servidores de produção sem manter uma captura aberta por muito tempo.

Salvar a captura em um arquivo PCAP para análise posterior

Nem sempre é possível fazer uma boa análise em tempo real na linha de comando, mas o comando tcpdump pode salvar os dados brutos em um arquivo no formato PCAP.

Para salvar a captura do trafego utilize a opção “-w” seguido do nome do arquivo, veja o exemplo:

Essa abordagem é muito útil para coletar evidências durante um incidente e realizar uma análise mais profunda posteriormente usando o wireshark ou o próprio tcpdump.

Ler e analisar um arquivo no formato PCAP

Após gerar um arquivo de diagnóstico com o parâmetro de gravação, você pode ler esse arquivo diretamente no terminal linux aplicando filtros adicionais conforme a necessidade.

A opção “-r” do comando tcpdump serve para informar o nome do arquivo, e no exemplo é feito um filtro pela porta 25.

Você pode utilizar esse comando para filtrar rapidamente dados salvos em servidores remotos sem a necessidade de baixar arquivos pesados.

Filtrar pacotes com base no protocolo

Quando existe dificuldade para se conectar a internet é possível isolar protocolos como ICMP (ping), TCP ou UDP para tentar descobrir a causa do problema, basta incluir ao fim do nome o protocolo.

No exemplo, anterior é filtrado toda conexão do protocolo UDP que passa por “enp0s8”, o comando do exemplo pode ser útil quando o administrador do servidor precisar verificar se está realmente enviando ou recebendo pacotes UDP (EX: DNS, NTP).

Combinar múltiplos critérios com operadores lógicos

É possível utilizar operadores lógicos “and” e “or” para criar filtros mais avançados. Por exemplo, para visualizar no terminal somente conexões HTTP na porta 80 e (and lógico) originadas do IP “122.200.201.2” da interface de rede “enp0s8”:

Você pode combinar com operador “or” lógico, por exemplo, exibir o trafego que tenha como origem ou destino o IP “122.200.201.2” e que sejam para a porta “25ou (or) a porta “80”.

Outro exemplo, incluir uma negação com a expressão “not” ou “!”, para mostrar todo o trafego com exceção, veja o exemplo:

Neste caso, está sendo interceptado os pacotes pela placa de rede “enp0s8” do IP “122.200.201.1” (origem ou destino), com exceção (not) do trafego na porta 22 (SSH).

Conclusão

Pela minha experiência o tcpdump é uma ferramenta bem útil para diagnosticar problemas de rede de forma ágil diretamente pelo terminal.

Recomendo sempre utilizar filtros refinados como portas e IPs para evitar um volume excessivo de dados capturados. Para se aprofundar, consulte a documentação oficial do tcpdump.

Ficou com alguma dúvida sobre o uso o comando tcpdump ou tem alguma sugestão ? Deixe seu comentário abaixo, pois sua partição é importante!

Perguntas frequentes (FAQ) sobre o comando tcpdump

Preciso de acesso como root para executar o tcpdump ?

Sim, a captura de pacotes exige privilégios de superusuário (ou utilizando o comando sudo) porque acessa diretamente as interfaces de rede do sistema.

Como interromper a captura do tcpdump no terminal ?

Você pode parar a execução a qualquer momento pressionando o atalho
Ctrl+C no terminal.

Qual a diferença entre o tcpdump e o Wireshark ?

O tcpdump é leve, focado em linha de comando e ideal para servidores sem interface gráfica. O Wireshark possui interface gráfica detalhada e é mais intuitivo.

É possível capturar pacotes em uma porta e salvar ao mesmo tempo ?

Sim, basta combinar os parâmetros de filtro com a opção de gravação, como:
tcpdump port 80 -w arquivo.pcap

Qual a diferença entre as opções “-n” e “-nn” do tcpdump ?

Nas versões atuais (posteriores a 4.4.0) do tcpdump ambas opções fazem a mesma coisa: não resolve endereços IPs em nomes e não resolve nomes de serviços em portas.

Mas em versões mais antigas, havia distinção, a opção “-n” impedia a resolução dos endereços IP para nomes. Já “-nn” fazia o que a opção “-n” faz e também impedia a resolução dos números das portas para nomes de serviços.

Navegue por tópicos:

Foto de Edson Oliveira
Edson Oliveira

Especialista em Linux, trabalhando com TI tem experiência no gerenciamento, solução de problemas e suporte de servidores linux em ambientes corporativos.

Professor de cursos voltados a linux, tecnologias open source e certificações LPI. Possui as certificações LPIC-1, LPIC-2 e LPIC-3 (Mixed Environment).

Navegue por tópicos:

Você também pode gostar:

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Valorizamos sua privacidade

Utilizamos cookies para aprimorar sua experiência de navegação, exibir anúncios ou conteúdo personalizado e analisar nosso tráfego. Ao clicar no botão “Aceitar todos”, você concorda com nosso uso de cookies.

Para mais informações leia nossa Política de Privacidade.