You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 14:24:02