如何在tcpdump输出流中显示界面?


20

这似乎是一个微不足道的问题,但是经过一番搜索,我仍然无法找出答案。可以使用“ any”作为接口描述来运行tcpdump,即:

 # tcpdump -i any -n host 192.168.0.1

有什么方法可以强制tcpdump显示在哪个接口上捕获了显示的数据包?

更新:

随着越来越多的人确认香草tcpdump可能无法实现这一点,有人可以提出解决方案吗?也许不同的嗅探器?

一般问题如下:在具有50个接口的系统上,确定来自特定ip地址的数据包的入站接口是什么。

Answers:


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选项来打印以太网标头,然后可以将src / dst MAC地址与网络接口相关联;)。


-e仅使用在每一行上打印一个MAC地址。对于传入的数据包来说,它是源MAC,它对于确定到达哪个接口不是很有用。
卡巴斯德(Kasperd),

1

我也不知道有任何答案。我找不到任何选择,无法回忆起曾经看到的任何东西,并且可以肯定的是tcpdump格式不包含接口标识符。我认为您必须为每个接口启动一个tcpdump实例并登录到相应的文件。


我同意。通常,当我嗅探流量时,我已经知道流量来自何处或往何处。如果我必须弄清楚,我先要炸更大的鱼……
Corey S.11年

2
我真的经常需要此功能。我有几个接口,很多VLAN接口,在此之上还有IGP和BGP。通常,找出数据包如何流动至关重要。我可以通过检查当前路由表来手动检查出站接口。但是,如果我必须找到数据包来自Internet的方式,有时我就必须通过在大多数可能的接口上启动tcpdump来进行盲目检查。:(
mdrozdziel11年

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;

您可能也对https://github.com/the-tcpdump-group/tcpdump/issues/296中有关此功能遗漏的当前github问题票感兴趣。


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}')
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.