我有一个使用 tcpdump 生成的 pcap 文件,其中包含直径流量并使用 Scapy PcapReader 读取它。它向我展示了每个数据包都有一个 DiamG 层,因此可以轻松提取 AVP。
但是,使用来自另一台服务器的另一个直径 pcap 文件,PcapReader 向我显示直径数据包具有原始层而不是 DiamG,因此我无法访问 AVP。
使用 Wireshark 可以成功读取两个 pcap 来分析直径流量。 两个文件之间的区别在于,第一个文件中使用的直径端口是 3868(这是标准),所以我认为这就是 PcapReader 正确识别它的原因。然而,在第二个文件中,直径端口是一个非标准数字(50XXX),所以我在每个数据包上得到一个原始层而不是 DiamG。 如何从第二个文件中正确读取直径信息(AVP 等)?
我使用以下代码来读取每个数据包:
with PcapReader(f'{workdir}/data/{file}') as pr:
for p in pr:
x = p[0]
print(x)
使用第一个 pcap 文件我得到:
CookedLinux / IP / TCP 10.66.80.210:13201 > 10.83.178.138:3868 PA / DiamG CookedLinux / IP / TCP 10.83.178.138:3868 > 10.66.80.210:13201 PA / DiamG ...
使用第二个文件(也包含直径流量),我得到:
CookedLinux / IP / TCP 10.179.217.91:37196 > 10.179.217.31:50124 PA / 原始CookedLinux / IP / TCP 10.179.217.31:50124 > 10.179.217.91:37196 PA / 原料
阅读文档,我发现 pkt.decode_payload_as() 方法可以让您指定有效负载的解码方式。就我而言,想要将 TCP 有效负载解码为直径,这是通过以下句子实现的:
p[TCP].decode_payload_as(DiamG)
其中 DiamG 是目标有效负载的类。