Analisar Quadros Ethernet com tcpdump no Linux

CompTIABeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá os fundamentos da análise de tráfego de rede em um sistema Linux usando a poderosa ferramenta de linha de comando tcpdump. O objetivo principal é capturar e inspecionar quadros Ethernet na camada de enlace de dados, proporcionando experiência prática sobre como os dados são estruturados para transmissão em uma rede local. Você adquirirá habilidades práticas na identificação e interpretação de comunicações de rede de baixo nível.

Você começará preparando seu ambiente, o que inclui a instalação do tcpdump e a identificação da sua interface de rede ativa. Em seguida, você iniciará uma captura de pacotes ao vivo para monitorar a atividade da rede em tempo real. Para entender diferentes padrões de comunicação, você gerará tráfego unicast usando o comando ping e tráfego broadcast via ARP. Ao examinar a saída capturada, você aprenderá a analisar cabeçalhos de quadros Ethernet e a distinguir entre endereços MAC unicast e broadcast.

Este é um Lab Guiado, que fornece instruções passo a passo para ajudá-lo a aprender e praticar. Siga as instruções cuidadosamente para completar cada etapa e ganhar experiência prática. Dados históricos mostram que este é um laboratório de nível iniciante com uma taxa de conclusão de 98%. Recebeu uma taxa de avaliações positivas de 100% dos estudantes.

Instalar tcpdump e Identificar Sua Interface de Rede

Nesta etapa, você preparará seu ambiente para análise de rede. Isso envolve duas ações principais: instalar o tcpdump, um poderoso farejador de pacotes de linha de comando, e identificar o nome da sua interface de rede principal. Um farejador de pacotes permite que você "veja" os dados que trafegam pela rede, e o tcpdump precisa saber qual conexão de rede específica monitorar.

Primeiro, vamos garantir que o tcpdump esteja instalado. Embora seja uma ferramenta padrão, é uma boa prática confirmar sua presença. Usaremos o gerenciador de pacotes apt. O comando sudo apt update sincroniza sua lista de pacotes com os repositórios de software, e sudo apt install tcpdump -y instala a ferramenta, com o -y confirmando automaticamente a instalação.

Execute os seguintes comandos no seu terminal:

sudo apt update
sudo apt install tcpdump -y

Após a conclusão da instalação, você pode verificá-la verificando a versão do tcpdump.

tcpdump --version

Você deverá ver uma saída semelhante a esta, confirmando que a ferramenta está pronta para uso. Os números de versão podem variar.

tcpdump version 4.99.x
libpcap version 1.10.x
OpenSSL 3.0.x [Date]

Em seguida, você precisa encontrar o nome da interface de rede que estará monitorando. Um computador pode ter várias interfaces (por exemplo, para Ethernet com fio, Wi-Fi ou redes virtuais). Usaremos o comando ip addr para listar todas as interfaces de rede disponíveis e suas configurações.

Execute este comando:

ip addr

A saída listará várias interfaces. Você está procurando sua interface ativa principal. Frequentemente, ela é nomeada como eth0 ou enp0s3. Procure por uma entrada que tenha um endereço inet (seu endereço IP) e esteja no estado UP.

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:16:3e:01:be:b3 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname ens5
    inet 172.16.50.8/24 metric 100 brd 172.16.50.255 scope global dynamic eth0
       valid_lft 1892159786sec preferred_lft 1892159786sec
    inet6 fe80::216:3eff:fe01:beb3/64 scope link
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:8a:88:cd:da brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

Do exemplo de saída acima, o nome da interface é eth0. Anote o nome da sua interface específica, pois você precisará dele na próxima etapa.

Iniciar uma Captura Ampla e Observar o Tráfego

Nesta etapa, você começará a capturar tráfego de rede ao vivo. A unidade fundamental de dados na Camada de Enlace de Dados (Camada 2) é o quadro Ethernet. Cada quadro atua como um envelope digital, contendo não apenas os dados que estão sendo enviados, mas também informações cruciais de endereçamento, como os endereços MAC de origem e destino. Usaremos o tcpdump com a opção -e para visualizar especificamente esses detalhes da Camada 2. Esta captura inicial será sem filtros para lhe dar uma noção de toda a atividade em sua rede.

Agora, vamos iniciar o processo de captura. Você precisará do nome da interface que identificou na etapa anterior (por exemplo, eth0). Capturar pacotes de rede requer privilégios administrativos, e é por isso que usamos sudo. Também adicionaremos o sinalizador -n para impedir que o tcpdump resolva endereços IP para nomes de host, e -q para tornar a saída mais limpa.

No seu terminal, execute o comando tcpdump. Lembre-se de substituir eth0 pelo nome real da sua interface.

## Substitua eth0 pelo nome real da sua interface da Etapa 1
sudo tcpdump -i eth0 -e -n -q

Vamos detalhar este comando:

  • sudo: Executa o comando com privilégios de superusuário, que são necessários para acessar interfaces de rede desta forma.
  • tcpdump: A própria ferramenta de captura de pacotes.
  • -i eth0: O sinalizador -i especifica a interface de rede a ser escutada.
  • -e: Esta opção é crucial para o nosso laboratório. Ela instrui o tcpdump a imprimir o cabeçalho de nível de enlace (Ethernet) para cada pacote, que inclui os endereços MAC de origem e destino.
  • -n: Impede a resolução de nomes de host, exibindo endereços IP brutos.
  • -q: Modo "quiet" (silencioso), que reduz a quantidade de saída específica do protocolo.

Após executar o comando, o tcpdump começará a escutar. Você verá uma mensagem inicial e, em seguida, seu terminal começará a exibir quaisquer pacotes que ele capturar. Dependendo da sua rede, você poderá ver muito tráfego que não é relevante para o que queremos fazer. Isso pode incluir requisições ARP, serviços em segundo plano, etc.

tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
10:24:00.123456 ARP, Request who-has 172.16.50.1 tell 172.16.50.254, length 28
10:24:01.567890 IP6 fe80::... > ff02::...: ICMP6, router advertisement, length 80

Deixe isso rodar por alguns segundos para observar a atividade, depois pare a captura pressionando Ctrl+C. Isso demonstra o desafio de encontrar informações específicas em um ambiente movimentado.

Refinar a Captura com um Filtro ICMP

Como você viu na última etapa, uma captura sem filtro pode ser barulhenta. Para focar no tráfego específico que queremos analisar, podemos usar um filtro de captura. Como usaremos o comando ping, que utiliza o protocolo ICMP, diremos ao tcpdump para capturar apenas pacotes ICMP. Também adicionaremos o sinalizador -n para impedir que o tcpdump resolva endereços IP para nomes de host e -q para tornar a saída mais limpa. Isso torna a saída muito mais fácil de analisar.

Agora, inicie o tcpdump novamente, mas desta vez adicione o filtro icmp e os novos sinalizadores.

## Substitua eth0 pelo nome real da sua interface da Etapa 1
sudo tcpdump -i eth0 -e -n -q 'icmp'

A parte 'icmp' do comando é o filtro. Ela instrui o tcpdump a ignorar todos os pacotes, exceto aqueles que usam o protocolo ICMP.

Após executar este comando, o tcpdump estará escutando novamente, mas o terminal agora deve estar silencioso, pois está esperando especificamente por tráfego ICMP.

tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes

Importante: Deixe este terminal rodando! O tcpdump precisa permanecer ativo para capturar o tráfego que geraremos na próxima etapa. Você precisará abrir uma nova aba ou janela de terminal para os comandos subsequentes. Você pode fazer isso clicando no ícone + no painel do terminal.

Gerar Tráfego Unicast com 'ping' e Analisar Cabeçalhos de Frame

Nesta etapa, você gerará e observará tráfego unicast. Unicast é um método de comunicação um-para-um onde um quadro é enviado de uma única origem para um único destino na rede. Para fazer isso, você usará a utilidade comum ping, que envia pacotes ICMP (Internet Control Message Protocol) para um host de destino para verificar a conectividade. Esses pacotes são encapsulados em quadros Ethernet para transmissão.

Com o tcpdump (com o filtro icmp) ainda rodando no seu primeiro terminal, você precisa gerar alguma atividade de rede.

Abra um novo terminal clicando no ícone + no painel do terminal. Neste novo terminal, use o comando ping para enviar alguns pacotes para google.com. Usaremos a opção -c 4 para enviar exatamente quatro pacotes automaticamente e depois parar.

ping -c 4 google.com

Você verá uma saída no seu segundo terminal semelhante a esta, mostrando as respostas do servidor do Google:

PING google.com (142.250.191.174) 56(84) bytes of data.
64 bytes from fra16s51-in-f14.1e100.net (142.250.191.174): icmp_seq=1 ttl=115 time=1.58 ms
64 bytes from fra16s51-in-f14.1e100.net (142.250.191.174): icmp_seq=2 ttl=115 time=1.55 ms
64 bytes from fra16s51-in-f14.1e100.net (142.250.191.174): icmp_seq=3 ttl=115 time=1.62 ms
64 bytes from fra16s51-in-f14.1e100.net (142.250.191.174): icmp_seq=4 ttl=115 time=1.51 ms

--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 1.510/1.565/1.621/0.040 ms

Agora, volte para o seu primeiro terminal onde o tcpdump está rodando. Você verá várias novas linhas de saída que foram capturadas enquanto você estava pingando.

Vamos analisar um dos pacotes de "echo request" de saída. Ele se parecerá com algo assim (os endereços MAC e IP serão diferentes no seu sistema):

10:25:01.123456 00:16:3e:01:be:b3 > de:ad:be:ef:00:01, ethertype IPv4 (0x0800), length 98: 172.16.50.8 > 142.250.191.174: ICMP echo request, id 123, seq 1, length 64

Aqui está o que esta linha significa:

  • 10:25:01.123456: O timestamp de quando o quadro foi capturado.
  • 00:16:3e:01:be:b3: O endereço MAC de origem (o MAC da sua VM).
  • >: Um separador indicando a direção do tráfego (da origem para o destino).
  • de:ad:be:ef:00:01: O endereço MAC de destino. Note que este é provavelmente o gateway (roteador) da sua rede local, não o servidor do Google. Sua VM envia o quadro para o gateway, que então o encaminha para a internet.
  • ethertype IPv4: Este campo indica que a carga útil de dados do quadro Ethernet é um pacote IPv4.
  • 172.16.50.8 > 142.250.191.174: Esta é a informação da Camada 3 (IP), mostrando os endereços IP de origem e destino.
  • ICMP echo request: Isso identifica o pacote como parte de uma requisição ping.

Você também verá os quadros correspondentes de "echo reply" retornando. Observe como os endereços MAC de origem e destino são trocados.

Finalmente, volte para o terminal do tcpdump e pressione Ctrl+C para parar a captura.

Gerar Tráfego de Broadcast via ARP e Identificar o Endereço MAC de Broadcast

Nesta etapa, você contrastará o tráfego unicast com o tráfego de broadcast. Enquanto unicast é uma mensagem um-para-um, broadcast é uma mensagem um-para-todos enviada a todos os dispositivos no segmento de rede local. Um exemplo principal disso é o Address Resolution Protocol (ARP), que é usado para descobrir o endereço MAC associado a um endereço IP específico. Para fazer isso, um dispositivo envia um quadro de broadcast perguntando: "Quem tem este endereço IP?"

Primeiro, vamos iniciar uma nova captura tcpdump. Desta vez, adicionaremos um filtro para mostrar apenas pacotes ARP. Também usaremos o sinalizador -n para impedir que o tcpdump resolva endereços IP para nomes de host, e -q para tornar a saída mais limpa.

Em um terminal, execute o seguinte comando, lembrando-se de substituir eth0 pelo nome da sua interface da Etapa 1.

## Substitua eth0 pelo nome real da sua interface
sudo tcpdump -i eth0 -e -n -q 'arp'

O tcpdump está agora escutando, mas apenas por tráfego ARP.

Em seguida, precisamos acionar uma requisição ARP. Uma maneira confiável de fazer isso é limpar o cache ARP do seu sistema e, em seguida, tentar contatar outro dispositivo na rede local, como o seu roteador gateway. Limpar o cache força seu sistema a redescobrir o endereço MAC do gateway usando ARP.

Abra um novo terminal. Primeiro, encontre o endereço IP do seu gateway com o comando ip route.

ip route | grep default

A saída mostrará sua rota padrão, e o endereço IP listado após "via" é o seu gateway.

default via 172.16.50.1 dev eth0

Nota: O endereço IP do seu gateway provavelmente será diferente. É crucial usar o endereço IP deste comando nas etapas abaixo. Um erro comum é usar um IP diferente como 172.17.0.1, que é frequentemente o gateway para uma rede Docker local e não produzirá o resultado correto para este exercício.

Neste exemplo, o gateway é 172.16.50.1. Agora, limpe seu cache ARP usando o comando ip neigh flush. Isso removerá os mapeamentos de endereço MAC conhecidos, forçando seu sistema a usar ARP para encontrá-los novamente.

sudo ip -s -s neigh flush dev eth0

Você pode ver uma saída confirmando que as entradas foram excluídas. Finalmente, ping o gateway apenas uma vez para acionar a consulta ARP.

## Substitua 172.16.50.1 pelo seu IP de gateway real
ping -c 1 172.16.50.1

Agora, volte para o seu primeiro terminal onde o tcpdump está rodando. Você verá o tráfego ARP que foi gerado. Procure pela linha "Request":

10:30:01.123456 00:16:3e:01:be:b3 > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: ARP, Request who-has 172.16.50.1 tell 172.16.50.8, length 28

Vamos analisar este quadro de broadcast:

  • 00:16:3e:01:be:b3: O endereço MAC de origem (sua VM).
  • ff:ff:ff:ff:ff:ff: Este é o endereço MAC de broadcast especial. Quando um switch vê um quadro com este endereço de destino, ele o encaminha para todas as suas portas para todos os dispositivos conectados.
  • ethertype ARP: Isso indica que a carga útil do quadro é um pacote ARP.
  • ARP, Request who-has 172.16.50.1 tell 172.16.50.8: Esta é a própria mensagem ARP, uma pergunta de broadcast para toda a rede solicitando o endereço MAC de 172.16.50.1.

Você também verá o pacote "Reply", que é um quadro unicast enviado diretamente de volta do gateway para o endereço MAC da sua VM.

Você pode agora parar a captura do tcpdump pressionando Ctrl+C no seu terminal.

Resumo

Neste laboratório, você aprendeu o processo fundamental de análise de quadros Ethernet usando tcpdump em um ambiente Linux. Você começou preparando seu sistema, o que envolveu a instalação da utilidade tcpdump com o gerenciador de pacotes apt e a identificação da sua interface de rede principal usando o comando ip addr. Em seguida, você aprendeu como iniciar uma captura de pacotes, primeiro executando uma captura não filtrada para observar todo o tráfego de rede e apreciar a necessidade de filtragem. Após parar a captura inicial, você aprendeu a aplicar um filtro icmp com sudo tcpdump -i eth0 -e -n -q 'icmp' para focar especificamente no tráfego que você desejava analisar.

O laboratório então o guiou pela geração e análise de dois tipos principais de tráfego de rede. Você usou o comando ping para criar tráfego unicast e examinou a saída filtrada do tcpdump para identificar os endereços MAC de origem e destino específicos nos cabeçalhos dos quadros Ethernet. Subsequentemente, você gerou tráfego de broadcast iniciando uma requisição ARP com uma captura separada e filtrada por arp, e aprendeu a reconhecer o distinto endereço MAC de broadcast, ff:ff:ff:ff:ff:ff, que significa um quadro destinado a todos os dispositivos no segmento de rede local.