数据包捕获:基于接收和发送过滤

我遇到了一个网络问题,源MAC地址与我的主机的源MAC地址之一匹配的帧到达了主机 - 这是一个明显的重复MAC地址、环路或其他L2问题。 我相信这是这种情况,因为我的Linux桥接的MAC表(CAM表)记录了上行端口上托管虚拟机的本地MAC地址,并且内核日志显示了错误信息。
bridgename: received packet on bond0.2222 with own address as source address
我想要获取关于这些“流氓”数据包/帧的更多细节,但是我无法找出如何准确地定位它们。使用tcpdump,你可以根据特定源MAC地址进行过滤('ether src MAC'),但这是基于帧中的字节,而不是帧是“发送出去”还是“接收进来”。通常我们假设具有我们源MAC地址的帧意味着我们正在发送它,但如果接收到重复的帧,对于过滤器来说内容看起来完全相同。 在数据包捕获中,如何观察一个帧是接收还是传输的?

1tcpdump -i <interface> inbound(或者"outbound")不起作用吗? - user186340
根据man手册的描述,似乎只限于SLIP。但是当我尝试在任何接口上使用它(回环、以太网/光纤、绑定、虚拟局域网、tap...),tcpdump会显示:“tcpdump: inbound/outbound not supported on linktype 1”。 - Joshua Miller
2这并不回答你的问题,但是使用iptables和ulogd,你可以获得一个只包含有趣数据包的pcap文件。 - lsmooth
使用tcpdump -L命令查看支持的接口。 - PersianGulf
use ngrep -d dev - PersianGulf
似乎对于“任意”接口,“入站”/“出站”方式可以工作,但似乎不太可靠。在 CentOS 系统上似乎有效,但在 Ubuntu 上似乎有效,但会过滤所有数据包。 - Joshua Miller
2个回答

使用--direction选项来tcpdump:
-Q direction
--direction=direction
       Choose send/receive direction direction for which packets should be
       captured. Possible values are `in', `out' and `inout'. Not available on
       all platforms.

1这个选项似乎只在最新稳定版本的tcpdump - 4.6.2中可用。但在Ubuntu上构建后,它似乎成功区分了入站和出站帧。太棒了! - Joshua Miller
1@JoshuaMiller我刚在Ubuntu 14.04上检查了tcpdump的man页面,发现有一个具有完全相同描述的选项,但它被称为-P而不是-Q(长格式没有提到)。 - kasperd
@kasperd 你说得对!tcpdump 4.5.1 实际上有 -P 这个选项。也许这个功能并不像我最初想的那样新。 - Joshua Miller

使用iptables,您可以为传入和传出的数据包设置不同的“链”。根据iptables(8)手册的说明:
... the chains INPUT and OUTPUT are only traversed for packets coming into 
the local host and originating from the local host  respectively.   Hence 
every  packet  only  passes  through one of the three chains (except 
loopback traffic, which involves both INPUT and OUTPUT chains) ...
iptables可以进行一些日志记录(-l),这可能会显示您所需的内容。它还可以将数据包的副本转发到接口以便使用其他工具进行日志记录,但我没有理由这样做。