Como capturar o conteúdo do primeiro pacote de conexões TCP usando o tcpdump

2

Tenho a tarefa de monitorar e depurar um serviço da web SOAP, no nível da rede. Eu posso usar tcpdump para capturar todo o tráfego proveniente de clientes na porta 80, mas não posso limitar a captura de cada solicitação apenas ao primeiro pacote de camada de aplicativo recebido (o pacote mais significativo neste caso, que carrega o Cabeçalho de solicitação HTTP e início do documento XML SOAP). Eu quero saber qual tcpdump switch (ou combinação de outros comandos linux) para usar para obter este primeiro pacote para cada conexão TCP, e descartar o restante dos pacotes recebidos para a mesma conexão.

Se possível, ter o primeiro pacote de resposta (e provavelmente o único, porque neste aplicativo, documentos XML de resposta são pequenos) enviados do servidor para o cliente, também seria bom.

Atualmente, executo tcpdump -i any -A 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' example da página tcpdump man, portanto, não recebo os pacotes de handshake TCP.

E o problema com a opção -c é tcpdump após a captura do pacote, enquanto eu preciso que ele continue em execução e continue mostrando as mesmas informações para as novas conexões. Idealmente, eu preciso de algo semelhante a tail ing arquivos de log de acesso do apache, juntamente com os primeiros pedaços significativos de solicitação e resposta.

    
por zaadeh 15.04.2014 / 11:39

3 respostas

3

Portanto, o seu pedido é realmente mais restrito do que o título sugere - você está procurando especificamente solicitações HTTP.

Eu uso o ngrep para isso, que combina a funcionalidade do tipo tcpdump e grep. por exemplo:

sudo ngrep -d eth0 '^(GET|POST) ' port 80

Isso lhe dará saída de texto. Se você quiser, pode usar a opção -w para gravar os pacotes correspondentes em um arquivo no formato tcpdump.

Use -d como acima para especificar a interface, pois -i é usado como grep para insensibilidade a maiúsculas e minúsculas.

O acima também incluirá solicitações de saída e assim por diante que talvez você não queira. anexe as opções do tipo tcpdump conforme necessário.

Se você estiver depurando solicitações para um URL específico, convém usá-lo para tornar a expressão regular mais específica. eg

sudo ngrep '^(GET|POST) /my/soap/interface .*Host: myhost.example.com' 'dst port 80 and dst host myhost.example.com'

No caso incomum em que a solicitação é dividida em vários pacotes com o cabeçalho do Host no segundo pacote, os itens acima podem falhar em capturar algumas solicitações. Principalmente isso não importa, mas você sempre pode capturar mais do que precisa com o tcpdump, dividi-lo em arquivos com o chaosreader e, em seguida, começar a usar os arquivos.

    
por 15.04.2014 / 16:25
4

Descarregue a captura em um arquivo ( -w option).

Você pode analisá-lo com wireshark depois, que tem um poderoso mecanismo de filtragem. Você terá acesso a todas as informações de que precisa: cabeçalhos, payload SOAP, etc ...

    
por 15.04.2014 / 11:53
4

Você provavelmente não quer apenas o primeiro pacote - os primeiros pacotes de uma sessão TCP são o handshake de 3 vias que define a sessão em primeiro lugar. No entanto, tcpdump tem o sinalizador -c , que permite capturar um número definido de pacotes.

    
por 15.04.2014 / 11:44