A execução de capturas de pacotes usando um sniffer pode ser um método extremamente poderoso para diagnosticar problemas complexos. Quando tudo o mais falha, muitas vezes é útil visualizar os dados brutos sendo enviados pela rede. Os pacotes não mentem, e analisar o tráfego de seu aplicativo em um nível baixo pode revelar sintomas mais profundos de um problema (ou revelar um problema que você nem sabia que existia).
Neste artigo, nós cobriremos alguns fundamentos do uso da ferramenta tcpdump
baseada em CLI.
Noções básicas do sniffer
Então, primeiro coisas primeiro: o que queremos dizer quando dizemos “farejador de pacotes?” Um farejador de pacotes é simplesmente um software que permite capturar pacotes em sua rede. Tcpdump e Wireshark são exemplos de farejadores de pacotes. O Tcpdump fornece um farejador de pacotes CLI e o Wireshark oferece uma GUI rica em recursos para farejar e analisar pacotes.
Por padrão, tcpdump
opera em modo promíscuo. Isso significa simplesmente que todos os pacotes que chegarem a um host serão enviados para tcpdump
para inspeção. Essa configuração inclui até mesmo o tráfego que não foi destinado ao host específico no qual você está capturando, como tráfego de broadcast e multicast. Claro, tcpdump
não é uma peça mágica de software: ele só pode capturar aqueles pacotes que de alguma forma alcançam uma das interfaces físicas de sua máquina.
Instalando tcpdump
é simples. Ele está disponível nos repositórios de pacotes padrão em seu sistema Red Hat e você pode instalá-lo por nome:
Cenários comuns de detecção de pacotes
Capturar todo o tráfego que entra em sua máquina pode parecer conceitualmente legal, mas também parece um nível bastante baixo para muitas das atividades que realizamos em nosso trabalho diário como administradores de sistemas. Então, quando você usaria uma ferramenta de captura de pacotes? Eu normalmente recorro a um farejador de pacotes quando estou resolvendo um problema de aplicativo de rede e esgotei todas as outras opções. Freqüentemente, já executei a solução de problemas básicos de rede e revisei todos os arquivos de log do aplicativo, mas ainda não consigo chegar ao fundo de um problema. Neste ponto, quebrar um farejador de pacote para observar os dados reais sendo enviados na conexão pode ser instrutivo.
Outro ótimo caso de uso para um farejador de pacote é pedagógico. Observar os pacotes envolvidos em uma troca de aplicativos pode ajudar muito a melhorar sua compreensão dos protocolos subjacentes. Por exemplo, pode ser inestimável observar o fluxo completo de pacotes de uma consulta DNS recursiva ao tentar entender como o DNS funciona.
Realizando capturas básicas de pacotes
A melhor maneira de aprender é apenas mergulhando, então vamos começar com algumas capturas básicas de pacotes. Primeiro, vamos experimentar tcpdump
sem nenhuma opção especial. Observe que você precisará ser o superusuário para realizar capturas de pacotes (tecnicamente, você pode executá-lo de uma conta normal com recursos especiais, mas geralmente é mais fácil executá-lo como root). Use Ctrl + C ou envie um SIGTERM para o tcpdump
ID do processo (PID) para interromper a captura.
Tcpdump padrão
Para veja a saída padrão de tcpdump
, simplesmente digite o comando:
Nota: Em vez de ter muitas saídas voando antes de pressionar Ctrl + C, você pode especificar quantos pacotes você deseja ver com o sinalizador -c
. O comando acima poderia ser tcpdump -c 6
para obter os mesmos resultados (seis pacotes capturados).
A saída de tcpdump
pode ser um pouco assustador no início, mas você se acostumará a olhar para ela depois de usar essa ferramenta algumas vezes. Vamos dividir os campos, da esquerda para a direita:
Farejando uma interface específica
Observe que a parte superior da saída do exemplo anterior mostra a interface que tcpdump
começa a capturar em (eth0), e a parte inferior da captura inclui estatísticas resumidas sobre os pacotes capturados.
A primeira coisa que você provavelmente vai querer fazer ao usar tcpdump
é especificar uma interface particular para realizar capturas. Por padrão, tcpdump
escolherá a interface de menor número que está “ativa”. Muitos servidores têm várias interfaces e você deve ser explícito sobre a interface que usa para a captura. Além disso, alguns tipos de interface “especiais”, como uma interface netfilter
, podem flutuar para o topo da lista. Esse comportamento pode causar confusão, então é melhor especificar a interface na qual você está interessado.
Vamos começar exibindo as interfaces que estão disponíveis para captura:
Com uma lista de interfaces à nossa disposição, podemos agora especificar a interface a ser ouvida com o sinalizador -i
.Observe que tanto o nome da interface quanto o número do comando --list-interfaces
podem ser usados:
Olhando para as capturas acima nos fornece informações básicas sobre os pacotes que atravessam nosso rede. Parece que esses pacotes contêm saída do Spanning Tree Protocol (STP), talvez de um switch upstream. Tecnicamente, estes não são pacotes, eles são frames da camada dois. No entanto, você ouvirá os termos usados alternadamente ao discutir capturas de pacotes.
Obtendo mais informações
O resultado simples da solução de problemas do exemplo anterior pode ser ótimo para identificar problemas óbvios, mas às vezes precisamos mais informações para realmente investigar um problema complexo. Saber como ajustar o detalhamento de sua captura é importante, pois permite que você se aprofunde nos dados reais contidos nos pacotes.
O nível de detalhamento de tcpdump
é controlado anexando-se entre um e três sinalizadores -v
ao comando:
Observe que, ao especificar o nível máximo de detalhamento, posso ver muito mais informações sobre o corpo do pacote. Acima, podemos ver informações adicionais sobre os dados no pacote STP, como o ID da ponte raiz e o custo do caminho raiz. Se você não está familiarizado com o STP, não se preocupe com isso. O importante a notar aqui é que, ao aumentar a verbosidade, podemos obter informações adicionais sobre o tráfego de nossa rede.
Ver os bytes exatos de um pacote
Aumentar a verbosidade é útil, mas nós ainda não estou vendo o conteúdo dos pacotes. Se você realmente deseja ver os bytes exatos que estão nos pacotes, você pode usar os sinalizadores -x
e -X
. O sinalizador -x
imprime os dados em cada pacote em hexadecimal, enquanto o sinalizador -X
também imprime os dados em ASCII. Aqui está a saída usando -x
:
E aqui está a saída usando -X
:
Observe os dados hex e ASCII nos exemplos acima. Nesse caso, eu estava executando uma consulta de registro DNS A para . Além disso, observe que usei o sinalizador
-c
para especificar o número de pacotes a serem capturados e forneci um filtro de captura de port 53
. Discutiremos os filtros no próximo artigo.
Ficando com os números
Ao trabalhar com tcpdump
, você pode notar que seu comportamento padrão é resolver automaticamente os endereços IP para nomes de domínio totalmente qualificados (FQDNs). O Tcpdump também traduzirá os números das portas (como 22) em nomes amigáveis (como SSH). Embora esse comportamento seja bom, geralmente queremos ver os dados numéricos para não obscurecer nossa solução de problemas de forma alguma. Este comportamento padrão pode ser alterado passando -n
para desativar as pesquisas de endereço IP ou -nn
para desativar as pesquisas de endereço IP e de porta.
Aqui está o resultado quando você usa -nn
:
Salvando seu despejo
Em algum ponto, você pode querer para salvar suas capturas de pacotes para análise posterior ou para análises mais profundas com uma ferramenta gráfica como o Wireshark. Esta tarefa pode ser facilmente realizada com o sinalizador -w
, que permite gravar um arquivo de captura de pacote:
Nota: Você pode ler seu arquivo salvo usando tcpdump
com o sinalizador -r
ou com um aplicativo diferente que suporte o formato de arquivo pcap.
Como podemos ver acima , o sinalizador -w
produziu um arquivo pcap útil que podemos levar conosco.
Concluindo
Realizar capturas de pacotes é uma técnica poderosa em seu inventário de habilidades de solução de problemas de rede, especialmente quando você está preso em um problema e o resto da rede parece OK. Entender como usar tcpdump
na linha de comando pode poupar horas de frustração ao tentar resolver problemas de aplicativos de rede, e a sintaxe é bastante intuitiva quando você se acostuma.