Как проверить наличие слоя в scapy-пакете?
Как проверить наличие определенного слоя в scapy-пакете? Например, мне нужно проверить поля src/dst заголовка IP, откуда я знаю, что конкретный пакет имеет IP-заголовок (в отличие от IPv6, например).
Моя проблема заключается в том, что когда я иду проверять поле заголовка IP, я получаю сообщение об ошибке, говорящем, что уровень IP не существует. Вместо IP-заголовка этот конкретный пакет имел IPv6.
pkt = Ether(packet_string)
if pkt[IP].dst == something:
# do this
Моя ошибка возникает, когда я пытаюсь ссылаться на уровень IP. Как проверить наличие этих слоев перед тем, как попытаться манипулировать им?
Спасибо!
Ответы
Ответ 1
Вы должны попробовать оператор in
. Возвращает True
или False
в зависимости от того, присутствует ли слой в Packet
.
[email protected]:~/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
>>>
[email protected]:~/scapy#
Ответ 2
В завершение я подумал, что также упомяну метод haslayer
.
>>> pkts=rdpcap("rogue_ospf_hello.pcap")
>>> p=pkts[0]
>>> p.haslayer(UDP)
0
>>> p.haslayer(IP)
1
Надеюсь, это поможет.