Vamos nos divertir bastante neste artigo, porque veremos como analisar pacotes da rede, não só no Linux, mas conseguiremos facilmente ver dados em redes com servidores Linux, terminais Linux, placas embarcadas com Linux, microcontroladores e até vindo ou indo para computadores ou dispositivos com Windows e afins que usam diversos protocolos, como UDP e TCP por exemplo.
Aqui vamos usar uma ferramenta poderosa chamada TCPdump e ver como é fácil entender o modelo OSI e os pacotes da rede, então, vamos lá.
No decorrer dos tópicos estarei usando três ferramentas, o TCPdump, WireShark e o tshark. O tshark vou usar mais pra frente apenas como alternativa para facilitar criação de filtros, o foco é o tcpdump e Wireshark, com o tcpdump irei capturar os pacotes que desejo e com o Wireshark irei usar para visualizar de uma maneira mais amigável os pacotes capturados e salvos.
Vou começar bem tranquilo para conhecermos a ferramenta, mas a idéia é ir progredindo e analisarmos vários protocolos e serviços além de aplicar em embarcados, nesta série que começa agora.
Preparando o ambiente
Sem mais delongas, um pré-requisito para estes artigos é um computador com Linux, o que estarei usando é um Linux Mint, o nome dos pacotes é o mesmo o que irá muda será o gerenciador de pacotes.
$ sudo apt-get update $ sudo apt-cache search '^tcpdump$|^wireshark$|^tshark$' tcpdump - command-line network traffic analyzer tshark - network traffic analyser - console version wireshark - network traffic analyser - GTK+ version
Instalando:
$ sudo apt-get install tcpdump tshart wireshark
Protocolo ICMP
O ICMP (Internet Control Message Protocol) é o protocolo que estudaremos nesta primeira etapa, pelo nome alguns podem não conhecer, mas tenho certeza que já usaram, sem saber! Usado para diagnostico e relatório de erros em uma rede e seu principal aliado para isso é o comando ping, tanto em Linux quanto em Windows.
O Ping nada mais é que um cara que formata o ICMP mais legível e fornece alguns recursos a mais, e diferente do ICMP que esta na Camada 3 (Rede).
Já deu pra perceber então que vamos executar um ping para algum host e capturar os pacotes.
Vale a pena conhecer e estudar todos os aspectos deste protocolo, aqui o que precisamos saber é o tipo 0 (Echo Reply) e o tipo 8 (Echo Request), onde o tipo 0 é quando obtemos o retorno do pacote e o 8 quando enviamos.
Mais detalhes acesse o RFC792.
Pratica
O meu computador possui o IP 192.168.0.67 o computador para qual irei executar o ping é o IP 192.168.0.6.
Vamos executar o tcpdump para capturar qualquer pacote que tiver o IP 192.168.0.6 envolvido, como destino ou origem.
Sintaxe: tcpdump -i INTERFACE host IP_TARGET
$ sudo tcpdump -i wlan0 host 192.168.0.6 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on wlan0, link-type EN10MB (Ethernet), capture size 65535 bytes 15:15:08.185127 IP 192.168.0.67 > 192.168.0.6: ICMP echo request, id 3874, seq 1, length 64 15:15:08.188596 IP 192.168.0.6 > 192.168.0.67: ICMP echo reply, id 3874, seq 1, length 64 15:15:09.186897 IP 192.168.0.67 > 192.168.0.6: ICMP echo request, id 3874, seq 2, length 64 15:15:09.190384 IP 192.168.0.6 > 192.168.0.67: ICMP echo reply, id 3874, seq 2, length 64 ^C 4 packets captured 4 packets received by filter 0 packets dropped by kernel
Foi fácil saber que minha interface de rede é a wireless (wlan0) e o IP é o 192.168.0.6 conforme comentei, certo?
A tela acima irá ficar parada, só após executar o comando ping é que os pacotes irão aparecer como acima, após isso pode pressionar Ctrl+C para sair, mas como queremos salvar os pacotes em um arquivo para poder analisar no Wireshark, então vamos executar a mesma linha com a flag -w, podemos adicionar -vv para um modo mais detalhad (verbose).
$ sudo tcpdump -vv -i wlan0 host 192.168.0.6 -w /tmp/salvando_pacotes_ping.pcap tcpdump: listening on wlan0, link-type EN10MB (Ethernet), capture size 65535 bytes Got 4 ^C 4 packets captured 4 packets received by filter 0 packets dropped by kernel
E agora vamos executar o ping para o IP 192.168.0.6, enviar apenas 2 pacotes e pressionar Ctrl+C para finalizar a captura.
$ ping -c 2 192.168.0.6 PING 192.168.0.6 (192.168.0.6) 56(84) bytes of data. 64 bytes from 192.168.0.6: icmp_seq=1 ttl=64 time=3.57 ms 64 bytes from 192.168.0.6: icmp_seq=2 ttl=64 time=3.68 ms --- 192.168.0.6 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1001ms rtt min/avg/max/mdev = 3.574/4.283/4.993/0.712 ms
Desta maneira, qualquer pacote indo/vindo do IP 192.168.0.6 seria capturado pelo tcpdump e salvo no arquivo /tmp/savando_pacotes_ping.pcap, mas como não tem nada nesta VM, só irá capturar o pacote ICMP, quando o Target possui vários serviços e requisições criamos filtros para conseguir capturar e realizar analises, não se preocupe iremos fazer isso em um post futuro.
Analisando com Wireshark
Como dito, para facilitar a didática irei usar o Wireshark para visualizar os pacotes capturados, abra o Wireshark pelo terminal digitando wireshark ou abrindo o aplicativo Wireshark. Em seguida, vá em File > Open e selecione o arquivo /tmp/salvando_pacotes_ping.pcap, e ficara como a Figura01.
Vamos visualizar a Figura02 e ver o que podemos extrair de informação.
No quadro laranja da Figura02, temos os pacotes capturados e suas devidas informações como Sequencia, Tempo, IP origem, IP destino, Protocolo, Tamanho e informações adicionais. Então o comando ping partiu de 192.168.0.67 para o 192.168.0.6, foi um ICMP e do tipo Request, a volta foi do IP 192.168.0.6 para o 192.168.0.67 e do tipo Reply.
No quadro abaixo, tem as informações do frame completo, que possui 98 bytes e vamos ver como chegou a esse numero, e informações da Camada 2 (L2) [Ethernet II], e logo em seguida na Camada 3 ficando o IPv4 e o ICMP (L3).
E por ultimo, no quadro seguinte o frame inteiro, com todos os “dados” do pacote contendo todos os cabeçalhos (Ethernet Header, IP Header e ICMP Header) e os Payloads.
Desmontando o pacote
Com alguns quadros e dados que obtivemos vou montar todo o pacote e explicar cada campo e etapa, vamos ver como seria o frame como um todo, na Figura03.
Vamos começar pela Camada 2 (L2) ou também conhecida como camada de enlace, o seu cabeçalho é pequeno com apenas 14 bytes, chamada de Ethernet II Header, vamos ver o que tem nele.
Na Figura04, expandi a informação do item Ethernet II e deixei selecionado o que ele representa no frame, podemos ver que o Ethernet Header deve possuir o endereço MAC do destinatário[6 bytes], endereço MAC da origem[6 bytes] e um tipo, este tipo (EtherType [2 bytes]) é o que diz se é IPv4, ARP, IPv6, VLan e outros demais tipos que podem ser verificados na Standards IEEE EtherType.
Então, ficaria conforme a Figura05.
Legal, vamos prosseguir, agora vamos para a próxima camada, subir para a Camada 3 (L3) ou a camada de rede, vamos novamente expandir o pacote no Wireshark como podemos ver na Figura06.
Vamos ver como fica organizado o IP Header e o Payload neste caso.
Então no frame IP temos 20 bytes de cabeçalho (Header) e 46 a 1500 bytes de Payload, vamos dar um overview no IP Header, conforme a Figura08.
O IP Header possui 20 bytes, estes campos possuem informações importantes, abaixo cada opção e um resumo breve.
Version | Versão, 4 para IPv4, usa apenas os 4 primeiros bits |
Header Lenght | IHL (Internet Header Length), o tamanho do header = [5] x 32 = 20 bytes |
DSF | Tambem chamada de ToS, para classificar a prioridade do trafego do pacote |
Total Length | Tamanho total IP Header + Payload |
Identification | Identificar fragmentos RFC6864 |
Flags | Identificar e controlar framentos |
Fragments | Pode determinar o local do fragmento do pacote IP |
TTL | Time To Live, ou o tempo de vida do pacote |
Protocol | Tipo do protocolo (ICMP, TCP, UDP e outros mais) |
Checksum | Checksum do frame IP |
Source IP | IP de origem do pacote |
Destination IP | IP de destino do pacote |
Para mais detalhes veja a definição do IP Packet no Wikipédia, uma fonte para obter o número dos tipos de protocolos IP é o IANA Protocol Numbers.
O que fiz então foi pegar as informações do cabeçalho IP da Figura06 e preencher nos campos da Figura08. A matemática já começa a fazer sentido, se o Total Length esta dizendo 84 bytes, e nosso IP Header possui 20 bytes, então nosso IP Payload irá possui no total 64 bytes.
Essa era a parte mais complexa, agora vamos ver o IP Payload que ainda fica na Camada 3, mas agora vamos ver o ICMP Header e ICMP Payload.
Na Figura09, temos o Data representando nosso IP Payload da Figura03, e na Figura10 o ICMP Header do Wireshark expandido.
Vamos dar um overview no ICMP Header, suas opções e os campos preenchidos conforme os dados capturados e visualizados na Figura11.
Para facilitar o entendimento, segue os campos e uma pequena descrição na tabela abaixo.
Type | Tipos dos pacotes ICMP, usaremos 0 e 8 |
Code | Codigo para indicar o motivo de perda de um pacote |
Checksum | Checagem do pacote para integridade |
Identifier | Identificação |
Sequence Number | Número sequência dos pacotes |
Timestamp | Timestamp do pacote, este é um campo de 8 bytes (Faltou na Figura11) |
Certo, voltando a nossa matemática, e o que vimos até agora:
Vimos que ele terá 84 bytes.
IP Header possui 20 bytes
ICMP Header possui 16 bytes
Sobram 48 bytes para o ICMP Data.
Vamos verificar o campo Data do ICMP capturado e visualizado no Wireshark na Figura10. Temos os 48 bytes!
Então o quadro final seria da Figura12.
E agora, verifique no comando ping que realizamos no começo do post, olhe na primeira linha após o comando, ele mostra o tamanho do pacote, no caso 84 bytes.
PING 192.168.0.6 (192.168.0.6) 56(84) bytes of data.
Toda matemática faz sentido, 84 bytes do pacote, na Figura02 o Wireshark mostra que o Frame possui 98 bytes, porque esta usando 84 bytes do IP + ICMP + Ethernet II totalizando 98 bytes.
Outro dado que conseguimos com isso são os 64 bytes que o ping mostra em cada linha, que na verdade são os 48 bytes dos dados + 16 bytes do cabeçalho, então na verdade, é soma de ICMP Header + ICMP Data.
64 bytes from 192.168.0.6: icmp_seq=1 ttl=64 time=3.57 ms
Você percebe na linha acima, de onde saíram todas estas informações de tempo, TTL, sequencia, IP e o tamanho.
O post ficou extenso, mas fiz o mais detalhado possível e tenho certeza que muitos não viram algo assim em matérias de redes em universidades e muitas vezes não imaginava que um simples pacote ICMP de um ping possui tudo isso de informação.
E aguardem que mais analises e estudo de protocolo que vem por ae.
Espero que tenham gostado, até a próxima!
Referências
https://www.wireshark.org/docs/man-pages/tshark.html
https://pt.wikipedia.org/wiki/Internet_Control_Message_Protocol
https://pt.wikipedia.org/wiki/Ping
https://en.wikipedia.org/wiki/IPv4
http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml
https://tools.ietf.org/html/rfc792
Linux – Conhecendo e usando tcpdump e wireshark by Cleiton Bueno is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.