Como exibir a interface no fluxo de saída do tcpdump?

15

Este parece ser um problema bastante trivial, mas depois de algumas pesquisas eu não consigo descobrir a resposta. Pode-se executar o tcpdump usando "any" como descrição da interface, ou seja:

 # tcpdump -i any -n host 192.168.0.1

Existe alguma maneira de forçar o tcpdump a mostrar em qual interface o pacote exibido foi capturado?

Atualização:

Como mais pessoas confirmaram que isso provavelmente não é possível com o vanc tcpdump, alguém pode propor uma solução para o problema mencionado? Talvez farejador diferente?

O problema geral é o seguinte: Em um sistema com 50 interfaces, determine qual é a interface de entrada para pacotes provenientes de um endereço IP específico.

    
por mdrozdziel 20.01.2011 / 16:29

8 respostas

14

Espero que alguém ainda esteja interessado na solução do problema. ;) Tivemos o mesmo problema em nossa empresa e comecei a escrever um roteiro para isso.

Eu escrevi uma postagem no blog sobre isso com o código-fonte e uma captura de tela .

Eu também compartilhei abaixo ...

Eocódigo:(Certifique-sedeverificarmeusiteparaatualizaçõesfuturas)

#!/bin/bash #=================================================================================== # # FILE: dump.sh # USAGE: dump.sh [-i interface] [tcpdump-parameters] # DESCRIPTION: tcpdump on any interface and add the prefix [Interace:xy] in front of the dump data. # OPTIONS: same as tcpdump # REQUIREMENTS: tcpdump, sed, ifconfig, kill, awk, grep, posix regex matching # BUGS: --- # FIXED: - In 1.0 The parameter -w would not work without -i parameter as multiple tcpdumps are started. # - In 1.1 VLAN's would not be shown if a single interface was dumped. # NOTES: --- # - 1.2 git initial # AUTHOR: Sebastian Haas # COMPANY: pharma mall # VERSION: 1.2 # CREATED: 16.09.2014 # REVISION: 22.09.2014 # #=================================================================================== # When this exits, exit all background processes: trap 'kill $(jobs -p) &> /dev/null && sleep 0.2 && echo ' EXIT # Create one tcpdump output per interface and add an identifier to the beginning of each line: if [[ $@ =~ -i[[:space:]]?[^[:space:]]+ ]]; then tcpdump -l $@ | sed 's/^/[Interface:'"${BASH_REMATCH[0]:2}"'] /' & else for interface in $(ifconfig | grep '^[a-z0-9]' | awk '{print $1}') do tcpdump -l -i $interface -nn $@ | sed 's/^/[Interface:'"$interface"'] /' & done fi # wait .. until CTRL+C wait     
por 18.01.2015 / 00:05
6

Você pode usar a opção -e para imprimir os cabeçalhos de ethernet, então você pode correlacionar os endereços MAC src / dst com suas interfaces de rede;).

    
por 14.01.2013 / 18:03
1

Eu não sei de nenhuma resposta para isso também. Eu não acho nenhuma opção para isso, não me lembro de ter visto um, e estou certo de que o formato tcpdump não inclui um identificador de interface. Eu acho que você terá que iniciar uma instância do tcpdump para cada interface e registrar seus respectivos arquivos.

    
por 20.01.2011 / 16:42
1

Para adicionar ao grande roteiro de Sebastian Haas. Eu tive que simplificar o script dele, pois ele falhou nesta linha tcpdump -l $@ | sed 's/^/[Interface:'"${BASH_REMATCH[0]:2}"'] /' & .

Embora não seja tão flexível quanto o script original, é mais provável que ele seja executado no sistema linux simplificado.

#!/bin/sh
interfaces="eth0 ip6tnl1" # Interfaces list separated by whitespace
#===================================================================================
#
# FILE: dump-stripped.sh
# USAGE: dump.sh [tcpdump-parameters]
# DESCRIPTION: tcpdump on any interface and add the prefix [Interace:xy] in 
#               front of the dump data. Simplified to work in more limited env.
# OPTIONS: similar to tcpdump
# REQUIREMENTS: tcpdump, sed, ifconfig, kill, awk, grep, posix regex matching
# AUTHOR: Sebastian Haas (Stripped down By Brian Khuu)
#
#===================================================================================

# When this exits, exit all background processes:
trap 'kill $(jobs -p) &> /dev/null && sleep 0.2 &&  echo ' EXIT

# Create one tcpdump output per interface and add an identifier to the beginning of each line:
for interface in $interfaces;
do tcpdump -l -i $interface -nn $@ | sed 's/^/[Interface:'"$interface"'] /' 2>/dev/null & done;

# wait .. until CTRL+C
wait;

Você também pode estar interessado no ticket atual do problema do github sobre essa omissão no link .

    
por 13.04.2018 / 07:41
0

Assumindo que isso é no Linux, você pode adicionar uma regra iptables para combinar com o pacote que você está procurando e registrá-lo. O log do Iptables inclui interfaces de entrada e saída, entre outras coisas.

    
por 21.01.2011 / 03:19
0
for interface in 'ifconfig | grep '^[a-z0-9]' | awk '{print $1}'';do echo $interface;tcpdump -i $interface -nn -c 25;done

Ajuste -c conforme necessário.

    
por 21.12.2011 / 19:07
0

Se você estiver executando no Mac, há uma opção -k para tcpdump se você estiver usando a interface pktap, que despeja o nome da interface entre outros metadados úteis.

   -k     Control the display of packet metadata via an optional metadata_arg argument. This is useful when displaying packet saved in the
          pcap-ng file format or with interfaces that support the PKTAP data link type.

          By default, when the metadata_arg optional argument is not specified, any available packet metadata information is printed  out.

          The  metadata_arg  argument controls the display of specific packet metadata information using a flag word, where each character
          corresponds to a type of packet metadata as follows:

                 I     interface name (or interface ID)
                 N     process name
                 P     process ID
                 S     service class
                 D     direction
                 C     comment
                 U     process UUID (not shown by default)
                 A     display all types of metadata

          This is an Apple modification.
    
por 25.05.2017 / 01:12
0

ao modificar a linha de detecção de interface, você pode eliminar o endereço de alias interfaces no linux. amostra abaixo ..

for interface in $(ifconfig | grep '^[a-z0-9]' | awk '{print $1}')

muda para

for interface in $(ifconfig | grep flags | sed s/': '/' ~ '/g | grep -v : | awk '{print $1}')
    
por 14.12.2017 / 00:22