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.

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

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


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.


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.

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 .


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.


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.


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}')
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.