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

Windows 11下Python Scapy抓包异常问题求助

Windows 11下Scapy抓包问题及解决方案

问题现象

  • 使用packet = scapy.sniff(iface=None, timeout=duration, filter="tcp")时,脚本能启动但无任何抓包记录。
  • 指定接口iface=if_to_sniff时,出现接口打开错误。

完整测试脚本

import os
import scapy.all as scapy


def sniff_traffic(filename, duration):
    intrf = scapy.get_if_list()

    intrf_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "documents", unique_code, "intrf.txt")
    with open(intrf_path, "w") as f:
        for item in intrf:
            f.write(f"{item}\n")

    if_to_sniff = scapy.get_if_list()[0]

    writer = scapy.PcapWriter(filename)

    while True:
        packet = scapy.sniff(iface=if_to_sniff, timeout=duration, filter="tcp")
        if packet is None:
            break

        writer.write(packet)

if __name__ == "__main__":
    unique_code = "a425c5a1-c788-43db-ae2a-cb9be6e7cc6f"
    pcap_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "documents", unique_code, "packets.pcap")
    intrf_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "documents", unique_code, "intrf.txt")
    duration = 5

    sniff_traffic(pcap_path, duration)

解决建议

  1. 权限问题
    Windows下抓包必须以管理员权限运行脚本,右键终端/IDE选择「以管理员身份运行」,这是接口打开错误的最常见原因。

  2. 接口选择错误
    scapy.get_if_list()[0]可能指向虚拟网卡或未启用的接口,可:

    • 查看生成的intrf.txt,手动选择正在使用的物理网卡名称;
    • 用scapy.get_working_if()获取当前活跃的默认接口,替代get_if_list()[0]。
  3. 无抓包记录的排查

    • iface=None时Scapy自动选的接口可能无流量,需确认选择的接口是当前有TCP流量的网卡;
    • 测试时主动发起TCP流量(比如打开浏览器访问网页),同时检查过滤器是否正确。
  4. 依赖检查
    确保已安装Npcap(推荐替代WinPcap),安装时勾选「Install Npcap in WinPcap API-compatible Mode」,Scapy依赖它实现底层抓包。

Windows 11下正确使用Scapy的步骤

  1. 环境搭建

    • 安装Python 3.7+并添加到系统PATH;
    • 下载安装Npcap(管理员权限运行安装包);
    • 执行pip install scapy完成Scapy安装。
  2. 权限要求
    所有抓包操作必须在管理员权限的终端/IDE中执行,否则会出现接口访问失败或无法捕获流量的问题。

  3. 接口选择

    • 用scapy.get_if_list()列出所有可用接口;
    • 用scapy.get_working_if()获取当前活跃的网络接口;
    • 也可通过ipconfig命令查看适配器名称,手动指定匹配的接口。
  4. 抓包逻辑优化

    • scapy.sniff()超时后返回空的PacketList而非None,原脚本的if packet is None: break永远不会触发,可改为if len(packet) == 0: continue;
    • 无限循环抓包需添加终止条件,比如捕获指定数量的包或手动中断。

内容的提问来源于stack exchange,提问作者gc75

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 11:30:11