tcpdump可通过ether关键字直接按MAC地址过滤,如“ether dst 00:11:22:33:44:55”;也可用十六进制偏移匹配如“ether[0:6]==0x001122334455”,但推荐前者,更简洁可靠且兼容VLAN。
tcpdump 本身不直接支持按 MAC 地址过滤(因为它是工作在 OSI 第三层以上的抓包工具,默认解析到 IP 层),但可以通过底层 BPF(Berkeley Packet Filter)语法,结合数据链路层(Layer 2)的原始字节偏移来实现基于源/目的 MAC 地址的精确过滤。关键在于:**在以太网帧中,MAC 地址位于固定位置,可利用 tcpdump 的 `ether` 关键字或十六进制偏移匹配完成筛选。**
使用 ether 关键字直接过滤(推荐)
tcpdump 内置了对以太网帧字段的语义支持,无需手动计算偏移。这是最简洁、可读性最强的方式:
抓取目标 MAC 为 00:11:22:33:44:55 的所有报文
:
tcpdump -i eth0 ether dst 00:11:22:33:44:55
抓取源 MAC 为 aa:bb:cc:dd:ee:ff 的报文
:
tcpdump -i eth0 ether src aa:bb:cc:dd:ee:ff
同时匹配源和目的 MAC(例如点对点链路)
:
tcpdump -i eth0 "ether src aa:bb:cc:dd:ee:ff and ether dst 00:11:22:33:44:55"
用十六进制偏移匹配(适用于特殊场景)
当需要绕过 tcpdump 解析逻辑(如处理非标准帧、混杂模式下含 VLAN 标签的帧),或验证 MAC 字段内容时,可手动定位以太网帧中的 MAC 字段。以太网帧结构如下(无 VLAN):
前 6 字节:目的 MAC
次 6 字节:源 MAC
后 2 字节:EtherType
因此可用以下方式匹配:
匹配目的 MAC(从第 0 字节起)
:
tcpdump -i eth0 "ether[0:6] == 0x001122334455"
匹配源 MAC(从第 6 字节起)
:
tcpdump -i eth0 "ether[6:6] == 0xaabbccddeeff"
注意
:该写法要求 MAC 地址按网络字节序(大端)拼接为 6 字节整数;实际中建议优先用
,更可靠且兼容 VLAN。
注意事项与常见问题
实际使用中需留意几个关键点,否则可能抓不到预期报文:
接口必须处于混杂模式或已学习到目标 MAC
:交换机端口默认只转发目的 MAC 匹配本机或广播/组播的帧;若目标设备不在同一子网或未通信过,可能收不到其报文。可先 ping 或 arping 触发 ARP 学习。
VLAN 环境下帧结构变化
:带 802.1Q 标签的帧中,MAC 位置不变,但 EtherType 变为 0x8100,后续才是真实类型。
仍有效;偏移匹配也适用(VLAN 标签插入在源 MAC 和 EtherType 之间,不影响前 12 字节)。
避免混淆 IP 和 MAC 过滤
:不要写成
——这是无效语法;tcpdump 的
仅作用于网络层地址(IPv4/IPv6)。
快速验证是否生效的小技巧
在执行过滤前,先确认目标 MAC 是否出现在本地流量中:
运行
tcpdump -i eth0 -c 10 -e
(-e 显示链路层头),观察输出中的
lladdr
字段,确认目标 MAC 确实经过该接口。
配合
arp -a
或
ip neigh show
查看已知邻居的 MAC,确保地址准确无误(注意大小写和分隔符,tcpdump 支持
、
、无分隔符等多种格式)。
若仍无输出,尝试去掉过滤条件,抓全量帧再用
检查 MAC 是否存在,排除物理链路或驱动问题。
ether src/dstether src/dsthost 00:11:22:33:44:55host:-grep