Як відобразити інтерфейс у вихідному потоці tcpdump?


20

Це здається досить тривіальною проблемою, але після деяких пошуків я не можу зрозуміти відповіді. Можна запустити tcpdump, використовуючи "будь-який" як опис інтерфейсу, тобто:

 # tcpdump -i any -n host 192.168.0.1

Чи є який-небудь спосіб змусити tcpdump показати, на який інтерфейс відображений пакет був зроблений?

Оновлення:

Оскільки більше людей підтвердили, що це, мабуть, неможливо з ванільним tcpdump, може хтось запропонувати рішення згаданої проблеми? Можливо, різний нюхач?

Загальна проблема полягає в наступному: У системі з 50 інтерфейсами визначте, що таке вхідний інтерфейс для пакетів, що надходять з певної ip адреси.

Відповіді:


19

Сподіваюся, хтось все ще зацікавлений у вирішенні проблеми. ;) У нас був той самий випуск у нашій компанії, і я почав писати сценарій для цього.

Я написав про це повідомлення в блозі з вихідним кодом та скріншотом .

Я також поділився ним нижче ...

введіть тут опис зображення

І код: (Обов’язково перевіряйте мій сайт на майбутні оновлення)

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

Ви можете використовувати опцію -e для друку заголовків Ethernet, тоді ви можете співвіднести MAC-адреси src / dst з вашими мережевими інтерфейсами;).


Використовуючи -eлише друкує одну MAC-адресу в кожному рядку. Для вхідних пакетів це вихідний MAC, який не дуже корисний при визначенні інтерфейсу, на який він прийшов.
kasperd

1

Я не знаю жодної відповіді на це. Я не знаходжу для нього жодного варіанту, не можу згадати, що коли-небудь бачив його, і я впевнений, що формат tcpdump не містить ідентифікатор інтерфейсу. Я думаю, вам доведеться запустити один екземпляр tcpdump для кожного інтерфейсу та увійти до відповідних файлів.


Я згоден. Як правило, коли я нюхаю трафік, я вже знаю, звідки йде трафік або куди йде. Якщо мені доведеться це зрозуміти, у мене є більша риба, щоб першим смажити ...
Corey S.

2
Мені дуже часто ця функціональність потрібна. У мене є декілька інтерфейсів, багато інтерфейсів vlan, з версією IGP та BGP. Дізнатися, як пакети течуть, дуже важливо дуже часто. Я можу вручну перевірити вихідний інтерфейс, вивчивши поточну таблицю маршрутизації. Але якщо мені доведеться знайти шляхи, що надходять з Інтернету, іноді доводиться робити сліпу перевірку, лише запустивши tcpdump на найбільш вірогідних інтерфейсах. :(
mdrozdziel

1

Якщо ви працюєте на Mac, є -kможливість, tcpdumpякщо ви використовуєте pktap інтерфейс, який скидає ім'я інтерфейсу серед інших корисних метаданих.

   -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

Щоб додати до чудового сценарію баш Себастьяна Хааса. Мені довелося спростити його сценарій, оскільки він не вдався до цього рядка tcpdump -l $@ | sed 's/^/[Interface:'"${BASH_REMATCH[0]:2}"'] /' &.

Хоча він не такий гнучкий, як оригінальний сценарій, він швидше запускається в зведеній системі 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;

Вас також може зацікавити поточний квиток на випуск github щодо пропуску цієї функції на https://github.com/the-tcpdump-group/tcpdump/isissue/296 .


0

Якщо припустити, що це в Linux, ви можете додати правило iptables, щоб відповідати шуканому пакету та ввійти в нього. Журнал Iptables включає в себе інтерфейси входу та виходу, серед іншого.


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

Відрегулюйте -c за потребою.


0

змінивши лінію виявлення інтерфейсу, ви можете усунути інтерфейси псевдоніму в Linux. зразок нижче ..

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

зміни до

for interface in $(ifconfig | grep flags | sed s/': '/' ~ '/g | grep -v : | awk '{print $1}')
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.