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.
IMPORTANTE
Para executar todos os comandos do artigo é necessário ter privilégio administrativo, ou seja, você deve usar o usuário root ou o comando sudo.
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:
apt update
apt install tcpdump -yEm sistemas RHEL, incluindo AlmaLinux, Rocky Linux e Fedora instale com o seguinte comando:
dnf install tcpdump -yComo usar o comando tcpdump ?
Para usar o comando tcpdump no linux é necessário primeiro aprender sua sintaxe básica que é:
tcpdump [opções] [filtro]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ção | Descrição | Exemplos de Uso |
|---|---|---|
| -D | Lista as interfaces disponíveis para captura de trafego. | tcpdump -D |
| -i | Define a placa de rede onde será capturado os pacotes. | tcpdump -i eth0 port 80 |
| -c | Define a quantidade de pacotes interceptados. | tcpdump -i any -c 20 |
| -vv | Modo verbose com mais detalhes. | tcpdump -vv -i eth1 |
| -w | Salva 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.
tcpdump
Para interromper o comando utilize a combinação de teclas “Ctrl+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:
| Valor | Tipo de Flag | Descriçã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. |
| S | SYN (Synchronize) | Inicia uma conexão TCP. É usada durante o estabelecimento da conexão, sendo normalmente o primeiro pacote enviado no three-way handshake. |
| P | PUSH | Solicita que os dados recebidos sejam entregues à aplicação. |
| F | FIN (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. |
| R | RST (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:
tcpdump -D
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 é:
tcpdump -i enp0s3Utilize 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:
tcpdump -i enp0s8 -n src 122.200.201.2
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”.
tcpdump -i enp0s8 dst 122.200.201.1Para 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.
tcpdump -i enp0s8 host 122.200.201.2
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:
tcpdump -i any -n port 53
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 é:
tcpdump -i enp0s3 -c 10 -nn
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:
tcpdump -i enp0s8 -c 100 -w analise.pcapEssa 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.
tcpdump -r analise.pcap -n port 25
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.
tcpdump -i enp0s8 udp
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”:
tcpdump -i enp0s8 "src 122.200.201.2 and port 80"
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 “25” ou (or) a porta “80”.
tcpdump -i any "host 122.200.201.2 and port 25 or port 80"Outro exemplo, incluir uma negação com a expressão “not” ou “!”, para mostrar todo o trafego com exceção, veja o exemplo:
tcpdump -i enp0s8 "host 122.200.201.1 and not port 22"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.

