tcpdump:捕获几个 vlan 之一

bst*_*rre 12 vlan tcpdump packet-capture sniffing

我希望 tcpdump 捕获 VLAN 1000 或 VLAN 501。man pcap-filter说:

可以多次使用 vlan [vlan_id] 表达式来过滤 VLAN 层次结构。每次使用该表达式都会将过滤器偏移量增加 4。

当我做:

tcpdump -vv -i eth1 \( vlan 1000 \) and \( ip host 10.1.1.98 or ip host 10.1.1.99 \)
Run Code Online (Sandbox Code Playgroud)

我得到捕获的数据包。

但是当我这样做时:

tcpdump -vv -i eth1 \( vlan 1000 or vlan 501 \) and \( ip host 10.1.1.98 or ip host 10.1.1.99 \)
Run Code Online (Sandbox Code Playgroud)

我没有收到任何数据包——我推测是因为手册页中描述的“增加 4”行为。

如何一次捕获多个 VLAN 上的流量?

bst*_*rre 15

我记得你可以直接检查数据包字节。因此,直接查看以太网标头是有效的:

tcpdump -vv -i eth1 '( vlan and ( ether[14:2] & 0xfff == 1000 or ether[14:2] & 0xfff == 501 ) ) and ( ip host 10.1.1.98 or ip host 10.1.1.99 )'
Run Code Online (Sandbox Code Playgroud)

别忘了:2,这是一个 2 字节的字段——我在这个问题上卡住了一段时间。


小智 7

与使用深度数据包考试相比,它可以通过更简单的方式完成,只需使用 grep:

tcpdump -n -i eth1 -e | grep "vlan 1000" 
Run Code Online (Sandbox Code Playgroud)

-e:在每个转储行上打印链接级标头。

它会打印像

ethertype 802.1Q (0x8100), length 60: vlan 1000, p 0, ethertype ARP
Run Code Online (Sandbox Code Playgroud)

可以很容易地被grep捕获

如果您想捕获多个 VLAN ID,您可以使用如下命令:

tcpdump -n -i eth1 -e | grep "vlan 1000\|vlan 501"
Run Code Online (Sandbox Code Playgroud)