Ошибка говорит вам точно, что вам нужно знать.
IndexError: Уровень ['IP'] не найден
Один из пакетов в ваших пакетах перехватывает это не содержит уровень IP. Вы должны проверить, существует ли уровень IP, прежде чем получить к нему доступ. Например, пакет ARP не будет иметь IP-уровня и нарушит ваш код.
Используя этот pcap из выборок перехвата wireshark, мы можем получить IP-адреса dest, проверяя, если слой IP существует .
# print_ips.py
from scapy.all import rdpcap
ip_list = []
pkts = rdpcap('allen_test.pcap')
# Limit analysis to 20 packets for brevity
twenty_pkts = pkts[:20]
for packet in twenty_packets:
# This check is what you are missing
if 'IP' in packet:
dest_ip = packet['IP'].dst
ip_list.append(dest_ip)
print("Out of", len(twenty_packets), "packets,", len(ip_list), "were IP packets.")
print("Dest IPs", ip_list)
Запустив это в оболочке, мы получим
$ python print_ips.py
WARNING: DNS decompression loop detected
Out of 20 packets, 7 were IP packets.
Dest IPs ['172.19.255.255', '172.19.255.255', '172.19.255.255', '172.19.255.255', '224.0.0.9', '172.19.0.240', '172.19.0.240']