如何检查scapy数据包中是否存在某层?

15 投票
2 回答
29341 浏览
提问于 2025-04-16 15:03

我该怎么检查一个scapy数据包中是否有特定的层?比如,我需要查看IP头中的源地址和目标地址字段,怎么知道一个数据包里到底有没有IP头(而不是IPv6之类的)呢?

我的问题是,当我去检查IP头的某个字段时,系统会报错,说IP层不存在。实际上,这个数据包里是IPv6,而不是IP头。

pkt = Ether(packet_string)
if pkt[IP].dst == something:
  # do this

我的错误发生在我尝试引用IP层的时候。我该怎么在操作之前检查这个层是否存在呢?

谢谢!

2 个回答

18

为了完整起见,我想提一下 haslayer 这个方法。

>>> pkts=rdpcap("rogue_ospf_hello.pcap") 
>>> p=pkts[0]
>>> p.haslayer(UDP)
0
>>> p.haslayer(IP)
1

希望这也能帮到你。

24

你可以试试 in 这个操作符。它会根据这个层是否在 Packet 中来返回 True(真)或 False(假)。

root@u1010:~/scapy# scapy
Welcome to Scapy (2.2.0-dev)
>>> load_contrib("ospf")
>>> pkts=rdpcap("rogue_ospf_hello.pcap")
>>> p=pkts[0]
>>> IP in p
True
>>> UDP in p
False
>>>
root@u1010:~/scapy#

撰写回答