Zeek QUIC 协议分析完全指南:quic.log 生成机制与自定义事件实战
网络安全网络IDS【免费下载链接】zeekZeek is a powerful network analysis framework that is much different from the typical IDS you may know.项目地址https://gitcode.com/gh_mirrors/ze/zeek点击查看免费下载导读QUIC 是 HTTP/3 与 DNS-over-QUIC 的底层传输协议随着其大规模部署网络监控与分析工具必须原生支持 QUIC。本文以 Zeek 仓库中 doc/scripts/base/protocols/quic/index.rst 为骨架系统讲解base/protocols/quic脚本包如何实现 QUIC 分析并生成quic.log涵盖 QUIC 分析器的四类组成文件、quic.log全部日志字段、QUIC 版本映射表、分析器生成的事件列表以及基于这些事件编写自定义检测脚本的实战方法。读完本文你将能读懂 Zeek 的 QUIC 日志语义并在此基础上编写自己的 QUIC 检测与统计脚本。一、脚本包概览base/protocols/quic 的四层结构Zeek 的 QUIC 分析能力由 scripts/base/protocols/quic/ 目录下的脚本包实现。根据文档索引该包包含四个核心文件各自职责如下文件职责load.zeek加载入口按条件装载其余脚本与 DPD 签名spicy-events.zeek声明 QUIC 分析器生成的 Zeek 事件事件接口consts.zeek定义 QUIC 版本号到可读字符串的映射表main.zeek核心实现日志流定义、事件处理、生成quic.log四个文件通过load指令串联__load__.zeek在Analyzer::ANALYZER_QUIC存在的前提下ifdef守卫避免分析器未编译时脚本加载失败依次装载spicy-events、consts、main并加载 DPD 签名文件dpd.sigifdef ( Analyzer::ANALYZER_QUIC ) load ./spicy-events load ./consts load ./main load-sigs ./dpd.sig endif需要说明的是dpd.sig并不在该脚本目录中而是生成于构建过程DPDDynamic Protocol Detection签名用于在 UDP 端口非标准时动态识别 QUIC 流量。二、QUIC 分析器的底层实现Spicy 解析器与解密支持main.zeek注释明确该包Implements base functionality for QUIC analysis. Generates quic.log.实现 QUIC 分析的基础功能并生成 quic.log。在脚本层之下真正的 QUIC 报文解析由 Spicy 解析器完成源码位于 src/analyzer/protocol/quic/QUIC.spicy。这个 Spicy 解析器有两大特点INITIAL 包载荷解密Zeek 利用 QUIC 规范中 INITIAL 包使用公开已知密钥well-known keys加密的特性在 decrypt_crypto.cc 的 C 代码中解密 INITIAL 载荷从而提取 ClientHello 中的 SNI服务器名与 ALPN应用层协议协商信息——这正是quic.log中server_name和client_protocol字段的数据来源。Spicy 端通过decrypt_crypto_payload()函数cxxnameQUIC_decrypt_crypto_payload调用该 C 实现。TLS 握手转发解密后的 CRYPTO 帧数据被重组为 TLSPlaintext 记录legacy_record_version 设为\x03\x03即 TLS 1.3转发给 SSL 分析器从而复用 Zeek 已有的 TLS 事件体系如ssl_client_hello这也是main.zeek中能直接用ssl_*事件获取 SNI/ALPN 的原因。QUIC.spicy中还有一个值得关注的常量short_header_packet_threshold_base 2它与后文history字段中Oshort header 包的二进制对数方式记录直接相关。这些解析器文件与脚本的耦合通过 QUIC.evt 事件绑定文件完成构建系统配置见 CMakeLists.txt。三、核心实现quic.log 的完整字段语义main.zeek中的QUIC::Info记录类型定义了quic.log的每一列。该记录通过Log::create_stream(LOG, Log::Stream($columnsInfo, $evlog_quic, $pathquic, $policylog_policy))注册为日志流输出路径为quic即quic.log。日志字段完整列表如下字段类型说明tstime该条记录首个 QUIC 包的时间戳uidstring连接的唯一 IDidconn_id连接的四元组两端地址/端口versionstring客户端首个 INITIAL 包中的 QUIC 版本通常为1或quicv2其余取值见QUIC::version_stringsclient_initial_dcidstring可选客户端使用的首个 Destination Connection ID随机且不可预测用于客户端与服务器的包保护client_scidstring可选首个 INITIAL 包中客户端的 Source Connection IDserver_scidstring可选服务器选定的 Connection ID通常取自服务器首个 INITIAL 包客户端后续包将使用它server_namestring可选从 ClientHello 的 SNI 扩展提取的服务器名如可用client_protocolstring可选从 ClientHello 的 ALPN 扩展提取的首个协议如可用historystringQUIC 历史标记串默认history_statevector of stringhistory 字段的内部状态非日志列loggedbool该记录是否已写入日志非日志列history 字段字母表history是 QUIC 日志最有信息量的字段以字母串形式压缩记录连接生命周期中观测到的包类型。字母含义客户端发送的字母大写服务器发送的字母小写字母含义IINIT 包InitialHHANDSHAKE 包Z0-RTT 包RRETRY 包CCONNECTION_CLOSE 包SSSL Client/Server HelloU不认识的 QUIC 版本Unfamiliar versionX丢弃的包成功解密 INITIAL 包之后遇到固定位为 0 的包O短头包按二进制对数方式记录数量例如一条history值可能是Ihzs客户端 INITI、服务器 Handshakeh、0-RTTz、服务器 SSL Hellos。add_to_history()函数按方向将字母大写或小写追加到history_state向量中达到max_history_length默认 100可通过option max_history_length调整时触发QUIC_max_history_length_reached连接怪异weird记录。四、QUIC 版本映射version_strings 表consts.zeek 定义了QUIC::version_strings把 QUIC 原始 32 位版本号映射为可读字符串const version_strings: table[count] of string { [0x00000001] 1, [0x6b3343cf] quicv2, [0xff000016] draft-22, # ... draft-23 至 draft-34 依次为 0xff000017 - 0xff000022 [0xfaceb001] mvfst (faceb001), # ... mvfst 系列 0xfaceb002、0xfaceb00e、0xfaceb011-0xfaceb013 } defaultfunction(version: count): string { return fmt(unknown-%x, version); };该表的三个区间覆盖了真实世界的三类 QUIC 版本正式发布版0x00000001QUIC v1映射为1与0x6b3343cfQUIC v2映射为quicv2IETF 草案版0xff000016draft-22到0xff000022draft-34其中0xff00001d与0xff00001e都映射为draft-30注意 0xff00001f 实际对应 draft-31但表中没有该值若出现会走 default 分支实现专属版本Meta 的 mvfst 实现所使用的0xfaceb0xx系列。任何未在表中的版本号都通过default匿名函数渲染为unknown-hex形式如unknown-ff0000ff保证quic.log的version字段永远有可读值。五、端口注册与 DoQDNS-over-QUIC支持main.zeek定义了三个与端口相关的常量quic_ports { 443/udp }HTTP/3 over QUIC 的知名端口doq_ports { 853/udp, 784/udp }DNS-over-QUIC 端口853 为 IANA 分配784 为早期部署端口。在zeek_init()中通过分析器端口注册 API 绑定Analyzer::register_for_ports(Analyzer::ANALYZER_QUIC, quic_ports); Analyzer::register_for_ports(Analyzer::ANALYZER_QUIC, set(), doq_ports);注意doq_ports不会自动加入likely_server_ports这是为了避免在测试基线中引发 originator/responder 方向的虚假翻转。如果你所在环境需要正确的方向判定可在local.zeek中手动添加redef likely_server_ports { 853/udp, 784/udp };quic_ports与doq_ports均为redef常量可在local.zeek中覆盖或追加自定义端口。六、QUIC 分析器事件全清单spicy-events.zeek 声明了 QUIC 分析器可能生成的全部事件事件参数对应 QUIC RFC 9000 中的字段定义。所有事件均以(c: connection, is_orig: bool, ...)开头其中c为连接对象is_orig表示包是否来自连接发起方。事件触发时机额外参数QUIC::initial_packet观测到 QUIC Initial 包version、dcid、scidQUIC::retry_packet观测到 QUIC Retry 包version、dcid、scid、retry_token、retry_integrity_tagQUIC::handshake_packet观测到 QUIC Handshake 包version、dcid、scidQUIC::zero_rtt_packet观测到 QUIC 0-RTT 包version、dcid、scidQUIC::connection_close_frame观测到 CONNECTION_CLOSE 帧version、dcid、scid、error_code、reason_phraseQUIC::unhandled_version遇到未识别的 QUIC 版本version、dcid、scidQUIC::discarded_packet遇到固定位fixed bit为 0 的包且此前已成功解密过 INITIAL 包total_decrypted此前成功解密的包数QUIC::short_header_packet_threshold_crossed观测到短头包的数量达到某个二进制对数阈值threshold两个事件需要注意其语义边界QUIC::connection_close_frame注释明确指出连接建立后的 CONNECTION_CLOSE 帧通常是加密的Zeek 不可见因此该事件实际只在握手中的明文阶段可见即main.zeek中若存在待记录状态则立即落盘并准备新条目的场景QUIC::discarded_packet仅当该连接此前有成功解密的 INITIAL 包时才生成total_decrypted给出此前的成功解密计数。七、核心状态机main.zeek 的事件处理逻辑main.zeek将上述事件与日志生命周期连接起来形成一套完整的状态机会话建立QUIC::initial_packet/handshake_packet/zero_rtt_packet事件都会调用set_session()若连接尚无c$quic状态则创建Info记录记录时间戳、UID、四元组、经version_strings映射的版本并注册finalize_quic连接移除钩子同时填充client_initial_dcid仅发起方首次、client_scid或server_scid按方向随后调用add_to_history()追加对应字母。异常与闭合路径retry_packet、unhandled_version、connection_close_frame三个事件处理逻辑一致——补充 history 后立即log_record()落盘然后delete c$quic清空状态为同一条 UDP 流上可能出现的下一条 QUIC 连接准备新条目。这对应注释中同一 UDP 连接上可能出现多个不同 Connection ID 的 QUIC 连接XXX 标注的设计考量。加密后阶段QUIC::short_header_packet_threshold_crossed和QUIC::discarded_packet在c$quic缺失时分别产生QUIC_spurious_short_header_packet_threshold_crossed与QUIC_spurious_discarded_packet连接怪异weird记录其中前者对应没看到 INITIAL 却解析出了短头包的边界情况。TLS 数据融合三个ssl_*事件被复用将 SSL 分析器的结果写回 QUIC 记录ssl_extension_server_name优先级 5从 ClientHello 的 SNI 扩展提取server_namessl_extension_application_layer_protocol_negotiation提取client_protocol仅取首个协议若协议多于一个则产生QUIC_many_protocols怪异记录——注释说明这是为避免 vector 或拼接而有意只记录首个的取舍ssl_client_hello/ssl_server_hello分别以大写S/小写s追加 history。最终落盘兜底finalize_quic连接移除钩子保证连接结束、且记录尚未写入时c$quic$logged为假把剩余状态写入日志避免数据丢失。八、自定义检测实战基于 QUIC 事件编写脚本理解上述事件后就可以在策略层编写自定义 QUIC 检测。以下脚本演示三类常见用法# 1) 统计并输出每个 QUIC 连接的版本与服务器名 event QUIC::initial_packet(c: connection, is_orig: bool, version: count, dcid: string, scid: string) { if ( is_orig ) print fmt(QUIC session: %s version%s server%s, c$uid, QUIC::version_strings[version], c$quic?$server_name ? c$quic$server_name : -); } # 2) 监控遇到陌生 QUIC 版本的连接version_strings 的 default 分支会命中 event QUIC::unhandled_version(c: connection, is_orig: bool, version: count, dcid: string, scid: string) { NOTICE([$noteWeird::Activity, $connc, $msgfmt(Unhandled QUIC version 0x%x observed, version)]); } # 3) 记录 QUIC 连接关闭原因码 event QUIC::connection_close_frame(c: connection, is_orig: bool, version: count, dcid: string, scid: string, error_code: count, reason_phrase: string) { if ( is_orig ) print fmt(QUIC close: %s error_code%d reason%s, c$uid, error_code, reason_phrase); }将该脚本放入local.zeekscripts/site/local.zeek或经load加载即可生效。注意使用c$quic状态字段前应先判断c?$quic例如只在initial_packet之后的事件中直接访问并了解max_discarded_packet_events默认 1000 表示不限量-1 表示禁用等可调参数。由于 QUIC 事件依赖 Spicy 解析器Analyzer::ANALYZER_QUIC脚本在未编译 QUIC 支持的构建中会被ifdef自动跳过。九、验证与测试Zeek 的 QUIC 分析器有完整的回归测试支撑。可在仓库的 testing/btest 目录中检索quic相关测试用例验证quic.log字段语义、history 字母行为以及各事件触发的正确性QUIC.spicy本身长达数百行覆盖长头/短头包、CRYPTO 帧重组、版本协商等解析路径是深入理解解析器行为的首选阅读材料。总结Zeek 的 QUIC 支持是Spicy 解析器 Zeek 脚本分层协作的典型范例Spicy 层QUIC.spicy、QUIC.evt、decrypt_crypto.cc负责报文解析、INITIAL 解密与 TLS 转发脚本层main.zeek、spicy-events.zeek、consts.zeek负责把解析结果转化为结构化日志quic.log与可编程事件。理解Info记录的全部字段、history字母表与八类事件的触发时机是撰写高效 QUIC 检测脚本的基础——这也是该脚本包对应 doc/scripts/base/protocols/quic/index.rst为分析者提供的核心价值。赞分享网络安全网络IDS【免费下载链接】zeekZeek is a powerful network analysis framework that is much different from the typical IDS you may know.项目地址https://gitcode.com/gh_mirrors/ze/zeek点击查看免费下载相关推荐Zeek QUIC 分析器与 quic.log 日志字段完全解读Zeek QUIC 分析器与 quic.log 日志字段完全解读 QUIC 协议将加密、流多路复用与流量控制整合进传输层并默认使用 TLS 1.3导致传统网络安全网络IDSZeek POP3 协议分析器事件接口完全指南从事件定义到状态机实现Zeek POP3 协议分析器事件接口完全指南从事件定义到状态机实现 导读 本文聚焦 Zeek 网络分析框架中 POP3Post Office Protoc网络安全网络IDSZeek SMB1 协议分析smb1_transaction2_secondary_request 事件详解与实战指南Zeek SMB1 协议分析 smb1_transaction2_secondary_request 事件详解与实战指南 本篇技术指南围绕 Zeek 内置 S网络安全网络IDS上一篇终极Vortex模组管理器使用指南从零开始轻松管理游戏模组下一篇WLED高级用户手册250预设与自定义效果全攻略创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Apache Beam 0.6.0 中的 Python SDK:Beam 编程模型的第二种实现与实战入门

Apache Beam 0.6.0 中的 Python SDK:Beam 编程模型的第二种实现与实战入门

大数据批处理流处理数据工程 【免费下载链接】beam Apache Beam is a unified programming model for Batch and Streaming data processing. 项目地址: https://gitcode.com/gh_mirrors/beam4/beam 点击查看 免费下载 Apache Beam 0.6.0 版本首次将 Beam 统一编程…

2026/10/10 4:02:50 阅读更多 →
100亿Token烧出的真相:Code is cheap是最大谎言,AI编程省Token实战

100亿Token烧出的真相:Code is cheap是最大谎言,AI编程省Token实战

花了 100 亿 Token 后,我发现 Code is cheap 是最大的谎言如果你还没意识到 Token 是什么,先停下来想一个问题:我过去一年在 AI 编程工具上的真实支出,到底有多少?不是订阅费那个数字,而是每一次自动补全、…

2026/10/10 4:02:54 阅读更多 →
Zeek 中 IRC 文件传输提取与 Files 框架集成:深入 base/protocols/irc/files.zeek

Zeek 中 IRC 文件传输提取与 Files 框架集成:深入 base/protocols/irc/files.zeek

网络安全网络IDS 【免费下载链接】zeek Zeek is a powerful network analysis framework that is much different from the typical IDS you may know. 项目地址: https://gitcode.com/gh_mirrors/ze/zeek 点击查看 免费下载 本文以 Zeek 仓库中的 base/protocols/…

2026/10/10 4:01:47 阅读更多 →

最新新闻

粒子群算法实现IEEE33节点配电网重构:建模、编码与调参详解

粒子群算法实现IEEE33节点配电网重构:建模、编码与调参详解

配电网重构这个课题,我接触过不少同学和同行,大家的困惑往往出奇一致:算法原理看懂了,测试系统也下载了IEEE33节点的数据,但粒子群一跑起来要么收敛慢得令人发指,要么重构完的网损压根没降多少。问题到底出…

2026/10/10 10:53:22 阅读更多 →
Gemini长上下文驱动百万字网文生成:四段流水线与状态管理实战

Gemini长上下文驱动百万字网文生成:四段流水线与状态管理实战

简介:这是一套基于Gemini大模型构建的AI长篇小说生成器工程,面向网络小说作者、AI写作爱好者与NLP开发者,用于解决长篇创作中剧情连贯性差、人物设定易崩坏、伏笔管理困难等痛点。包内共30个文件,体量仅106KB,以20个Py…

2026/10/10 10:53:22 阅读更多 →
COMSOL多物理场仿真:激光抛光熔池流动与表面形貌建模

COMSOL多物理场仿真:激光抛光熔池流动与表面形貌建模

1. 这个模型到底在算什么1.1 激光抛光为什么需要多物理场激光抛光这件事,表面上看是“用激光把表面重新熔一遍”,但真放到仿真里就完全是另一回事了。我在 COMSOL 里第一次把固体传热、层流、动网格、表面张力、马兰戈尼效应全部耦合到同一个模型中时&am…

2026/10/10 10:53:22 阅读更多 →
高压线下垂钓隐患大:声光电联动智能警示杆如何做到主动劝阻

高压线下垂钓隐患大:声光电联动智能警示杆如何做到主动劝阻

你要是周末傍晚去一条跨着河道的高压线路附近站二十分钟,大概率能看到这样一幕:几个人蹲在岸边,眼睛盯着水面的浮漂,头顶上方就是呜呜作响的导线,脚下立着字迹斑驳的“高压危险 禁止垂钓”警示牌,却很少有人…

2026/10/10 10:53:22 阅读更多 →
智源社区复盘 Agent 一年半:「认知流程」才是关键——这恰好是 Spec Kit 正在产品化的事

智源社区复盘 Agent 一年半:「认知流程」才是关键——这恰好是 Spec Kit 正在产品化的事

智源社区复盘 Agent 一年半:「认知流程」才是关键——这恰好是 Spec Kit 正在产品化的事 【免费下载链接】spec-kit 💫 Toolkit to help you get started with SDD or any other process! 项目地址: https://gitcode.com/GitHub_Trending/sp/spec-kit …

2026/10/10 10:53:22 阅读更多 →
极目数据MCP是什么?附极目数据优惠折扣码KJDSYY

极目数据MCP是什么?附极目数据优惠折扣码KJDSYY

极目数据MCP是什么?附极目数据优惠折扣码KJDSYY 对于亚马逊跨境卖家来说,选品、竞品研究、关键词分析和广告优化都离不开数据支持。但在实际运营中,数据往往分散在不同的工具和页面中,卖家不仅需要花时间查找信息,还要…

2026/10/10 10:52:21 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →