Comment afficher l'interface dans le flux de sortie tcpdump?

20

Cela semble être un problème assez banal, mais après quelques recherches, je n'arrive pas à trouver la réponse. On peut exécuter tcpdump en utilisant "any" comme description de l'interface, c'est-à-dire:

 # tcpdump -i any -n host 192.168.0.1

Existe-t-il un moyen de forcer tcpdump à montrer sur quelle interface le paquet affiché a été capturé?

Mise à jour:

Comme plus de personnes ont confirmé que ce n'est probablement pas possible avec vanilla tcpdump, quelqu'un peut-il proposer une solution au problème mentionné? Peut-être un renifleur différent?

Le problème général est le suivant: sur un système avec 50 interfaces, déterminez quelle est l'interface entrante pour les paquets provenant d'une adresse IP spécifique.

mdrozdziel
la source

Réponses:

19

J'espère que quelqu'un est toujours intéressé par la solution du problème. ;) Nous avons eu le même problème dans notre entreprise et j'ai commencé à écrire un script pour cela.

J'ai écrit un blog à ce sujet avec le code source et une capture d'écran .

Je l'ai également partagé ci-dessous ...

entrez la description de l'image ici

Et le code: (Assurez-vous de consulter mon site pour les futures mises à jour)

#!/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
la source
6

Vous pouvez utiliser l'option -e pour imprimer les en-têtes Ethernet, puis vous pouvez corréler les adresses MAC src / dst avec vos interfaces réseau;).

Cip
la source
L'utilisation -en'imprime qu'une seule adresse MAC sur chaque ligne. Pour les paquets entrants, c'est le MAC source qui n'est pas très utile pour identifier sur quelle interface il est arrivé.
kasperd
1

Je ne connais pas non plus de réponse à cela. Je ne trouve aucune option pour cela, je ne me souviens pas d'en avoir vu un, et je suis plutôt certain que le format tcpdump n'inclut pas d'identifiant d'interface. Je pense que vous devrez démarrer une instance de tcpdump pour chaque interface et vous connecter aux fichiers respectifs.

Jeff Ferland
la source
Je suis d'accord. En général, lorsque je renifle du trafic, je sais déjà d'où vient le trafic ou où il va. Si je dois comprendre cela, j'ai d'abord de plus gros poissons à faire frire ...
Corey S.
2
J'ai vraiment besoin de cette fonctionnalité très souvent. J'ai plusieurs interfaces, beaucoup d'interfaces vlan, avec IGP et BGP en plus de cela. Il est très souvent essentiel de savoir comment les paquets circulent. Je peux vérifier manuellement l'interface sortante en examinant la table de routage actuelle. Mais si je dois trouver la façon dont les paquets proviennent d'Internet, je dois parfois faire une vérification à l'aveugle, simplement en démarrant tcpdump sur les interfaces les plus probables. :(
mdrozdziel
1

Si vous exécutez sur Mac, il existe une -koption tcpdumpsi vous utilisez l'interface pktap, qui sauvegarde le nom de l'interface parmi d'autres métadonnées utiles.

   -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
la source
1

Pour ajouter au grand script bash de Sebastian Haas. J'ai dû simplifier son script car il a échoué sur cette ligne tcpdump -l $@ | sed 's/^/[Interface:'"${BASH_REMATCH[0]:2}"'] /' &.

Bien qu'il ne soit pas aussi flexible que le script d'origine, il est plus susceptible de fonctionner dans un système Linux allégé.

#!/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;

Vous pouvez également être intéressé par le ticket de problème github actuel concernant cette omission de fonctionnalité dans https://github.com/the-tcpdump-group/tcpdump/issues/296 .

Brian
la source
0

En supposant que c'est sous Linux, vous pouvez ajouter une règle iptables pour correspondre au paquet que vous recherchez et l'enregistrer. Le journal Iptables comprend, entre autres, les interfaces d'entrée et de sortie.

vadimk
la source
0
for interface in `ifconfig | grep '^[a-z0-9]' | awk '{print $1}'`;do echo $interface;tcpdump -i $interface -nn -c 25;done

Ajustez -c au besoin.

Nathan
la source
0

en modifiant la ligne de détection d'interface, vous pouvez éliminer les interfaces adresse-alias sous linux. échantillon ci-dessous ..

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

modifications apportées à

for interface in $(ifconfig | grep flags | sed s/': '/' ~ '/g | grep -v : | awk '{print $1}')
LTK-Tog
la source