Come visualizzare l'interfaccia nel flusso di output di tcpdump?


20

Questo sembra essere un problema abbastanza banale, ma dopo alcune ricerche non riesco a capire la risposta. Si può eseguire tcpdump usando "any" come descrizione dell'interfaccia, ovvero:

 # tcpdump -i any -n host 192.168.0.1

C'è un modo per forzare tcpdump a mostrare su quale interfaccia il pacchetto visualizzato è stato catturato?

Aggiornare:

Dato che più persone hanno confermato che ciò non è probabilmente possibile con vanilla tcpdump, qualcuno può proporre una soluzione al problema menzionato? Forse un altro sniffer?

Il problema generale è il seguente: Su un sistema con 50 interfacce, determinare cos'è l'interfaccia in entrata per i pacchetti provenienti da un indirizzo IP specifico.

Risposte:


19

Spero che qualcuno sia ancora interessato alla soluzione del problema. ;) Abbiamo avuto lo stesso problema nella nostra azienda e ho iniziato a scrivere una sceneggiatura per questo.

Ho scritto un post sul blog con il codice sorgente e uno screenshot .

L'ho anche condiviso di seguito ...

inserisci qui la descrizione dell'immagine

E il codice: (Assicurati di controllare il mio sito per futuri aggiornamenti)

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

6

È possibile utilizzare l'opzione -e per stampare le intestazioni Ethernet, quindi è possibile correlare gli indirizzi MAC src / dst con le interfacce di rete;).


L'utilizzo -estampa solo un indirizzo MAC su ogni riga. Per i pacchetti in arrivo è il MAC di origine che non è molto utile per identificare l'interfaccia su cui è arrivato.
Kasperd,

1

Neanche io conosco alcuna risposta. Non trovo alcuna opzione, non ricordo di averne mai visto uno e sono piuttosto certo che il formato tcpdump non includa un identificatore di interfaccia. Penso che dovrai avviare un'istanza di tcpdump per ogni interfaccia e accedere ai rispettivi file.


Concordo. In genere quando sto annusando il traffico, so già da dove proviene il traffico o dove sta andando. Se devo capirlo, devo prima pescare pesci più grandi ...
Corey S.

2
Ho davvero bisogno di questa funzionalità molto spesso. Ho diverse interfacce, molte interfacce vlan, con IGP e BGP in cima a questo. Scoprire come fluiscono i pacchetti è essenziale molto spesso. Posso controllare manualmente l'interfaccia in uscita esaminando la tabella di routing corrente. Ma se devo trovare il modo in cui i pacchetti provengono da Internet, a volte devo fare un controllo cieco, semplicemente avviando tcpdump sulla maggior parte delle interfacce probabili. :(
mdrozdziel,

1

Se sei in esecuzione su Mac, esiste -kun'opzione per tcpdumputilizzare l'interfaccia pktap, che scarica il nome dell'interfaccia tra altri metadati utili.

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

1

Da aggiungere alla fantastica sceneggiatura di Sebastian Haas. Ho dovuto semplificare la sua sceneggiatura poiché non ha funzionato in questa linea tcpdump -l $@ | sed 's/^/[Interface:'"${BASH_REMATCH[0]:2}"'] /' &.

Sebbene non sia flessibile come lo script originale, è più probabile che venga eseguito in un sistema Linux ridotto.

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

Potresti anche essere interessato all'attuale ticket per l'emissione di github in merito a questa omissione della funzione in https://github.com/the-tcpdump-group/tcpdump/issues/296 .


0

Supponendo che questo sia su Linux, è possibile aggiungere una regola iptables per abbinare il pacchetto che si sta cercando e registrarlo. Il registro Iptables include interfacce di ingresso e uscita, tra le altre cose.


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

Regola -c secondo necessità.


0

modificando la linea di rilevamento dell'interfaccia, è possibile eliminare le interfacce alias-address in linux. campione sotto ..

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

cambia in

for interface in $(ifconfig | grep flags | sed s/': '/' ~ '/g | grep -v : | awk '{print $1}')
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.