Как отобразить интерфейс в выходном потоке tcpdump?

20

Это кажется довольно тривиальной проблемой, но после некоторых поисков я не могу найти ответ. Можно запустить tcpdump, используя «any» в качестве описания интерфейса, то есть:

 # tcpdump -i any -n host 192.168.0.1

Есть ли способ заставить tcpdump показать, на каком интерфейсе отображаемый пакет был захвачен?

Обновить:

Поскольку все больше людей подтвердили, что это невозможно с vanilla tcpdump, может кто-нибудь предложить решение упомянутой проблемы? Возможно, другой сниффер?

Общая проблема заключается в следующем: В системе с 50 интерфейсами определите, что является входящим интерфейсом для пакетов, поступающих с определенного IP-адреса.

mdrozdziel
источник

Ответы:

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 с вашими сетевыми интерфейсами;).

Cip
источник
Использование -eпечатает только один MAC-адрес в каждой строке. Для входящих пакетов это исходный MAC, который не очень полезен для определения, на какой интерфейс он поступил.
Касперд
1

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

Джефф Ферланд
источник
Я согласен. Обычно, когда я нюхаю трафик, я уже знаю, откуда идет трафик или куда он идет. Если мне нужно это выяснить, мне сначала нужно пожарить большую рыбу ...
Кори С.
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

Чтобы добавить к великому сценарию bash Себастьяна Хааса. Я должен был упростить его сценарий, так как он потерпел неудачу в этой строке 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/issues/296 .

Брайан
источник
0

Предполагая, что это в Linux, вы можете добавить правило iptables, соответствующее искомому пакету, и зарегистрировать его. Журнал Iptables включает в себя входящие и исходящие интерфейсы, между прочим.

vadimk
источник
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}')
ЛТК-Tog
источник