Como exibir interface no fluxo de saída tcpdump?

20

Esse parece ser um problema bastante trivial, mas, depois de algumas pesquisas, ainda não consigo descobrir a resposta. Pode-se executar o tcpdump usando "any" como a 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?

Atualizar:

Quanto mais pessoas confirmarem que isso provavelmente não é possível com o vanilla 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 o que é interface de entrada para pacotes provenientes de um endereço IP específico.

mdrozdziel
fonte

Respostas:

19

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

Eu escrevi um post sobre isso com o código fonte e uma captura de tela .

Eu também compartilhei abaixo ...

insira a descrição da imagem aqui

E o código: (Não deixe de conferir meu site para futuras atualizações)

#!/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
Sebastian Haas
fonte
6

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

Cip
fonte
Usar -eapenas imprime um endereço MAC em cada linha. Para pacotes recebidos, o MAC de origem não é muito útil para identificar em qual interface ele chegou.
kasperd
1

Também não sei resposta para isso. Não encontro nenhuma opção, não lembro de ter visto uma e tenho certeza de que o formato tcpdump não inclui um identificador de interface. Eu acho que você terá que iniciar uma instância tcpdump para cada interface e fazer logon nos respectivos arquivos.

Jeff Ferland
fonte
Eu concordo. Normalmente, quando estou cheirando o tráfego, já sei de onde vem ou para onde está indo. Se eu tenho que descobrir isso, eu tenho peixes maiores para fritar primeira ...
Corey S.
2
Eu realmente preciso dessa funcionalidade com muita frequência. Eu tenho várias interfaces, muitas interfaces vlan, com IGP e BGP em cima disso. Descobrir como os pacotes estão fluindo é essencial com muita frequência. Posso verificar manualmente a interface de saída examinando a tabela de roteamento atual. Mas se eu tiver que descobrir como os pacotes vêm da Internet, às vezes eu tenho que fazer uma verificação cega, apenas iniciando o tcpdump nas interfaces mais prováveis. :(
mdrozdziel
1

Se você estiver executando no Mac, existe a -kopção de tcpdumpusar 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.
Wei Shen
fonte
1

Para adicionar ao ótimo roteiro do bash de Sebastian Haas. Eu tive que simplificar o script dele, pois falhou nessa 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 seja executado em um sistema Linux despojado.

#!/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 de edição do github atual referente à omissão deste recurso em https://github.com/the-tcpdump-group/tcpdump/issues/296 .

Brian
fonte
0

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

vadimk
fonte
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.

Nathan
fonte
0

modificando a linha de detecção de interface, você pode eliminar as interfaces de alias-address 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}')
LTK-Tog
fonte