使用Scapy嗅探数据包时出现Layer [IP] not found错误该如何修复?
错误原因
你收到的IndexError: Layer [IP] not found报错,是因为Scapy默认会嗅探所有经过网卡的数据包,其中包含大量不具备IP层的二层数据包(比如ARP广播、LLDP帧等),你的代码仅判断了TCP/UDP层是否存在,就直接调用pkt[IP]读取IP层字段,当遇到无IP层的包时就会触发该异常。
修复步骤
- 首先在处理TCP/UDP逻辑前,先判断数据包是否存在IP层,无IP层的包直接跳过
- 删除代码中残留的
enter code here无效字符,避免语法报错 - 提前读取本机IP一次,不要在回调函数中重复调用接口获取,提升运行效率
修复后完整代码
from scapy.layers.inet import IP, TCP, UDP from scapy.all import sniff import socket import datetime # 提前获取本机IP,避免重复调用 local_ip = socket.gethostbyname(socket.gethostname()) def sniff_packets(pkt): # 先判断是否有IP层,无IP层直接跳过 if not pkt.haslayer(IP): return current_time = datetime.datetime.now() # 处理TCP包 if pkt.haslayer(TCP): tcp_payload_len = len(pkt[TCP]) src_mac = pkt.src dst_mac = pkt.dst src_port = pkt.sport dst_port = pkt.dport src_ip = pkt[IP].src dst_ip = pkt[IP].dst # 入站TCP if dst_ip == local_ip: print(f"[{current_time}] TCP-IN:{tcp_payload_len} Bytes SRC-MAC:{src_mac} DST-MAC:{dst_mac} SRC-PORT:{src_port} DST-PORT:{dst_port} SRC-IP:{src_ip} DST-IP:{dst_ip}") # 出站TCP if src_ip == local_ip: print(f"[{current_time}] TCP-OUT:{tcp_payload_len} Bytes SRC-MAC:{src_mac} DST-MAC:{dst_mac} SRC-PORT:{src_port} DST-PORT:{dst_port} SRC-IP:{src_ip} DST-IP:{dst_ip}") # 处理UDP包 if pkt.haslayer(UDP): udp_payload_len = len(pkt[UDP]) src_mac = pkt.src dst_mac = pkt.dst src_port = pkt.sport dst_port = pkt.dport src_ip = pkt[IP].src dst_ip = pkt[IP].dst # 出站UDP if src_ip == local_ip: print(f"[{current_time}] UDP-OUT:{udp_payload_len} Bytes SRC-MAC:{src_mac} DST-MAC:{dst_mac} SRC-PORT:{src_port} DST-PORT:{dst_port} SRC-IP:{src_ip} DST-IP:{dst_ip}") # 入站UDP if dst_ip == local_ip: print(f"[{current_time}] UDP-IN:{udp_payload_len} Bytes SRC-MAC:{src_mac} DST-MAC:{dst_mac} SRC-PORT:{src_port} DST-PORT:{dst_port} SRC-IP:{src_ip} DST-IP:{dst_ip}") if __name__ == '__main__': # Windows环境运行需确保脚本以管理员权限启动,否则无法正常嗅探 sniff(prn=sniff_packets)
内容的提问来源于stack exchange,提问作者Newtothis
相关产品推荐
相关产品推荐

