Aprenda a usar o tcpdump para monitorar conexões
O tcpdump é um dos mais, se não o mais "famoso" sniffer para sistemas GNU/Linux. Com ele podemos realizar análises de redes e solucionar problemas. Sua utilização é simples e sem mistérios, bastando apenas ter os conhecimentos básicos de redes TCP/IP. Esta dica é apenas uma introdução deste sniffer, maiores informações e documentação à seu respeito podem ser encontradas em seu site oficial:
http://www.tcpdump.org
Por fazer uso da libpcap, (disponível no mesmo site do tcpdump), o sistema de filtros que irei descrever aqui pode ser utilizado em praticamente qualquer sniffer que faça uso da libpcap, como o Wireshark, Etherape* e outros.
A instalação do tcpdump em sistemas Debian é super simples, bastando executar o comando abaixo como super usuário (root):
# apt-get install tcpdump
Uma das funcionalidades mais importantes do TCPDump são os filtros. Com eles você consegue especificar detalhadamente qual o tráfego que você quer que seja capturado para posterior análise.
Para iniciarmos a utilização do tcpdump precisamos especificar a interface de rede que queremos analisar com o parâmetro -i seguido da interface desejada, por exemplo, se quisermos analisar todo o tráfego que passa pela interface eth0, executaríamos a seguinte linha de comando:
# tcpdump -i eth0
Conexões de origem podem ser monitoradas utilizando o parâmetro src host, um exemplo simples seria monitorarmos o tráfego que vem de 192.168.0.9 para nosso computador, com o ip 192.168.0.2. A linha de comando ficaria da seguinte forma:
# tcpdump -i eth0 src host 192.168.0.9
Se quisermos monitorar as conexões especificando um host de destino, poderíamos fazê-lo com o parâmetro dst host, o exemplo abaixo mostra todo o tráfego do host 192.168.0.2 com 192.168.0.1, no caso, 192.168.0.1 é nosso gateway.
# tcpdump -i eth0 dst host 192.168.0.1
Com tcpdump também podemos especificar exceções com o parâmetro not host, por exemplo, em nosso servidor queremos ver todo o tráfego que se passa em sua interface, exceto o de 192.168.0.8, faríamos da seguinte forma:
# tcpdump -i eth0 not host 192.168.0.9
No tcpdump podemos também especificar portas de origem e destino com os comandos src port e dst port, um exemplo seria monitorarmos o tráfego destinado à porta 80 (http), para isso utilizaríamos a linha de comandos abaixo e navegaríamos em um site qualquer:
# tcpdump -i eth0 dst port 80
Para verificarmos o tráfego da porta de origem 32881 por exemplo, faríamos da seguinte forma:
# tcpdump -i eth0 src port 32881
Vamos aprender a filtrar por host. Digamos, que você quer ver apenas o tráfego gerado/recebido pelo host 192.168.1.100. Neste caso, basta usar o comando “host”:
# tcpdump -nn -ni eth0 host 192.168.1.100
Assim, em qualquer pacote no qual o host 192.168.1.100 esteja envolvido (seja recebendo, seja enviando) o TCPDump irá capturar o pacote e exibí-lo. Mas, e se você só quisesse os pacotes destinados ao host 192.168.1.100? Usaria também o comando “src” assim:
# tcpdump -nn -ni eth0 src host 192.168.1.100
Pronto, assim a captura se restringe exclusivamente aos pacotes originados no host 192.168.1.100. Para inverter esta lógica, ou seja, capturar pacotes cujo destino é o 192.168.1.100:
# tcpdump -nn -ni eth0 dst host 192.168.1.100
Estas duas opções já diminuem muito a quantidade de pacotes capturados. Mas podemos ser ainda mais específicos. Por exemplo, usando port, dst port e src port podemos especificar também as portas. Assim, para capturar pacotes originados no host 192.168.1.100 com destino à porta 80 de qualquer outro host:
# tcpdump -nn -ni eth0 src host 192.168.1.100 and dst port 80
Note que, neste caso, começamos a precisar dos operadores lógicos (and, or). O “and” faz com que o TCPDump só capture os pacotes onde ambas as condições forem verdadeiras (o pacote deve ter saído de 192.168.1.100 E ter como destino a porta 80). Se usássemos o “or”, qualquer pacote onde pelo menos uma das duas condições fossem verdadeiras seria capturado. Por exemplo, a linha abaixo captura pacotes originados no host 192.168.1.100 OU com destino à porta 80:
# tcpdump -nn -ni eth0 src host 192.168.1.100 or dst port 80
Bem simples, não? Para especificar um host é a mesma coisa. Por exemplo, a linha abaixo vai capturar qualquer pacote que envolva os hosts 192.168.1.100 ou 192.168.1.101:
# tcpdump -nn -ni eth0 host 192.168.1.100 or host 192.168.1.101
Vale lembrar também que você pode utilizar nomes de domínio:
# tcpdump -i eth0 dst host www.google.com.br
Assim, iremos capturar todos os pacotes com destino ao site google.com.br.
Você também pode negar um host, excluindo apenas os hosts que você especificar da captura. A seguinte linha:
# tcpdump -nn -ni eth0 not host 192.168.1.101
Não irá capturar nada relacionado ao host 192.168.1.101, porém irá capturar todo o resto já que não adicionamos mais nenhum outro filtro. Para fazer um filtro melhor, utilize os outros comandos que já vimos anteriormente.
Claro que esta lista não contém todas as possibilidades que o TCPDump oferece, mas vai te dar uma boa base para começar a brincar com ele.
Armazenando os pacotes capturados em um arquivo
Ninguém consegue acompanhar todo o tráfego que aparece na tela. Por isso, é importante que você armazene todos esses dados em um arquivo para que você possa analisar tudo com calma depois, identificando qual o problema.
No TCPDump isso é feito simplesmente usando a flag -w:
# tcpdump -nn -ni eth0 not host 192.168.1.101 -w /tmp/captura.pcap
Isso irá escrever todos os pacotes capturados no arquivo /tmp/captura.pcap. Este é um arquivo binário (escrever em um arquivo binário é mais rápido que escrever em um arquivo texto puro, evitando que o sniffer perca pacotes enquanto espera o fluxo ser salvo no arquivo), portanto não adianta você tentar lê-lo utilizando um editor de textos normal ou mesmo um comando como o cat, por exemplo. Você precisa de um software que saiba ler este arquivo como o próprio TCPDump ou o Wireshark .
Depois que você escrever um arquivo binário com a captura, pode lê-lo utilizando a opção -r do TCPDump:
# tcpdump -r /tmp/captura.pcap
Lembre-se que aí estão os pacotes em si, não apenas aquele output que aparece na sua tela quando você executa o TCPDump. Portanto, não pense que apenas redirecionar o output do TCPDump para um arquivo (seja da maneira que for) é uma captura de pacotes. Neste caso não haveria pacote nenhum, apenas um fluxo de texto puro.
Quando você fizer o TCPDump ler um arquivo, você também pode aplicar alguns switches para mudar um pouco o comportamento dele. Por exemplo, você pode usar a opção -XX para imprimir tanto o conteúdo do pacote e também o seu cabeçalho. Por exemplo:
# tcpdump -r /tmp/captura.pcap -XX
0 comentários:
Postar um comentário