Jak wyświetlić interfejs w przepływie wyjściowym tcpdump?

20

Wydaje się to dość trywialnym problemem, ale po kilku poszukiwaniach nie mogę znaleźć odpowiedzi. Można uruchomić tcpdump używając „any” jako opisu interfejsu, tj .:

 # tcpdump -i any -n host 192.168.0.1

Czy jest jakiś sposób, aby zmusić tcpdump do pokazania, na którym interfejsie wyświetlany pakiet został przechwycony?

Aktualizacja:

Ponieważ coraz więcej osób potwierdziło, że prawdopodobnie nie jest to możliwe w przypadku waniliowego programu tcpdump, czy ktoś może zaproponować rozwiązanie wspomnianego problemu? Być może inny sniffer?

Ogólny problem jest następujący: W systemie z 50 interfejsami określ interfejs wejściowy dla pakietów pochodzących z określonego adresu IP.

mdrozdziel
źródło

Odpowiedzi:

19

Mam nadzieję, że ktoś nadal jest zainteresowany rozwiązaniem problemu. ;) W naszej firmie mieliśmy ten sam problem i zacząłem pisać scenariusz.

Napisałem o tym post na blogu z kodem źródłowym i zrzutem ekranu .

Udostępniłem to również poniżej ...

wprowadź opis zdjęcia tutaj

I kod: (Pamiętaj, aby sprawdzić moją witrynę pod kątem przyszłych aktualizacji)

#!/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
źródło
6

Możesz użyć opcji -e do wydrukowania nagłówków ethernetowych, a następnie możesz skorelować adresy MAC src / dst z interfejsami sieciowymi;).

Cip
źródło
Użycie -epowoduje wydrukowanie tylko jednego adresu MAC w każdej linii. W przypadku pakietów przychodzących jest to źródłowy adres MAC, który nie jest bardzo przydatny w identyfikowaniu interfejsu, do którego przyszedł.
kasperd
1

Nie znam też na to żadnej odpowiedzi. Nie znajduję dla niego żadnej opcji, nie mogę sobie przypomnieć, że kiedykolwiek ją widziałem, i jestem raczej pewien, że format tcpdump nie zawiera identyfikatora interfejsu. Myślę, że będziesz musiał uruchomić jedną instancję tcpdump dla każdego interfejsu i zalogować się do odpowiednich plików.

Jeff Ferland
źródło
Zgadzam się. Zazwyczaj, gdy wącham ruch, już wiem, skąd ruch przychodzi lub dokąd zmierza. Jeśli muszę to rozgryźć, najpierw mam większą rybę do smażenia ...
Corey S.
2
Bardzo często potrzebuję tej funkcji. Mam kilka interfejsów, wiele interfejsów vlan, z IGP i BGP na dodatek. Bardzo często bardzo ważne jest ustalenie, w jaki sposób przepływają pakiety. Mogę ręcznie sprawdzić interfejs wychodzący, sprawdzając bieżącą tabelę routingu. Ale jeśli muszę znaleźć sposób, w jaki pakiety przychodzą z Internetu, czasami muszę sprawdzać na ślepo, po prostu uruchamiając tcpdump na najbardziej prawdopodobnych interfejsach. :(
mdrozdziel 21.01.11
1

Jeśli korzystasz z komputera Mac, istnieje -kopcja, tcpdumpjeśli korzystasz z interfejsu pktap, który zrzuca nazwę interfejsu wśród innych przydatnych metadanych.

   -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
źródło
1

Aby dodać do świetnego skryptu bash Sebastiana Haasa. Musiałem uprościć jego skrypt, ponieważ zawiódł w tej linii tcpdump -l $@ | sed 's/^/[Interface:'"${BASH_REMATCH[0]:2}"'] /' &.

Chociaż nie jest tak elastyczny jak oryginalny skrypt, jest bardziej prawdopodobne, że będzie działał w uproszczonym systemie Linux.

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

Być może interesuje Cię bieżący bilet wydania github dotyczący pominięcia tej funkcji na https://github.com/the-tcpdump-group/tcpdump/issues/296 .

Brian
źródło
0

Zakładając, że tak jest w Linuksie, możesz dodać regułę iptables, aby dopasować pakiet, którego szukasz, i zalogować go. Dziennik Iptables zawiera między innymi interfejsy wejściowe i wyjściowe.

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

Dostosuj -c w razie potrzeby.

Nathan
źródło
0

modyfikując linię detekcji interfejsu, możesz wyeliminować interfejsy alias-adres w Linuksie. próbka poniżej ..

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

zmiany w

for interface in $(ifconfig | grep flags | sed s/': '/' ~ '/g | grep -v : | awk '{print $1}')
LTK-Tog
źródło