Назад | Перейти на главную страницу

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

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

 # tcpdump -i any -n host 192.168.0.1

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

Обновить:

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

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

Надеюсь, кого-то еще интересует решение проблемы. ;) У нас была такая же проблема в нашей компании, и я начал писать сценарий для этого.

Я написал об этом сообщение в блоге с исходным кодом и скриншотом.

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

И код: (Обязательно проверяйте мой сайт на предмет будущих обновлений)

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

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

Чтобы добавить в отличный сценарий 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 .

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

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

Если вы работаете на 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.
for interface in `ifconfig | grep '^[a-z0-9]' | awk '{print $1}'`;do echo $interface;tcpdump -i $interface -nn -c 25;done

При необходимости измените -c.

изменяя строку определения интерфейса, вы можете удалить интерфейсы псевдонимов в 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}')