用于 ERSPAN 会话 ID 值的 tcpdump 过滤器

网络工程 tcpdump
2022-02-09 01:57:08

我正在使用 rcdcap 在 Linux 主机上解封装 ERSPAN。我希望能够将 ERSPAN 会话 ID 拆分到不同的逻辑捕获接口。我当前的 ERSPAN 会话 ID 是 10 和 20。有人可以帮助我使用 tcpdump 过滤器,让我可以通过其中任何一个 ID 进行过滤吗?理解这是'ip [xx:y] = hexvalue'形式的东西,但我自己无法弄清楚。

2个回答

我最近一直在寻找相同的信息,现在我正在应用此过滤器来捕获确切的会话 ID:

tshark -i enp2s0f1 -b filesize:200000 -b files:5 -w f5_span.pcap -f 'ether[45] & 0x0f = 2'

这将获得会话 ID 2。还需要注意,它用于 ERSPAN 类型 II 数据包。您可以使用 Wireshark 确定负责 ERSPAN ID 的字节数。

评论:

过滤器ether[45] & 0x0f将为您提供从 0 到 15 匹配会话 ID 的机会。如果您想使用 15 以上的 ID(ERSPAN 会话 ID 的最大值为 1023),则需要将其修改为如下所示:

ether[44] & 0x03 = 3 && ether[45] & 0xff = 255(在本例中,我们匹配 ID 1023)


在您的情况下,对于会话 ID 10:

ether[45] & 0xff = 10

对于会话 ID 20:

ether[45] & 0xff = 20

ERSPAN 会话 id 是一个10 位字段,位于外部 IP 数据包的第30-31 个字节(ERSPAN 封装在 GRE 隧道内),从第 30 个字节的 2 个最低有效位开始。

考虑到整个帧,在以太网 II L2 外封装的情况下,该字段位于第44-45 个字节(以太网报头的附加 14 个字节)。

因此相应的过滤器应该是:

'ip[30:2]&0x3FF'=*session-id*
or
'ether[44:2]&0x3FF'=*session-id*

例子:

tcpdump proto gre and 'ip[30:2]&0x3FF'=1
# matches for erspan session id 1

tcpdump proto gre and 'ether[44:2]&0x3FF'=1001
# matches for erspan session id 1001