Tcpdump é um comando usado em vários sistemas operacionais Linux (OSs) que reúne pacotes TCP / IP que passam por um adaptador de rede. Assim como uma ferramenta sniffer de pacotes, o tcpdump pode não apenas analisar o tráfego da rede, mas também salvá-lo em um arquivo.
Ao contrário de alguns comandos que são fornecidos pelo sistema operacional por padrão, você pode achar que não pode usar o tcpdump porque ele não está instalado. Para instalar o tcpdump, execute apt-get install tcpdump ou yum instala o tcpdump, dependendo do seu sistema operacional.
Como funciona o Tcpdump
O Tcpdump imprime os cabeçalhos de pacotes em uma interface de rede que corresponde ao arquivo booleano. expressão . Também pode ser executado com o-W flag, que faz com que ele salve os dados do pacote em um arquivo para análise posterior, e / ou com o-r flag, que faz com que ele leia de um arquivo de pacote salvo em vez de ler pacotes de uma interface de rede. Em todos os casos, apenas os pacotes que correspondem expressão será processado por tcpdump .
Tcpdump será, se não for executado com o-c flag, continue capturando pacotes até que seja interrompido por um sinal SIGINT (gerado, por exemplo, digitando seu caractere de interrupção, tipicamente Ctrl + C) ou um sinal SIGTERM (normalmente gerado com omate(1) comando); se correr com o-c flag, ele irá capturar pacotes até que seja interrompido por um sinal SIGINT ou SIGTERM ou o número especificado de pacotes tenha sido processado.
As opções mencionadas acima são explicadas em detalhes posteriormente neste artigo.
Quando tcpdump finaliza a captura de pacotes, ele relatará contagens de:
- Pacotes "recebidos por filtro".
- O significado disso depende do sistema operacional no qual você está executando tcpdump e, possivelmente, sobre a maneira como o sistema operacional foi configurado. Se um filtro foi especificado na linha de comando, em alguns sistemas operacionais ele conta pacotes independentemente de terem sido correspondidos pela expressão de filtro e, em outros, conta apenas os pacotes que foram correspondidos pela expressão de filtro e foram processados por tcpdump.
- Pacotes "descartados pelo kernel".
- Este é o número de pacotes que foram descartados, devido à falta de espaço no buffer, pelo mecanismo de captura de pacotes no SO no qual tcpdump está em execução, se o sistema operacional relatar essas informações aos aplicativos. Caso contrário, será relatado como 0.
Em plataformas que suportam o sinal SIGINFO, como a maioria dos BSDs (Berkeley Software Distributions), ele reportará essas contagens quando receber um sinal SIGINFO (gerado, por exemplo, digitando seu caractere "status", tipicamente Ctrl + T) e continuará capturando pacotes.
Compatibilidade do Tcpdump
A leitura de pacotes de uma interface de rede com o comando tcpdump pode exigir que você tenha privilégios especiais ( leitura um arquivo de pacote salvo não requer tais privilégios):
- SunOS 3.x ou 4.x com NIT ou BPF: Você deve ter acesso de leitura a / dev / nit ou dev / bpf * .
- Solaris com DLPI: Você deve ter acesso de leitura / gravação ao pseudo-dispositivo de rede, como / dev / le . Em pelo menos algumas versões do Solaris, no entanto, isso não é suficiente para permitir tcpdump capturar em modo promíscuo; nessas versões do Solaris, você deve ser root ou tcpdump deve ser instalado setuid para root, a fim de capturar em modo promíscuo. Observe que, em muitas (talvez todas) interfaces, se você não capturar no modo promíscuo, não verá nenhum pacote de saída, portanto, uma captura não executada no modo promíscuo pode não ser muito útil.
- HP-UX com DLPI: Você deve ser root ou tcpdump deve ser instalado setuid para root.
- IRIX com bisbilhotice: Você deve ser root ou tcpdump deve ser instalado setuid para root.
- Linux: Você deve ser root ou tcpdump deve ser instalado setuid para root.
- Ultrix e Digital UNIX / Tru64 UNIX: Qualquer usuário pode capturar tráfego de rede com tcpdump . No entanto, nenhum usuário (nem mesmo o superusuário) pode capturar no modo promíscuo em uma interface, a menos que o superusuário tenha ativado a operação em modo promíscuo nessa interface usando pfconfig (8), e nenhum usuário (nem mesmo o super-usuário) pode capturar o tráfego unicast recebido ou enviado pela máquina em uma interface, a menos que o superusuário tenha ativado a operação de cópia em todos os modos naquela interface usando pfconfig , assim útil A captura de pacotes em uma interface provavelmente requer que a operação em modo promíscuo ou cópia em todos os modos, ou ambos os modos de operação, sejam ativados nessa interface.
- BSD: Você deve ter acesso de leitura a / dev / bpf * .
Sintaxe de Comando do Tcpdump
Como todos os comandos do computador, o comando tcpdump funciona corretamente somente se a sintaxe estiver correta:
tcpdump -adeflnNOpqRStuvxX -c contagem
-C tamanho do arquivo -F Arquivo
-Eu interface -m módulo -r Arquivo
-s snaplen -T tipo -VOCÊ do utilizador -W Arquivo
-E algo: secret expressão
Opções do Comando Tcpdump
Estas são todas as opções que você pode usar com o comando tcpdump:
- -uma: Tenta converter endereços de rede e de transmissão em nomes.
- -c: Sair depois de receber contagem pacotes.
- -C: Antes de gravar um pacote bruto em um arquivo salvo, verifique se o arquivo é atualmente maior que tamanho do arquivo e, em caso afirmativo, feche o arquivo de salvamento atual e abra um novo.Savefiles após o primeiro savefile terá o nome especificado com o-W bandeira, com um número após, começando em 2 e continuando para cima. As unidades de tamanho do arquivo são milhões de bytes (1.000.000 bytes, não 1.048.576 bytes).
- -dDespeja o código de correspondência de pacote compilado em um formato legível para a saída padrão e pare.
- -dd: Despejar o código de correspondência de pacotes comoC fragmento de programa.
- -ddd: Dump código de correspondência de pacotes como números decimais (precedidos por uma contagem).
- -e: Imprime o cabeçalho do nível do link em cada linha de despejo.
- -E: Usar algo: secret para descriptografar pacotes IPsec ESP. Algoritmos podem serdes-cbc, 3des-cbc, blowfish-cbc, rc3-cbc, cast128-cbcouNenhum. O padrão édes-cbc. A capacidade de descriptografar pacotes só está presente se tcpdump foi compilado com criptografia ativada. segredo o texto ASCII para a chave secreta ESP. Não podemos tomar valor binário arbitrário neste momento. A opção assume ESP RFC2406, não ESP RFC1827. A opção é apenas para fins de depuração, e o uso dessa opção com uma chave verdadeiramente 'secreta' é desencorajado. Ao apresentar a chave secreta IPsec na linha de comando, você a torna visível para outras pessoas, via ps (1) e outras ocasiões.
- -f: Imprima endereços de Internet 'estrangeiros' numericamente, em vez de simbolicamente (esta opção tem a intenção de contornar danos cerebrais sérios no servidor yp da Sun - normalmente, ele trava para sempre a tradução de números de internet não locais).
- -F: Usar Arquivo como entrada para a expressão de filtro. Uma expressão adicional dada na linha de comando é ignorada.
- -Eu: Ouça interface . Se não especificado, tcpdump procura na lista de interface do sistema pela interface configurada de menor número (excluindo o loopback). Os laços são quebrados escolhendo a partida mais antiga. Nos sistemas Linux com kernels 2.2 ou posteriores, interface O argumento de "any" pode ser usado para capturar pacotes de todas as interfaces. Observe que as capturas no dispositivo "any" não serão feitas no modo promíscuo.
- -eu: Faça a linha stdout em buffer. Útil se você quiser ver os dados durante a captura. Por exemplo, "tcpdump -l | tee dat" ou "tcpdump -l> dat & tail -f dat ''.
- -m: Carregar definições do módulo SMI MIB do arquivo módulo . Esta opção pode ser usada várias vezes para carregar vários módulos MIB tcpdump .
- -nNão converta endereços de host em nomes. Isso pode ser usado para evitar pesquisas de DNS.
- -nnNão converta números de protocolos e portas, etc., em nomes.
- -N: Não imprimir a qualificação do nome de domínio dos nomes de host. Por exemplo, se você der este flag, então tcpdump irá imprimir "nic" em vez de "nic.ddn.mil".
- -O: Não execute o otimizador de código de correspondência de pacote. Isso é útil apenas se você suspeitar de um bug no otimizador.
- -p: Não faça coloque a interface no modo promíscuo. Observe que a interface pode estar no modo promíscuo por algum outro motivo; portanto, '-p' não pode ser usado como uma abreviação para 'ether host {local-hw-addr} ou ether broadcast'.
- -q: Saída rápida (silenciosa). Imprima menos informações de protocolo para que as linhas de saída sejam mais curtas.
- -R: Suponha que os pacotes ESP / AH sejam baseados em especificações antigas: RFC1825 para RFC1829. Se especificado tcpdump não imprime campo de prevenção de reprodução. Como não há campo de versão do protocolo na especificação ESP / AH, tcpdump não pode deduzir a versão do protocolo ESP / AH.
- -r: Ler pacotes de Arquivo (que foi criado com a opção -w). A entrada padrão é usada se Arquivo é "-''.
- -S: Imprime números de sequência TCP absolutos, em vez de relativos.
- -s: Snarf snaplen bytes de dados de cada pacote, em vez do padrão de 68; com o NIT do SunOS, o mínimo é, na verdade, 96. Sessenta e oito bytes são adequados para IP, ICMP, TCP e UDP, mas podem truncar as informações de protocolo do servidor de nomes e dos pacotes NFS (veja abaixo). Pacotes truncados por causa de um instantâneo limitado são indicados na saída com "| proto '', Onde proto é o nome do nível de protocolo no qual o truncamento ocorreu. Observe que tirar snapshots maiores aumenta a quantidade de tempo que leva para processar pacotes e, efetivamente, diminui a quantidade de buffer de pacote. Isso pode causar a perda de pacotes. Você deve limitar snaplen para o menor número que irá capturar as informações de protocolo que você está interessado em. snaplen para 0 significa usar o comprimento necessário para capturar pacotes inteiros.
- -T: Forçar pacotes selecionados por " expressão "para ser interpretado o especificado tipo . Tipos atualmente conhecidos sãocnfp (Protocolo Cisco NetFlow),rpc (Chamada de procedimento remoto),rtp (Protocolo de aplicações em tempo real),rtcp (Protocolo de controle de aplicativos em tempo real),snmp (Protocolo de gerenciamento de rede simples),cuba (Visual Audio Tool) ewb (quadro branco distribuído).
- -t: Não faça imprima um timestamp em cada linha de despejo.
- -tt: Imprime um carimbo de data e hora não formatado em cada linha de despejo.
- -VOCÊ: Descarta privilégios de root e altera o ID do usuário para do utilizador e ID do grupo para o grupo principal de do utilizador .
- Nota: O Red Hat Linux descarta automaticamente os privilégios para o usuário "pcap" se nada for especificado.
- -ttt: Imprima um delta (em microssegundos) entre a linha atual e a anterior em cada linha de despejo.
- -tttt: Imprime um registro de data e hora no formato padrão, processado por data em cada linha de despejo.
- -você: Imprimir alças NFS não decodificadas.
- -v: (Ligeiramente mais) saída detalhada. Por exemplo, o tempo de vida, a identificação, o comprimento total e as opções em um pacote IP são impressos. Também permite verificações adicionais de integridade de pacotes, como verificar a soma de verificação do cabeçalho IP e ICMP.
- -vv: Saída ainda mais detalhada. Por exemplo, campos adicionais são impressos de pacotes de resposta NFS e pacotes SMB são totalmente decodificados.
- -vvv: Saída ainda mais detalhada. Por exemplo, telnetSB … SE as opções são impressas na íntegra. Com -X as opções de telnet são impressas em hexadecimal também.
- -W: Escreve os pacotes brutos para Arquivo em vez de analisar e imprimi-las. Mais tarde eles podem ser impressos com a opção -r. Saída padrão é usada se Arquivo é "-''.
- -x: Imprime cada pacote (menos seu cabeçalho de nível de link) em hexadecimal. O menor de todo o pacote ou snaplen bytes serão impressos. Observe que esse é todo o pacote da camada de enlace, portanto, para camadas de enlace que pad (por exemplo, Ethernet), os bytes de preenchimento também serão impressos quando o pacote de camada superior for menor que o preenchimento necessário.
- -X: Ao imprimir em hexadecimal, imprima também ascii. Assim, se-x também é definido, o pacote é impresso em hex / ascii. Isso é muito útil para analisar novos protocolos. Mesmo se-x também não está definido, algumas partes de alguns pacotes podem ser impressas em hex / ascii.
- expressão : Seleciona quais pacotes serão descartados. Se não expressão é dado, todos os pacotes na rede serão despejados. Caso contrário, apenas pacotes para os quais expressão é 'verdadeiro' será despejado. o expressão consiste em um ou mais primitivos. Primitivos geralmente consistem em um identidade (nome ou número) precedido por um ou mais qualificadores. Existem três tipos diferentes de qualificador:
- tipo : Qualificadores dizem que tipo de coisa o nome do id ou número se refere. Tipos possíveis sãohospedeiro, líquidoeporta- por exemplo, 'host foo', 'net 128.3', 'port 20'. Se não houver nenhum qualificador de tipo,hospedeiro é assumido.
- dir : Qualificadores especificam uma direção de transferência específica para e / ou de identidade . As possíveis direções sãosrc, DST, src ou dst esrc e DST (por exemplo, 'src foo', 'dst net 128.3', 'src ou dst port ftp-data'). Se não houver qualificador de dir,src ou dst é assumido. Para camadas de enlace 'nulo' (ou seja, protocolos ponto-a-ponto, como entrada e saída qualificadores podem ser usados para especificar uma direção desejada.
- proto : Qualificadores restringem a correspondência a um protocolo específico. Possíveis protos são: éter, fddi, tr, ip, ip6, arp, rarp, decnet, tcpeudpPor exemplo, 'ether src foo', 'arp net 128.3', 'tcp port 21'. Se não houver nenhum qualificador, todos os protocolos compatíveis com o tipo são assumidos. Por exemplo, 'src foo' significa '(ip ou arp ou rarp) src foo' (exceto se este último não for uma sintaxe legal), 'net bar' significa '(ip ou arp ou rarp) net bar' e 'port 53' significa '(tcp ou udp) porta 53'.
- 'fddi' é na verdade um apelido para 'ether'; o analisador trata-os identicamente como significando "o nível de enlace de dados usado na interface de rede especificada". Os cabeçalhos FDDI contêm endereços de origem e destino semelhantes a Ethernet e geralmente contêm tipos de pacote semelhantes a Ethernet, portanto você pode filtrar apenas esses campos FDDI como com os campos Ethernet análogos, os cabeçalhos FDDI também contêm outros campos, mas você não pode nomeá-los explicitamente em uma expressão de filtro.
- Da mesma forma, 'tr' é um pseudônimo de 'éter'; as declarações do parágrafo anterior sobre os cabeçalhos FDDI também se aplicam aos cabeçalhos Token Ring.
Além do acima, existem algumas palavras-chave "primitivas" especiais que não seguem o padrão:porta de entrada, transmissão, Menos, maiore aritmética expressões. Todos estes são descritos abaixo.
Expressões de filtro mais complexas são construídas usando as palavrase, ouenão para combinar primitivos - por exemplo, "host foo e não port ftp e não port ftp-data". Para salvar a digitação, listas de qualificadores idênticas podem ser omitidas (por exemplo, "tcp dst port ftp ou ftp-data ou domain" é exatamente igual a "tcp dst porta ftp ou tcp dst porta ftp-data ou tcp dst port domain".)
Estas são as primitivas permitidas com o comando tcpdump:
- dst host hospedeiro
- Verdadeiro se o campo de destino IPv4 / v6 do pacote for hospedeiro , que pode ser um endereço ou um nome.
- host src hospedeiro
- Verdadeiro se o campo de origem IPv4 / v6 do pacote for hospedeiro .
- hospedeiro hospedeiro
- Verdadeiro se a origem ou o destino do pacote IPv4 / v6 for hospedeiro . Qualquer uma das expressões do host acima pode ser prefixada com as palavras-chave,ip, arp, rarpouip6, como em host ip hospedeiro (que é equivalente a éter proto ip e host hospedeiro).
- E se hospedeiro é um nome com vários endereços IP, cada endereço será verificado para uma correspondência.
- éter dst ehost
- Verdadeiro se o endereço de destino Ethernet for ehost . Ehost pode ser um nome de / etc / ethers ou um número (ver éteres (3N) para formato numérico).
- ether src ehost
- Verdadeiro se o endereço de origem Ethernet for ehost .
- host ether ehost
- Verdadeiro se o endereço de origem ou de destino da Ethernet for ehost .
- porta de entrada hospedeiro
- Verdadeiro se o pacote usado hospedeiro como um gateway (ou seja, o endereço de origem ou destino da Ethernet era hospedeiro mas nem a fonte IP nem o destino IP foi hospedeiro ).
- Hospedeiro deve ser um nome e deve ser encontrado pelos mecanismos de resolução do nome do host para o endereço IP (arquivo de nome de host, DNS, NIS, etc.) e pelo mecanismo de resolução de nome de host para endereço de Ethernet da máquina. (/ etc / ethers, etc.)
- Uma expressão equivalente é host ether ehost e agora hospeda hospedeiro , que pode ser usado com nomes ou números para host / ehost .) Essa sintaxe não funciona na configuração ativada para IPv6 neste momento.
- dst net líquido
- Verdadeiro se o endereço de destino IPv4 / v6 do pacote tiver um número de rede líquido . Líquido pode ser um nome de / etc / networks ou um número de rede (ver redes (4) para detalhes).
- src net líquido
- Verdadeiro se o endereço de origem IPv4 / v6 do pacote tiver um número de rede líquido .
- líquido líquido
- Verdadeiro se o endereço de origem ou de destino do pacote IPv4 / v6 tiver um número de rede líquido .
- líquido líquido mascarar netmask
- Verdadeiro se o endereço IP corresponder líquido com o específico netmask . Pode ser qualificado comsrc ouDST. Note que esta sintaxe não é válida para IPv6 líquido .
- líquido líquido / len
- Verdadeiro se o endereço IPv4 / v6 corresponder líquido com uma netmask len pedaços de largura. Pode ser qualificado comsrc ouDST.
- porta dst porta
- Verdadeiro se o pacote for ip / tcp, ip / udp, ip6 / tcp ou ip6 / udp e tiver um valor de porta de destino porta . o porta pode ser um número ou um nome usado em / etc / services (consulte tcp (4P) e udp (4P)). Se um nome for usado, o número da porta e o protocolo são verificados. Se um número ou nome ambíguo for usado, somente o número da porta será verificado (por exemplo,dst port 513 imprimirá o tráfego tcp / login e o tráfego udp / who edomínio da porta irá imprimir tanto o tráfego tcp / domain e udp / domain).
- porta src porta
- Verdadeiro se o pacote tiver um valor de porta de origem porta .
- porta porta
- Verdadeiro se a porta de origem ou de destino do pacote for porta . Qualquer uma das expressões de porta acima pode ser prefixada com as palavras-chave,tcp ouudp, como em porta src tcp porta , que corresponde apenas aos pacotes tcp cuja porta de origem é porta .
- Menos comprimento
- Verdadeiro se o pacote tiver um comprimento menor ou igual a comprimento . Isso é equivalente a len <= comprimento .
- maior comprimento
- Verdadeiro se o pacote tiver um comprimento maior ou igual a comprimento . Isso é equivalente a len> = comprimento .
- proto ip protocolo
- Verdadeiro se o pacote for um pacote IP (ver ip (4P)) do tipo de protocolo protocolo . Protocolo pode ser um número ou um dos nomes icmp , icmp6 , igmp , igrp , pim , ah , esp , vrrp , udp ou tcp . Observe que os identificadores tcp , udp e icmp também são palavras-chave e devem ser escapadas via barra invertida (), que é no C-shell. Observe que essa primitiva não persegue a cadeia de cabeçalho do protocolo.
- ip6 proto protocolo
- Verdadeiro se o pacote for um pacote IPv6 do tipo de protocolo protocolo . Observe que essa primitiva não persegue a cadeia de cabeçalho do protocolo.
- protocaino ip6 protocolo
- Verdadeiro se o pacote for um pacote IPv6 e contiver cabeçalho de protocolo com tipo protocolo em sua cadeia de cabeçalho de protocolo. Por exemplo, protochain ipv6 6 corresponde a qualquer pacote IPv6 com o cabeçalho do protocolo TCP na cadeia de cabeçalho do protocolo. O pacote pode conter, por exemplo, cabeçalho de autenticação, cabeçalho de roteamento ou cabeçalho da opção salto a salto, entre o cabeçalho IPv6 e o cabeçalho TCP. O código BPF emitido por essa primitiva é complexo e não pode ser otimizado pelo código do otimizador BPF em tcpdump , então isso pode ser um pouco lento.
- protochain ip protocolo
- Equivalente aprotocaino ip6 protocolo , mas isso é para o IPv4.
- transmissão ether
- Verdadeiro se o pacote for um pacote de transmissão Ethernet. o éter palavra-chave é opcional.
- transmissão ip
- Verdadeiro se o pacote for um pacote de transmissão IP. Ele verifica as convenções de transmissão de todos os zeros e todas as unidades e pesquisa a máscara de sub-rede local.
- multicast ether
- Verdadeiro se o pacote for um pacote multicast Ethernet. o éter palavra-chave é opcional. Isso é uma abreviação para 'ether 0 & 1! = 0'.
- multicast ip
- Verdadeiro se o pacote for um pacote multicast IP.
- multicast ip6
- Verdadeiro se o pacote for um pacote multicast IPv6.
- éter proto protocolo
- Verdadeiro se o pacote for do tipo ether protocolo . Protocolo pode ser um número ou um dos nomes ip , ip6 , arp , rarp , uma conversa , aarp , decnet , sca , lat , mopdl , moprc , iso , stp , ipx ou netbeui . Observe que esses identificadores também são palavras-chave e devem ser escapados por meio de barra invertida ().
- No caso de FDDI (por exemplo, 'protocolo fddi arp') e Token Ring (por exemplo,'arp do protocolo tr'), para a maioria desses protocolos, a identificação do protocolo vem do cabeçalho 802.2 Logical Link Control (LLC), que geralmente é colocado em camadas na parte superior do cabeçalho FDDI ou Token Ring.
- Ao filtrar a maioria dos identificadores de protocolo em FDDI ou Token Ring, tcpdump verifica apenas o campo de ID de protocolo de um cabeçalho LLC no formato chamado SNAP com um Identificador de Unidade Organizacional (OUI) de 0x000000, para Ethernet encapsulada; ele não verifica se o pacote está no formato SNAP com um OUI de 0x000000.
- As exceções são iso , para o qual verifica os campos DSAP (ponto de acesso ao serviço de destino) e SSAP (ponto de acesso ao serviço de origem) do cabeçalho da LLC, stp e netbeui , onde verifica o DSAP do cabeçalho LLC e uma conversa , onde verifica um pacote no formato SNAP com um OUI de 0x080007 e o tipo de letra Appletalk.
- No caso da Ethernet, tcpdump verifica o campo do tipo Ethernet para a maioria desses protocolos; as exceções são iso , seiva e netbeui , para o qual ele verifica um quadro 802.3 e, em seguida, verifica o cabeçalho LLC como faz para FDDI e Token Ring; uma conversa , onde ele verifica tanto o tipo de letra Appletalk em um quadro Ethernet quanto um pacote em formato SNAP, como faz para FDDI e Token Ring; aarp , onde verifica o tipo de documento ARP do Appletalk em um quadro Ethernet ou em um quadro SNAP 802.2 com um OUI de 0x000000; e ipx , onde ele verifica o tipo de letra IPX em um quadro Ethernet, o IPX DSAP no cabeçalho LLC, o 802.3 sem encapsulamento de cabeçalho LLC do IPX e o tipo de letra IPX em um quadro SNAP.
- decnet src hospedeiro
- Verdadeiro se o endereço de origem da DECNET for hospedeiro , que pode ser um endereço no formato "10.123", ou um nome de host DECNET. O suporte ao nome do host da DECNET está disponível apenas em sistemas Ultrix configurados para executar o DECNET.
- decnet dst hospedeiro
- Verdadeiro se o endereço de destino DECNET for hospedeiro .
- host de decada hospedeiro
- Verdadeiro se o endereço de origem ou destino da DECNET for hospedeiro .
- ip, ip6, arp, rarp, uma conversa, aarp, decnet, iso, stp, ipx, netbeui
- Abreviaturas para éter proto p Onde p é um dos protocolos acima.
- lat, moprc, mopdl
- Abreviaturas para éter proto p Onde p é um dos protocolos acima. Observe que tcpdump atualmente não sabe como analisar esses protocolos.
- vlan vlan_id
- Verdadeiro se o pacote for um pacote IEEE 802.1Q VLAN. E se vlan_id é especificado, somente true se o pacote tiver o especificado vlan_id . Note que o primeirovlan palavra-chave encontrada em expressão altera as compensações de decodificação para o restante expressão no pressuposto de que o pacote é um pacote de VLAN.
- tcp, udp, icmp
- Abreviaturas para proto ip p ou ip6 proto p Onde p é um dos protocolos acima.
- iso proto protocolo
- Verdadeiro se o pacote for um pacote OSI do tipo de protocolo protocolo . Protocolo pode ser um número ou um dos nomes clnp , esis ou isis .
- clnp, esis, isis
- Abreviaturas para iso proto p Onde p é um dos protocolos acima. Observe que tcpdump faz um trabalho incompleto de analisar esses protocolos.
- expr relop expr
- Verdade se a relação se mantiver, onde relop é um dos>, <,> =, <=, =,! = e expr é uma expressão aritmética composta de constantes inteiras (expressas na sintaxe C padrão), os operadores binários normais +, -, *, /, &, |, um operador de comprimento e acessadores de dados de pacotes especiais. Para acessar dados dentro do pacote, use a seguinte sintaxe: proto expr: tamanho .
Proto é um doséter, fddi, tr, ppp, escorregar, ligação, ip, arp, rarp, tcp, udp, icmpou ip6e indica a camada de protocolo para a operação de indexação (éter, fddi, tr, ppp, escorregareligação todos se referem à camada de link). Observe que tcp, udp e outros tipos de protocolo da camada superior só se aplicam ao IPv4, não ao IPv6 (isso será corrigido no futuro). O byte offset, relativo à camada de protocolo indicada, é dado por expr . Tamanho é opcional e indica o número de bytes no campo de interesse; pode ser um, dois ou quatro e o padrão é um. O operador length, indicado pela palavra-chavelen, dá o comprimento do pacote.
Por exemplo, 'ether 0 & 1! = 0'captura todo o tráfego multicast. A expressão 'ip 0 e 0xf! = 5'pega todos os pacotes IP com opções. A expressão 'ip 6: 2 e 0x1fff = 0'captura apenas datagramas não fragmentados e frag zero de datagramas fragmentados. Essa verificação é implicitamente aplicada aotcp eudp operações de indexação. Por exemplo, tcp 0 sempre significa o primeiro byte do TCP cabeçalho e nunca significa o primeiro byte de um fragmento interveniente.
Alguns deslocamentos e valores de campo podem ser expressos como nomes em vez de valores numéricos. Os seguintes deslocamentos do campo de cabeçalho de protocolo estão disponíveis: icmptype (Campo tipo ICMP),icmpcode (Campo de código ICMP) etcpflags (Campo de sinalizadores TCP).
Os seguintes valores de campo do tipo ICMP estão disponíveis:icmp-echoreply, icmp-unreach, icmp-sourcequench, icmp-redirect, icmp-echo, icmp-routeradvert, icmp-routersolicit, icmp-timxceed, icmp-paramprob, icmp-tstamp, icmp-tstampreply, icmp-ireq, icmp-ireqreply, icmp-maskreq, icmp-maskreply.
Os seguintes valores do campo de sinalizadores TCP estão disponíveis:tcp-fin, tcp-syn, tcp-rst, tcp-push, tcp-push, tcp-ack, tcp-urg.
As primitivas podem ser combinadas usando qualquer um dos seguintes:
- Um grupo de primitivos e operadores entre parênteses (parênteses são especiais para o Shell e devem ser escapados)
- Negação ('!'ou'não')
- Concatenação ('&&'ou'e')
- Alternação ('||'ou'ou')
Negação tem maior precedência. A alternação e a concatenação têm precedência igual e associam da esquerda para a direita. Note que explícitoe tokens, não justaposição, são necessários para a concatenação.
Se um identificador for fornecido sem uma palavra-chave, a palavra-chave mais recente será assumida. Por exemplo, não hospeda vs e ace é curto para não hospeda vs e host ace. No entanto, isso não deve ser confundido com não (host vs ou ace).
Argumentos de expressão podem ser passados para tcpdump como um único argumento ou como vários argumentos, o que for mais conveniente. Geralmente, se a expressão contiver metacaracteres do Shell, será mais fácil transmiti-la como um argumento simples citado. Vários argumentos são concatenados com espaços antes de serem analisados.
Exemplos do Tcpdump
tcpdump host sundown
O comando tcpdump acima é usado para imprimir todos os pacotes que chegam ou partem de pôr do sol. tcpdump host helios e (hot ou ace )
Este exemplo de tcpdump imprime tráfego entre helios e também quente ou ás. tcpdump host ip ace e não helios
Você pode usar este comando tcpdump para imprimir todos os pacotes IP entre ás e qualquer host, exceto Helios tcpdump net ucb-ether
No exemplo acima, o tcpdump imprime todo o tráfego entre hosts locais e hosts em Berkeley. tcpdump 'snup do gateway e (porta ftp ou ftp-data)'
Este próximo exemplo de comando tcpdump é usado para imprimir todo o tráfego FTP através do gateway da Internet enlevo . Observe que a expressão é citada para impedir que o shell interprete incorretamente os parênteses. tcpdump ip e não net localnet
No exemplo acima do tcpdump, o comando imprime o tráfego não originado nem destinado a hosts locais. tcpdump 'tcp tcpflags & (tcp-syn | tcp-fin)! = 0 e não src e dst net localnet '
Para o exemplo acima do tcpdump, o comando é usado para imprimir os pacotes inicial e final (os pacotes SYN e FIN) de cada conversação TCP que envolve um host não local. tcpdump 'snup de gateway e ip 2: 2> 576'
O comando acima imprimirá pacotes IP com mais de 576 bytes enviados pelo gateway snup. tcpdump 'ether 0 & 1 = 0 e ip 16> = 224'
O comando tcpdump mostrado acima imprime pacotes de transmissão IP ou multicast que foram não enviado via transmissão via Ethernet ou multicast. tcpdump 'icmp icmptype! = icmp-echo e icmp icmptype! = icmp-echoreply'
Neste último exemplo de tcpdump, o comando imprime todos os pacotes ICMP que não são solicitações ou respostas de eco (ou seja, não fazem ping de pacotes). A saída de tcpdump é dependente do protocolo. A seguir, uma breve descrição e exemplos da maioria dos formatos. Cabeçalhos de nível de link. Se a opção '-e' for fornecida, o cabeçalho do nível do link será impresso. Em redes Ethernet, os endereços de origem e destino, o protocolo e o tamanho do pacote são impressos. Em redes FDDI, a opção '-e' faz com que tcpdump para imprimir o campo 'frame control', os endereços de origem e destino e o tamanho do pacote. (O campo 'frame control' controla a interpretação do resto do pacote. Pacotes normais (como os que contêm datagramas IP) são pacotes 'assíncronos', com um valor de prioridade entre 0 e 7: por exemplo, 'async4'. Presume-se que tais pacotes contenham um pacote 802.2 Logical Link Control (LLC); o cabeçalho LLC é impresso se for não um datagrama ISO ou um chamado pacote SNAP. Em redes Token Ring, a opção '-e' faz com que tcpdump para imprimir os campos 'controle de acesso' e 'controle de quadros', os endereços de origem e destino e o tamanho do pacote. Como nas redes FDDI, supõe-se que os pacotes contenham um pacote LLC. Independentemente de a opção '-e' ser especificada ou não, as informações de roteamento de origem são impressas para pacotes roteados por origem. (N.B .: A descrição a seguir pressupõe familiaridade com o algoritmo de compressão SLIP descrito no RFC-1144). Em links SLIP, um indicador de direção ("I" para entrada, "O '" para saída), tipo de pacote e informações de compactação são impressos. O tipo de pacote é impresso primeiro. Os três tipos são ip , utcp e ctcp . Nenhuma outra informação de link é impressa para ip pacotes. Para pacotes TCP, o identificador de conexão é impresso seguindo o tipo. Se o pacote for compactado, o cabeçalho codificado será impresso. Os casos especiais são impressos como* S + n e* SA + n , Onde n é o valor pelo qual o número de sequência (ou número de sequência e ack) foi alterado. Se não for um caso especial, zero ou mais alterações serão impressas. Uma mudança é indicada por U (ponteiro urgente), W (janela), A (ack), S (número de sequência) e I (ID do pacote), seguido por um delta (+ n ou -n) ou um novo valor. (= n) Finalmente, a quantidade de dados no pacote e o comprimento do cabeçalho compactado são impressos. Por exemplo, a linha a seguir mostra um pacote TCP compactado de saída, com um identificador de conexão implícito; o ack foi alterado por 6, o número de sequência por 49 e o ID do pacote por 6; Existem 3 bytes de dados e 6 bytes de cabeçalho comprimido: O ctcp * A + 6 S + 49 I + 6 3 (6)
Pacotes Arp / rarp. A saída arp / rarp mostra o tipo de solicitação e seus argumentos. O formato destina-se a ser auto-explicativo. Aqui está uma pequena amostra retirada do início de um 'rlogin' do host rtsg para hospedar csam : arp quem tem csam dizer rtsgarp reply csam is-at CSAM
A primeira linha diz que o rtsg enviou um pacote arp solicitando o endereço Ethernet do host da internet csam. O Csam responde com seu endereço Ethernet (neste exemplo, os endereços Ethernet estão em maiúsculas e endereços da Internet em letras minúsculas). Isso pareceria menos redundante se tivéssemos feito tcpdump -n : arp who-has 128.3.254.6 diz 128.3.254.68arp reply 128.3.254.6 is-at 02: 07: 01: 00: 01: c4
Se tivéssemos feito tcpdump -e , o fato de que o primeiro pacote é transmitido e o segundo ponto-a-ponto seria visível: RTSG Broadcast 0806 64: arp quem tem csam diz rtsgCSAM RTSG 0806 64: arp reply csam is-at CSAM
Para o primeiro pacote, isso indica que o endereço de origem da Ethernet é RTSG, o destino é o endereço de broadcast da Ethernet, o campo type continha o hex 0806 (tipo ETHER_ARP) e o tamanho total era 64 bytes. Pacotes TCP (N.B .: A descrição a seguir pressupõe familiaridade com o protocolo TCP descrito no RFC-793. Se você não estiver familiarizado com o protocolo, nem esta descrição nem o tcpdump serão de grande utilidade para você) . O formato geral de uma linha de protocolo tcp é: src> dst: flags dados-seqno ack window opções urgentes
Src e DST são os endereços IP e portas de origem e destino. Bandeiras são alguma combinação de S (SYN), F (FIN), P (PUSH) ou R (RST) ou um único '.' (sem bandeiras). Data-seqno descreve a parte do espaço de seqüência coberta pelos dados neste pacote (veja o exemplo abaixo). Ack é o número de sequência dos próximos dados esperados na outra direção nesta conexão. Janela é o número de bytes de espaço de buffer de recepção disponível na outra direção nesta conexão. Urg indica que há dados 'urgentes' no pacote. Opções são opções de tcp entre colchetes angulares (por exemplo, Src, dst, e bandeiras estão sempre presentes. Os outros campos dependem do conteúdo do cabeçalho do protocolo tcp do pacote e são emitidos somente se apropriado. Aqui está a parte de abertura de um rlogin do host rtsg para hospedar csam . rtsg.1023> csam.login: S 768512: 768512 (0) ganhe 4096 A primeira linha diz que a porta tcp 1023 no rtsg enviou um pacote para a porta entrar no csam. oS indica que o SYN bandeira foi definida. O número de sequência do pacote era 768512 e não continha dados. (A notação é 'primeiro: último (nbytes)', que significa 'números de sequência' primeiro até, mas não incluindo último qual é nbytes bytes de dados do usuário '.) Não havia nenhum ack piggy-backed, a janela de recepção disponível era 4096 bytes e havia uma opção de tamanho de segmento máximo solicitando um mss de 1024 bytes. O Csam responde com um pacote similar, exceto por incluir um ack para o SYN do rtsg. Rtsg então pega o SYN do csam. O '.' significa que nenhuma bandeira foi definida. O pacote não contém dados, portanto, não há número de seqüência de dados. Observe que o número de sequência do ack é um inteiro pequeno (1). A primeira vez tcpdump vê uma 'conversa' tcp, ela imprime o número de seqüência do pacote. Nos pacotes subseqüentes da conversação, a diferença entre o número de seqüência do pacote atual e este número de seqüência inicial é impressa. Isso significa que os números de seqüência após o primeiro podem ser interpretados como posições de bytes relativos no fluxo de dados da conversa (com o primeiro byte de dados sendo cada direção '1'). '-S' substituirá esse recurso, fazendo com que os números de sequência originais sejam exibidos. Na sexta linha, o rtsg envia csam 19 bytes de dados (bytes 2 a 20 no lado rtsg -> csam da conversação). O sinalizador PUSH é definido no pacote. Na sétima linha, csam diz que recebeu dados enviados por rtsg até, mas não incluindo byte 21. A maioria desses dados está aparentemente no buffer de soquete, já que a janela de recepção do csam ficou 19 bytes menor. O Csam também envia um byte de dados para o rtsg neste pacote. Nas oitava e nona linhas, o csam envia dois bytes de dados urgentes enviados para o rtsg. Se o instantâneo fosse pequeno o suficiente tcpdump não capturou o cabeçalho TCP completo, ele interpreta o máximo possível do cabeçalho e depois reporta "| tcp '' para indicar que o restante não pode ser interpretado. Se o cabeçalho contiver uma opção falsa (uma com um tamanho muito pequeno ou além do final do cabeçalho), tcpdump relata como " má opção '' e não interpreta mais nenhuma opção (já que é impossível dizer onde eles começam). Se o comprimento do cabeçalho indica que as opções estão presentes, mas o comprimento do datagrama IP não é longo o suficiente para que as opções estejam realmente lá, tcpdump relata como " comprimento ruim do hdr ''. Capturar pacotes com combinações de sinalizadores específicas. Existem oito bits na seção de bits de controle do cabeçalho TCP: CWR | ECE | URG | ACK | PSH | RST | SYN | FIN Vamos supor que queremos observar os pacotes usados no estabelecimento de uma conexão TCP. Lembre-se de que o TCP usa um protocolo de handshake de três vias quando inicializa uma nova conexão; a seqüência de conexão com relação aos bits de controle TCP é: Agora estamos interessados em capturar pacotes que tenham apenas o bit SYN definido (Etapa 1). Note que não queremos pacotes do passo 2 (SYN-ACK), apenas um SYN inicial simples. O que precisamos é de uma expressão de filtro correta para tcpdump . Lembre-se da estrutura de um cabeçalho TCP sem opções: 0 15 31-----------------------------------------------------------------| porta de origem | porto de destino |-----------------------------------------------------------------| número de sequência |-----------------------------------------------------------------| número de confirmação |-----------------------------------------------------------------| HL | rsvd | C | E | U | A | P | R | S | F | tamanho da janela |-----------------------------------------------------------------| Soma de verificação TCP | ponteiro urgente |-----------------------------------------------------------------
Um cabeçalho TCP geralmente contém 20 octetos de dados, a menos que as opções estejam presentes. A primeira linha do gráfico contém octetos 0-3, a segunda linha mostra octetos 4-7, etc. Começando a contar com 0, os bits de controle TCP relevantes estão contidos no octeto 13: 0 7| 15| 23| 31----------------|---------------|---------------|----------------| HL | rsvd | C | E | U | A | P | R | S | F | tamanho da janela |----------------|---------------|---------------|----------------| | 13 octeto | | |
Vamos dar uma olhada no octeto não. 13: | | |---------------| | C | E | U | A | P | R | S | F | |---------------| |7 5 3 0|
Estes são os bits de controle TCP nos quais estamos interessados. Nós numeramos os bits neste octeto de 0 a 7, da direita para a esquerda, então o bit PSH é o bit número 3, enquanto o bit URG é o número 5. Lembre-se de que queremos capturar pacotes apenas com o conjunto SYN. Vamos ver o que acontece com o octeto 13 se um datagrama TCP chegar com o bit SYN definido em seu cabeçalho: | C | E | U | A | P | R | S | F | |---------------| |0 0 0 0 0 0 1 0| |---------------| |7 6 5 4 3 2 1 0|
Olhando para a seção de bits de controle, vemos que apenas o bit número 1 (SYN) está configurado. Supondo que o número do octeto 13 seja um inteiro não assinado de 8 bits na ordem de bytes da rede, o valor binário deste octeto é: 00000010 Sua representação decimal é: 7 6 5 4 3 2 1 00*2 + 0*2 + 0*2 + 0*2 + 0*2 + 0*2 + 1*2 + 0*2 = 2
Estamos quase terminando, porque agora sabemos que, se apenas SYN estiver definido, o valor do octeto 13 no cabeçalho TCP, quando interpretado como um inteiro não assinado de 8 bits na ordem de bytes da rede, deve ser exatamente 2. Essa relação pode ser expressa como tcp 13 == 2 Podemos usar essa expressão como filtro para tcpdump a fim de assistir pacotes que possuem apenas SYN set: tcpdump -i xl0 tcp 13 == 2 A expressão diz "deixe o octeto 13 de um datagrama TCP ter o valor decimal 2", que é exatamente o que queremos. Agora, vamos supor que precisamos capturar pacotes SYN, mas não nos importamos se o ACK ou qualquer outro bit de controle TCP for definido ao mesmo tempo. Veja o que acontece com o octeto 13 quando chega um datagrama TCP com o conjunto SYN-ACK: | C | E | U | A | P | R | S | F | |---------------| |0 0 0 1 0 0 1 0| |---------------| |7 6 5 4 3 2 1 0|
Os bits 1 e 4 estão agora no 13º octeto. O valor binário do octeto 13 é: 00010010 que se traduz em decimal: 7 6 5 4 3 2 1 00*2 + 0*2 + 0*2 + 1*2 + 0*2 + 0*2 + 1*2 + 0*2 = 18
Não podemos simplesmente usar 'tcp 13 == 18' no tcpdump expressão de filtro, porque isso selecionaria apenas os pacotes que possuem o conjunto SYN-ACK, mas não aqueles com apenas o conjunto SYN. Lembre-se de que não nos importamos se o ACK ou qualquer outro bit de controle estiver definido, desde que o SYN esteja configurado. Para atingir nosso objetivo, precisamos logicamente E o valor binário do octeto 13 com algum outro valor para preservar o bit SYN. Sabemos que queremos que SYN seja configurado em qualquer caso, portanto, logicamente E o valor no octeto 13 com o valor binário de um SYN: 00010010 SYN-ACK 00000010 SYN E 00000010 (queremos SYN) E 00000010 (queremos SYN) -------- -------- = 00000010 = 00000010
Vemos que essa operação AND fornece o mesmo resultado, independentemente de o ACK ou outro bit de controle TCP estar definido. A representação decimal do valor AND, assim como o resultado dessa operação, é 2 (binário 00000010), portanto, sabemos que para pacotes com SYN, a seguinte relação deve ser verdadeira: ((valor do octeto 13) E (2)) == (2) Isso nos aponta para o tcpdump expressão de filtro tcpdump -i xl0 'tcp 13 e 2 == 2' Observe que você deve usar aspas simples ou uma barra invertida na expressão para ocultar o caractere especial AND ('&') do shell. Pacotes UDP. O formato UDP é ilustrado por este pacote rwho: actinide.who> broadcast.who: udp 84
Isso diz que a porta quem no host actinídeo enviou um datagrama udp para a porta quem no host transmissão , o endereço de transmissão da Internet. O pacote continha 84 bytes de dados do usuário. Alguns serviços UDP são reconhecidos (do número da porta de origem ou de destino) e as informações de protocolo de nível superior são impressas - em particular, solicitações de serviço de Nome de Domínio (RFC-1034/1035) e chamadas Sun RPC (RFC-1050) para NFS. Solicitações do Servidor de Nome UDP (N.B .: A descrição a seguir pressupõe familiaridade com o protocolo do Serviço de Domínio descrito no RFC-1035. Se você não estiver familiarizado com o protocolo, a descrição a seguir fará pouco sentido.) As solicitações do servidor de nomes são formatadas como: src> dst: id op? flags qtype qclass nome (len) h2opolo.1538> helios.domain: 3+ A? ucbvax.berkeley.edu. (37)
Hospedeiro h2opolo perguntou ao servidor de domínio helios para um registro de endereço (qtype = A) associado ao nome ucbvax.berkeley.edu. O ID da consulta era "3". O '+' indica o recursão desejada bandeira foi definida. O comprimento da consulta foi de 37 bytes, não incluindo os cabeçalhos do protocolo UDP e IP. A operação de consulta era a normal, Inquerir , então o campo op foi omitido. Se o op fosse qualquer outra coisa, teria sido impresso entre o '3' e o '+'. Da mesma forma, a qclass era a normal, C_IN e omitido. Qualquer outra qclass teria sido impressa imediatamente após o 'A'. Algumas anomalias são verificadas e podem resultar em campos extras entre colchetes: Se uma consulta contiver uma resposta, registros de autoridade ou seção de registros adicionais, ancount , nscount ou arcount são impressos como ' n uma', ' n n 'ou' n au 'onde n é a contagem apropriada. Se algum dos bits de resposta for definido (AA, RA ou rcode) ou qualquer um dos bits `deve ser zero 'ser definido nos bytes dois e três,` b2 & 3 = x 'é impresso, onde x é o valor hexadecimal dos bytes de cabeçalho dois e três. Respostas do servidor de nomes UDP. As respostas do servidor de nomes são formatadas como: src> dst: id op rcode sinalizadores a / n / au tipo de dados de classe (len) helios.domain> h2opolo.1538: 3 3/3/7 A 128.32.137.3 (273)helios.domain> h2opolo.1537: 2 NXDomain * 0/1/0 (97)
No primeiro exemplo, helios responde ao id de consulta 3 de h2opolo com três registros de resposta, três registros de servidor de nomes e sete registros adicionais. O primeiro registro de resposta é do tipo A (endereço) e seus dados são o endereço de internet 128.32.137.3. O tamanho total da resposta foi de 273 bytes, excluindo os cabeçalhos UDP e IP. O op (Consulta) e o código de resposta (NoError) foram omitidos, assim como a classe (C_IN) do registro A. No segundo exemplo, helios responde à consulta 2 com um código de resposta de domínio inexistente (NXDomain) sem respostas, um servidor de nomes e nenhum registro de autoridade. O '*' indica que o resposta autoritativa bit foi definido. Como não havia respostas, nenhum tipo, classe ou dados foram impressos. Outros caracteres de sinalização que podem aparecer são '-' (recursão disponível, RA, não set) e '|' (mensagem truncada, TC, set). Se a seção "pergunta" não contiver exatamente uma entrada, ' n q 'é impresso. Observe que as solicitações e respostas do servidor de nomes tendem a ser grandes e o padrão snaplen de 68 bytes pode não capturar o suficiente do pacote para imprimir. Use o-s flag para aumentar o snaplen se você precisar investigar seriamente o tráfego do servidor de nomes. '-s 128'funcionou bem para mim. Decodificação SMB / CIFS. tcpdump inclui decodificação SMB / CIFS / NBT razoavelmente extensa para dados em UDP / 137, UDP / 138 e TCP / 139. Alguns primitivos decodificação de dados IPX e NetBEUI SMB também são feitos. Por padrão, uma decodificação razoavelmente mínima é feita, com um decodificador muito mais detalhado feito se -v for usado. Esteja avisado que com -v um único pacote SMB pode ocupar uma página ou mais, então use somente -v se você realmente quiser todos os detalhes. Se você estiver decodificando sessões SMB contendo cadeias de caracteres unicode, talvez deseje definir a variável de ambiente USE_UNICODE como 1. Um patch para detectar automaticamente strings unicode seria bem-vindo. Para obter informações sobre os formatos de pacotes SMB e o que todos os campos significam, consulte www.cifs.org ou o diretório pub / samba / specs / em seu site espelho samba.org favorito. Os patches SMB foram escritos por Andrew Tridgell ([email protected]). Solicitações e respostas do NFS. As solicitações e respostas do Sun NFS (Network File System) são impressas como: src.xid> dst.n
Formato de saída do Tcpdump