跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python

Scapy 详细安装教程、功能介绍与快速上手

Scapy 是基于 Python 的网络数据包操作工具,支持发送、嗅探、解析和伪造数据包。内容涵盖 Windows 与 Ubuntu 环境下的安装步骤,常用调试函数如 rdpcap、show、ls 的使用说明,以及报文结构查看、构造与发送的具体实践。通过 ICMP 报文示例演示了组包、发包及响应捕获流程,适用于网络探测、扫描和协议分析场景。

ApiHolic发布于 2026/1/12更新于 2026/10/15104 浏览
Scapy 详细安装教程、功能介绍与快速上手

一、Scapy 相关介绍

Scapy 是一个基于 Python 的交互式数据包操纵工具,能够发送、嗅探、解析和伪造网络数据包,其核心能力包括网络探测、扫描和协议分析。作为多功能工具,在吞吐量和性能要求不高的情况下,可代替测试仪构建和组装想要的报文内容,实现抓包和发包的功能。

1、Scapy 的优缺点

Scapy 是一个强大的 Python 网络数据包操作工具,其核心优势在于灵活性和协议支持广度,但也存在一定局限性。以下是其主要优缺点分析:

1.1、优点

A、协议支持全面:支持 IPv4/IPv6、TCP/UDP、ARP、ICMP 等超过 800 种协议,可构造复杂数据包并进行发送、捕获及解析主流协议,以及 802.11 无线协议。

B、交互式操作与脚本化:通过 Python 脚本灵活构造数据包,支持实时交互调试,适用于渗透测试和教育演示。

C、跨平台兼容性:支持 Linux/Windows/macOS,并集成 Wireshark 解析引擎提升分析效率。

1.2、缺点

A、性能局限:基于 Python 实现,处理高并发流量时性能低于 C/C++ 工具(如 Nmap),通常不会超过 1000pps。

B、学习曲线较陡:需深入理解网络协议才能有效使用,对新手不够友好。

C、无线功能依赖硬件:802.11 功能需特定网卡支持(如支持 monitor 模式的无线网卡)。

2、Scapy 环境安装

Scapy 的安装需确保 Python 环境已正确配置(建议 3.7+ 版本),并通过 pip 直接安装或离线部署。以下是关键步骤:

2.1、Windows 环境安装 Scapy

以管理员权限打开 Windows 的 cmd 窗口,使用命令 "pip install scapy" 安装 scapy 包,可以使用 pip list 检查 scapy 是否安装成功,在 python 已设置全局变量的情况下可执行 "scapy" 来进入 shell 界面。

pip install scapy
pip list
2.2、Ubuntu 环境安装 Scapy

Ubuntu 使用 root 权限安装 scapy。

apt install python3-scapy
# 或者
apt install scapy

使用 pip list | grep scapy 查看 scapy 是否安装版本。

二、Scapy 常用函数介绍

1、调试辅助函数

1.1、rdpcap()

当我们在组包时,不清楚报文需要封装哪些头和 data 时,可以使用 rdpcap 读取 wireshark 抓取的真实报文,打印出来,然后按照输出的报文结构进行组包。其中 [0] 是报文索引,表示第一个报文。

from scapy.all import *
pkt = rdpcap("icmp.pcap")[0]
print(pkt)

ICMP 报文由以太头、IP 头、ICMP 协议层、data 构成,上文以作说明,这里不再重复赘述。

1.2、show()

当我们需要构建精准报文时,不清楚需要填写哪些字段和内容时,可以使用 show() 函数打印真实报文,再模仿构造。

from scapy.all import *
pkt = rdpcap("icmp.pcap")[0]
pkt.show()
1.3、ls()

ls() 函数可查看 scapy 支持的所有协议、头部字段及默认值罗列等。

from scapy.all import *
from scapy.layers.inet import TCP, IP
ls()
# 列出所有支持的协议
ls(IP)
# 显示 IP 头部字段及默认值
1.4、lsc()

列出 Scapy 所有内置函数(如发包/嗅探/ARP 欺骗等)。

from scapy.all import *
lsc()
1.5、help()

查看函数/类的详细使用说明(如参数含义、返回值)。

from scapy.all import *
help(sendp)

三、Scapy 功能介绍

scapy 官方文档介绍:https://scapy.readthedocs.io/en/latest/

1、scapy 查看报文结构

当我们想要组一个 scapy 报文时,就先要了解该报文的结构,scapy 官方文档提供了部分的 API,可能不够全面,或者很难查询到我们想要的报文结构。此时,我们可以通过 wireshark 把想要的报文抓下来,再通过 scapy 去解析,然后重新组包发送,或者修改现有报文再重放。以下举一个 icmp request 组包举例:

from scapy.all import *
# 使用 show() 函数,把抓取的 icmp 报文结构读出来
icmp_req = rdpcap("icmp.pcap")[0]
icmp_req.show()

2、scapy 构包

根据 TCP/IP 标准模型,从上文可查看 icmp 总共有以太层、IP 层、ICMP 协议层、data;可按照以上格式进行组包:

# 步骤一:分别查看以太层、IP 层、ICMP 协议层、Raw 下参数名称和类型,以 Ether 为例
ls(Ether)
# 步骤二:组包。数据通信对报文正确性、完整性有严格的校验,包括 chksum 等,以下只做教学举例,列举了部分关键字段。
from scapy.all import *
from scapy.layers.inet import ICMP, IP
from scapy.layers.l2 import Ether
eth = Ether(dst="18:f2:2c:c8:90:11", src="d8:b3:2f:80:2d:11", type="IPv4")
ip = IP(proto="icmp", src="192.168.0.103", dst="192.168.0.1")
icmp = ICMP(type="echo-request")
data = Raw(load=b'abc')
icmp_req_pkt = eth / ip / icmp / data
# 步骤三:查看已经组好的报文
icmp_req_pkt.show()

3、scapy 发包

以下是 Scapy 中 send()、sendp()、sr()、sr1() 和 srp() 系列函数的区别总结。

3.1、发送函数(无响应接收)
  • send()
    • 工作在网络层(L3),自动封装 IP 数据包
    • 示例:send(IP(dst="1.2.3.4"]/ICMP()) 发送 ICMP 请求
    • 特点:不接收响应,适合快速发送单次数据包
  • sendp()
    • 工作在链路层(L2),需手动指定接口和链路协议(如 Ethernet)
    • 示例:sendp(Ether()/IP(dst="1.2.3.4"), iface="eth0") 发送以太网帧
    • 特点:支持循环发送(loop 参数)和间隔控制(inter 参数)
3.2、交互式函数(发送并接收响应)
  • sr()
    • 发送数据包并接收所有响应,返回应答包和未应答包列表(二元组)
    • 示例:sr(IP(dst="192.168.1.1"]/TCP(dport=80)) 扫描端口
    • 特点:适用于需要统计响应的场景(如端口扫描)
  • sr1()
    • 仅返回第一个响应包,忽略未应答包
    • 示例:sr1(IP(dst="192.168.1.1"]/ICMP()) 探测主机存活
    • 特点:高效获取单个响应,减少数据量
  • srp()
    • 专为链路层设计,发送并接收 L2 数据包(如 ARP)
    • 示例:srp(Ether()/ARP(), timeout=2) 发送 ARP 请求
    • 特点:适用于二层协议交互(如 ARP 欺骗)

send()、sendp()、sr()、sr1() 和 srp() 系列函数关键区别对比

函数工作层级是否接收响应返回内容典型用途
send()L3否无快速发送单次数据包
sendp()L2否无循环发送或指定网卡
sr()L3是所有响应和未应答包端口扫描、统计响应
sr1()L3是仅第一个响应包探测主机、快速验证
srp()L2是二层协议响应ARP 交互、二层攻击

注意:

  • sendp() 和 srp() 需指定物理接口(iface 参数),而 send() 和 sr() 系列由 Scapy 自动选择路由。
  • sr1() 和 sr() 的区别在于响应处理方式,前者仅返回首个有效响应。
3.3、sendpfast()

Scapy 中的 sendpfast() 是一个专为高速发送二层数据包设计的函数,其核心特点如下:

  • 基于 tcpreplay 工具实现高性能发包,适合压力测试或流量生成场景
  • 支持精确控制发送速率(通过 pps 或 mbps 参数)
  • 可循环发送数据包(loop 参数支持设定循环次数)
  • 需明确指定网卡接口(iface 参数)

sendpfast() 参数说明

sendpfast(
    pkt,      # 要发送的数据包对象(需包含 L2 头)
    pps=None, # 每秒发包数(如 pps=1000)
    mbps=None,# 带宽限制(如 mbps=10)
    loop=0,   # 循环次数(0 为单次,1 为无限循环)
    iface=None# 指定网卡(如 iface="eth0")
)

sendfast() 使用示例

from scapy.all import *
# 构造 ARP 请求包
pkt = Ether(dst="ff:ff:ff:ff:ff:ff"]/ARP(pdst="192.168.1.0/24")
# 以 1000pps 速率发送
sendpfast(pkt, pps=1000, iface="eth0")
3.4、Scapy 发包举例
3.4.1、scapy 发送报文

在上文中,我们已组装好了一个 icmp 报文,方便后续讲解 sniff() 函数,接下来我们将使用 scapy 的 sendp() 函数进行举例,接收并解析响应报文。

# sendp() 举例说明
from scapy.all import *
from scapy.layers.inet import ICMP, IP
from scapy.layers.l2 import Ether
eth = Ether(dst="18:f2:2c:c8:90:11", src="d8:b3:2f:80:2d:11", type="IPv4")
ip = IP(proto="icmp", src="192.168.0.103", dst="192.168.0.1")
icmp = ICMP(type="echo-request")
data = Raw(load=b'abc')
icmp_req_pkt = eth / ip / icmp / data
sendp(icmp_req_pkt, count=1, iface="WLAN")

# sr1 举例说明,可直接获取 icmp reply 报文
from scapy.all import *
from scapy.layers.inet import ICMP, IP
from scapy.layers.l2 import Ether
ip = IP(proto="icmp", src="192.168.0.103", dst="192.168.0.1")
icmp = ICMP(type="echo-request")
data = Raw(load=b'abc')
icmp_req_pkt = ip / icmp / data
sr1(icmp_req_pkt, timeout=3, iface="WLAN")

使用 wireshark 抓取 "WLAN" 接口的报文,过滤报文类型为 icmp,可查看收到 icmp reply。

3.4.2、scapy 嗅探报文

当使用测试 PC 发送 icmp 报文进行 Ping 网关时,报文交互如下:

PC -> 网关 (icmp request) 网关 -> PC (icmp reply)

from scapy.all import *
from scapy.layers.inet import ICMP, IP
from scapy.layers.l2 import Ether
eth = Ether(dst="18:f2:2c:c8:90:11", src="d8:b3:2f:80:2d:11", type="IPv4")
ip = IP(proto="icmp", src="192.168.0.103", dst="192.168.0.1")
icmp = ICMP(type="echo-request")
data = Raw(load=b'abc')
icmp_req_pkt = eth / ip / icmp / data
sendp(icmp_req_pkt, count=1, iface="WLAN")
reply = sniff(filter=f"icmp[icmptype]==0 and src host 192.168.0.1", count=1, timeout=5)
if reply:
    print("[success] 捕获到 ICMP 响应:")
    reply[0].show()
else:
    print("[fail] 未捕获到响应")

备注:filter 过滤规则介绍

  • 指定方向过滤
    • filter="icmp[icmptype]==8" # 只捕获 ICMP 请求(type=8)
    • filter="icmp[icmptype]==0" # 只捕获 ICMP 响应(type=0)
  • 结合 IP 地址过滤
    • filter="icmp and host 192.168.1.1" # 捕获与指定主机的所有 ICMP 通信
    • filter="icmp and src host 192.168.1.1" # 只捕获来自该主机的 ICMP
    • filter="icmp and dst host 192.168.1.1" # 只捕获发往该主机的 ICMP

目录

  1. 一、Scapy 相关介绍
  2. 1、Scapy 的优缺点
  3. 1.1、优点
  4. 1.2、缺点
  5. 2、Scapy 环境安装
  6. 2.1、Windows 环境安装 Scapy
  7. 2.2、Ubuntu 环境安装 Scapy
  8. 或者
  9. 二、Scapy 常用函数介绍
  10. 1、调试辅助函数
  11. 1.1、rdpcap()
  12. 1.2、show()
  13. 1.3、ls()
  14. 列出所有支持的协议
  15. 显示 IP 头部字段及默认值
  16. 1.4、lsc()
  17. 1.5、help()
  18. 三、Scapy 功能介绍
  19. 1、scapy 查看报文结构
  20. 使用 show() 函数,把抓取的 icmp 报文结构读出来
  21. 2、scapy 构包
  22. 步骤一:分别查看以太层、IP 层、ICMP 协议层、Raw 下参数名称和类型,以 Ether 为例
  23. 步骤二:组包。数据通信对报文正确性、完整性有严格的校验,包括 chksum 等,以下只做教学举例,列举了部分关键字段。
  24. 步骤三:查看已经组好的报文
  25. 3、scapy 发包
  26. 3.1、发送函数(无响应接收)
  27. 3.2、交互式函数(发送并接收响应)
  28. 3.3、sendpfast()
  29. 构造 ARP 请求包
  30. 以 1000pps 速率发送
  31. 3.4、Scapy 发包举例
  32. 3.4.1、scapy 发送报文
  33. sendp() 举例说明
  34. sr1 举例说明,可直接获取 icmp reply 报文
  35. 3.4.2、scapy 嗅探报文

更多推荐文章

查看全部
  • OpenClaw 钉钉对接教程:在 Linux 部署本地 AI 智能体
  • 通过 Ambari API 添加服务时解决 CSRF 保护错误的方法
  • C++ 多线程进阶:互斥锁与竞态条件
  • AI 前沿动态:OpenClaw 更新翻车、Luma AI 新模型及阿里芯片突破
  • Python 数据分析库 Pandas 核心操作详解
  • Python 代码打包为 EXE 完整指南与常见问题排查
  • CUDA、PyTorch、MMCV 与 MMDetection 版本对照指南
  • 大模型应用开发入门:LangChain 实战指南
  • Linux 进程信号的捕捉处理
  • Linux 部署 RocketMQ 及公网穿透配置指南
  • DeepSeek-V3 FP8 量化原理与工程实现
  • Xcode 调试时 Developer Disk Image 卸载失败的常见原因与修复
  • 链表核心算法实战:移除元素与合并有序链表详解
  • MySQL InnoDB 存储引擎:B+树叶子节点能存多少数据?
  • C++ 哈希表封装:模拟实现 unordered_map 和 unordered_set
  • Python 脚本自动对齐 C++ 数组代码
  • Claude Code 安装使用与配置教程
  • VSCode 关闭 GitHub Copilot 的两种方案
  • 智能家居中控屏:基于 GLM-4.6V-Flash-WEB 识别家庭成员与习惯
  • C++ Qt 摄像头视频采集实战:V4L2 与多线程

相关免费在线工具

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online