Wie wird die Schnittstelle im tcpdump-Ausgabefluss angezeigt?

20

Dies scheint ein ziemlich triviales Problem zu sein, aber nach einigem Suchen kann ich die Antwort nicht herausfinden. Man kann tcpdump mit "any" als Schnittstellenbeschreibung ausführen, dh:

 # tcpdump -i any -n host 192.168.0.1

Gibt es eine Möglichkeit, tcpdump zu zwingen, anzuzeigen, auf welcher Schnittstelle das angezeigte Paket erfasst wurde?

Aktualisieren:

Da immer mehr Leute bestätigten, dass dies mit vanilla tcpdump wahrscheinlich nicht möglich ist, kann jemand eine Lösung für das erwähnte Problem vorschlagen? Vielleicht ein anderer Schnüffler?

Das allgemeine Problem lautet wie folgt: Bestimmen Sie auf einem System mit 50 Schnittstellen die eingehende Schnittstelle für Pakete, die von einer bestimmten IP-Adresse stammen.

mdrozdziel
quelle

Antworten:

19

Ich hoffe, jemand ist immer noch an der Lösung des Problems interessiert. ;) Wir hatten das gleiche Problem in unserer Firma und ich fing an, ein Skript dafür zu schreiben.

Ich habe einen Blog-Post darüber mit dem Quellcode und einem Screenshot geschrieben .

Ich habe es auch unten geteilt ...

Bildbeschreibung hier eingeben

Und der Code: (Achten Sie darauf, meine Website auf zukünftige Updates zu überprüfen)

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

Sie können die Option -e verwenden, um die Ethernet-Header zu drucken. Anschließend können Sie die src / dst-MAC-Adressen mit Ihren Netzwerkschnittstellen korrelieren.

Cip
quelle
Bei Verwendung von -enur einer MAC-Adresse wird in jeder Zeile gedruckt. Bei eingehenden Paketen ist es der Quell-MAC, der nicht sehr nützlich ist, um zu identifizieren, auf welcher Schnittstelle er angekommen ist.
Kasperd
1

Ich kenne auch keine Antwort darauf. Ich finde keine Option dafür, kann mich nicht erinnern, jemals eine gesehen zu haben, und bin mir ziemlich sicher, dass das tcpdump-Format keine Schnittstellen-ID enthält. Ich denke, Sie müssen eine tcpdump-Instanz für jede Schnittstelle starten und in entsprechenden Dateien protokollieren.

Jeff Ferland
quelle
Ich stimme zu. Wenn ich am Verkehr schnüffle, weiß ich normalerweise bereits, woher der Verkehr kommt oder wohin er geht. Wenn ich das herausfinden muss, muss ich zuerst größeren Fisch braten ...
Corey S.
2
Ich brauche diese Funktionalität wirklich sehr oft. Ich habe mehrere Schnittstellen, viele VLAN-Schnittstellen, mit IGP und BGP darüber hinaus. Sehr oft ist es wichtig herauszufinden, wie die Pakete fließen. Ich kann die ausgehende Schnittstelle manuell überprüfen, indem ich die aktuelle Routingtabelle untersuche. Aber wenn ich herausfinden muss, wie Pakete aus dem Internet kommen, muss ich manchmal blind prüfen, indem ich tcpdump auf den wahrscheinlichsten Schnittstellen starte. :(
mdrozdziel
1

Wenn Sie auf einem Mac ausgeführt werden, gibt es eine -kOption für tcpdumpdie Verwendung der pktap-Schnittstelle, die den Schnittstellennamen unter anderen nützlichen Metadaten ausgibt.

   -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
quelle
1

Hinzufügen zu Sebastian Haas 'großartigem Bash-Skript. Ich musste sein Skript vereinfachen, da es in dieser Zeile fehlschlug tcpdump -l $@ | sed 's/^/[Interface:'"${BASH_REMATCH[0]:2}"'] /' &.

Obwohl es nicht so flexibel ist wie das ursprüngliche Skript, ist es wahrscheinlicher, dass es in einem abgespeckten Linux-System ausgeführt wird.

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

Möglicherweise interessiert Sie auch das aktuelle Ticket für die Ausgabe des Githubs in Bezug auf dieses Feature in https://github.com/the-tcpdump-group/tcpdump/issues/296 .

Brian
quelle
0

Unter Linux können Sie eine iptables-Regel hinzufügen, die dem gesuchten Paket entspricht, und es protokollieren. Das Iptables-Protokoll enthält unter anderem Eingangs- und Ausgangsschnittstellen.

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

Passen Sie -c nach Bedarf an.

Nathan
quelle
0

Durch Ändern der Interface-Erkennungslinie können Sie die Alias-Adress-Interfaces unter Linux entfernen. Probe unten ..

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

ändert sich zu

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