Zeek 的 base/packet-protocols 包:从数据链路到隧道封装的逐层解析与注册机制
网络安全网络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点击查看免费下载导读base/packet-protocols是 Zeek 网络分析框架中负责报文级packet-level协议解析的基础脚本包。本文以 Zeek 仓库中该包的官方索引文档doc/scripts/base/packet-protocols/index.rst为骨架逐层讲解其目录结构、加载约定、数据链路层与网络层的协议分发、隧道封装协议链以及PacketAnalyzer::register_packet_analyzer等注册接口的底层原理。读完本文你将理解 Zeek 是如何从网卡原始帧一路分拣出 Ethernet、VLAN、IP、TCP/UDP、GRE、VXLAN 等嵌套协议的并能依据源码路径定位任意一层协议的分析器实现。包的整体结构与加载顺序base/packet-protocols是 Zeek 基础脚本集scripts/base的一部分通过 scripts/base/init-default.zeek 等初始化脚本在启动时自动加载。官方索引文档 doc/scripts/base/packet-protocols/index.rst 完整罗列了该包的每一个脚本文件从中可以归纳出它的组织惯例每个协议子目录下都包含一个__load__.zeek加载入口和一个main.zeek核心实现个别协议额外携带类型定义与事件定义文件例如igmp/types.zeek和igmp/spicy-events.zeek。顶层加载入口 scripts/base/packet-protocols/load.zeek 以固定的load顺序串联全部子模块这个顺序本身就是报文解析链路的先后顺序load ./main.zeek load base/packet-protocols/root load base/packet-protocols/ip load base/packet-protocols/skip load base/packet-protocols/ethernet load base/packet-protocols/fddi load base/packet-protocols/ieee802_11 load base/packet-protocols/ieee802_11_radio load base/packet-protocols/linux_sll load base/packet-protocols/linux_sll2 load base/packet-protocols/nflog load base/packet-protocols/null load base/packet-protocols/ppp load base/packet-protocols/ppp_serial load base/packet-protocols/pppoe load base/packet-protocols/vlan load base/packet-protocols/mpls load base/packet-protocols/pbb load base/packet-protocols/vntag load base/packet-protocols/udp load base/packet-protocols/tcp load base/packet-protocols/icmp load base/packet-protocols/igmp load base/packet-protocols/llc load base/packet-protocols/novell_802_3 load base/packet-protocols/snap load base/packet-protocols/gre load base/packet-protocols/iptunnel load base/packet-protocols/ayiya load base/packet-protocols/geneve load base/packet-protocols/vxlan load base/packet-protocols/teredo load base/packet-protocols/gtpv1可以看到基础链路层/网络层协议在前隧道与封装协议GRE、IPTunnel、AYIYA、Geneve、VXLAN、Teredo、GTPv1在后这与外层先注册、内层后注册的解析链语义保持一致。顶层main.zeekscripts/base/packet-protocols/main.zeek定义了包的核心 API 与约束是整个包的门面module PacketAnalyzer; load base/frameworks/analyzer/main.zeek export { ## Registers a set of well-known ports for an analyzer. ... global register_for_ports: function(parent: PacketAnalyzer::Tag, child: PacketAnalyzer::Tag, server_ports: set[port], non_server_ports: set[port] defaultset()) : bool; ## Registers an individual well-known port for an analyzer. ... global register_for_port: function(parent: PacketAnalyzer::Tag, child: PacketAnalyzer::Tag, p: port) : bool; ## The maximum depth of the packet analyzer chains. ... const max_depth: count 25 redef; }其中max_depth默认值为 25用于限制报文分析器链的最大嵌套深度一旦超过会触发max_packet_analyzer_depth_exceeded这一 weird 记录将其设为 0 可以禁用该限制。对于深度嵌套的隧道报文如多层 GRE/VXLAN 叠加这个值决定了 Zeek 能拆到第几层洋葱。注册机制端口绑定与链深度控制register_for_ports与register_for_port是脚本层暴露给分析器插件的两个便捷封装其底层实现在同一个文件中function register_for_ports(parent: PacketAnalyzer::Tag, child: PacketAnalyzer::Tag, server_ports: set[port], non_server_ports: set[port] defaultset()) : bool { local rc T; for ( p in server_ports ) { if ( ! register_for_port(parent, child, p) ) rc F; } for ( p in non_server_ports ) { if ( ! register_for_port(parent, child, p) ) rc F; } # Automatically update likely_server_ports with server_ports likely_server_ports server_ports; return rc; } function register_for_port(parent: PacketAnalyzer::Tag, child: PacketAnalyzer::Tag, p: port) : bool { register_packet_analyzer(parent, p as count, child); if ( child !in Analyzer::ports ) Analyzer::ports[child] set(); add Analyzer::ports[child][p]; return T; }关键语义来自源码注释与实现register_for_ports是加法语义向已注册的端口集合中追加而不是替换server_ports会同时自动加入likely_server_ports而non_server_ports如客户端端口不会register_for_port最终调用 BIF 函数register_packet_analyzer声明见 src/packet_analysis/packet_analysis.bif并在Analyzer::ports表中记录该分析器绑定的端口供后续报文分发时查询同文件还声明了try_register_packet_analyzer_by_namesrc/packet_analysis/packet_analysis.bif允许按字符串名称注册分析器失败时返回 false 而不抛错。一个典型调用例子是 GRE 分析器把 UDP 端口 4754 绑定给自己scripts/base/packet-protocols/gre/main.zeekmodule PacketAnalyzer::GRE; export { const default_analyzer: PacketAnalyzer::Tag PacketAnalyzer::ANALYZER_IPTUNNEL redef; const gre_ports { 4754/udp } redef; } event zeek_init() priority20 { PacketAnalyzer::register_for_ports(PacketAnalyzer::ANALYZER_UDP, PacketAnalyzer::ANALYZER_GRE, gre_ports); }这段代码同时展示了两个要点一是zeek_init() priority20的高优先级保证注册早于常规脚本执行二是default_analyzer可被redef覆盖说明默认分析器是允许策略脚本在运行时替换的。链路层分发root 分析器与 DLT 映射报文进入 Zeek 后第一站是ROOT分析器。scripts/base/packet-protocols/root/main.zeek 负责把 pcap 的数据链路类型DLT映射到具体的链路层分析器module PacketAnalyzer::ROOT; export { ## Default analyzer (if we dont know the link type, we assume raw IP) const default_analyzer: PacketAnalyzer::Tag PacketAnalyzer::ANALYZER_IP redef; } const DLT_EN10MB : count 1; const DLT_FDDI : count 10; const DLT_IEEE802_11 : count 105; const DLT_IEEE802_11_RADIO : count 127; const DLT_LINUX_SLL : count 113; const DLT_LINUX_SLL2 : count 276; const DLT_NFLOG : count 239; event zeek_init() priority20 { PacketAnalyzer::register_packet_analyzer(PacketAnalyzer::ANALYZER_ROOT, DLT_EN10MB, PacketAnalyzer::ANALYZER_ETHERNET); PacketAnalyzer::register_packet_analyzer(PacketAnalyzer::ANALYZER_ROOT, DLT_FDDI, PacketAnalyzer::ANALYZER_FDDI); PacketAnalyzer::register_packet_analyzer(PacketAnalyzer::ANALYZER_ROOT, DLT_IEEE802_11, PacketAnalyzer::ANALYZER_IEEE802_11); PacketAnalyzer::register_packet_analyzer(PacketAnalyzer::ANALYZER_ROOT, DLT_IEEE802_11_RADIO, PacketAnalyzer::ANALYZER_IEEE802_11_RADIO); PacketAnalyzer::register_packet_analyzer(PacketAnalyzer::ANALYZER_ROOT, DLT_LINUX_SLL, PacketAnalyzer::ANALYZER_LINUXSLL); PacketAnalyzer::register_packet_analyzer(PacketAnalyzer::ANALYZER_ROOT, DLT_LINUX_SLL2, PacketAnalyzer::ANALYZER_LINUXSLL2); PacketAnalyzer::register_packet_analyzer(PacketAnalyzer::ANALYZER_ROOT, DLT_NFLOG, PacketAnalyzer::ANALYZER_NFLOG); }从源码可以整理出这张 DLT 映射表DLT 常量数值对应分析器典型场景DLT_EN10MB1ETHERNET标准以太网帧DLT_FDDI10FDDI光纤分布式数据接口DLT_IEEE802_11105IEEE802_11802.11 无线帧DLT_IEEE802_11_RADIO127IEEE802_11_RADIO带 Radiotap 头的 802.11DLT_LINUX_SLL113LINUXSLLLinux cooked capture v1DLT_LINUX_SLL2276LINUXSLL2Linux cooked capture v2DLT_NFLOG239NFLOGnetfilter 日志注意default_analyzer默认是ANALYZER_IP如果遇到无法识别的链路类型Zeek 会直接按裸 IP解析这与skip分析器的语义默认也指向 IP见下文互相印证保证了未知封装下依然能解析到网络层。链路层协议族Ethernet、VLAN 与封装链ethernet/main.zeekscripts/base/packet-protocols/ethernet/main.zeek以 ethertype 为分发键注册了完整的二层解析链module PacketAnalyzer::ETHERNET; export { # We use some magic numbers here to denote these. The values here are outside the range of the # standard ethertypes, which should always be above 1536. const SNAP_FORWARDING_KEY : count 0x0001; const NOVELL_FORWARDING_KEY : count 0x0002; const LLC_FORWARDING_KEY : count 0x0003; } event zeek_init() priority20 { PacketAnalyzer::register_packet_analyzer(PacketAnalyzer::ANALYZER_ETHERNET, 0x8847, PacketAnalyzer::ANALYZER_MPLS); PacketAnalyzer::register_packet_analyzer(PacketAnalyzer::ANALYZER_ETHERNET, 0x88E7, PacketAnalyzer::ANALYZER_PBB); PacketAnalyzer::register_packet_analyzer(PacketAnalyzer::ANALYZER_ETHERNET, 0x0800, PacketAnalyzer::ANALYZER_IP); PacketAnalyzer::register_packet_analyzer(PacketAnalyzer::ANALYZER_ETHERNET, 0x86DD, PacketAnalyzer::ANALYZER_IP); PacketAnalyzer::register_packet_analyzer(PacketAnalyzer::ANALYZER_ETHERNET, 0x0806, PacketAnalyzer::ANALYZER_ARP); PacketAnalyzer::register_packet_analyzer(PacketAnalyzer::ANALYZER_ETHERNET, 0x8035, PacketAnalyzer::ANALYZER_ARP); PacketAnalyzer::register_packet_analyzer(PacketAnalyzer::ANALYZER_ETHERNET, 0x8100, PacketAnalyzer::ANALYZER_VLAN); PacketAnalyzer::register_packet_analyzer(PacketAnalyzer::ANALYZER_ETHERNET, 0x88A8, PacketAnalyzer::ANALYZER_VLAN); PacketAnalyzer::register_packet_analyzer(PacketAnalyzer::ANALYZER_ETHERNET, 0x9100, PacketAnalyzer::ANALYZER_VLAN); PacketAnalyzer::register_packet_analyzer(PacketAnalyzer::ANALYZER_ETHERNET, 0x8864, PacketAnalyzer::ANALYZER_PPPOE); PacketAnalyzer::register_packet_analyzer(PacketAnalyzer::ANALYZER_ETHERNET, 0x8926, PacketAnalyzer::ANALYZER_VNTAG); PacketAnalyzer::register_packet_analyzer(PacketAnalyzer::ANALYZER_ETHERNET, SNAP_FORWARDING_KEY, PacketAnalyzer::ANALYZER_SNAP); PacketAnalyzer::register_packet_analyzer(PacketAnalyzer::ANALYZER_ETHERNET, NOVELL_FORWARDING_KEY, PacketAnalyzer::ANALYZER_NOVELL_802_3); PacketAnalyzer::register_packet_analyzer(PacketAnalyzer::ANALYZER_ETHERNET, LLC_FORWARDING_KEY, PacketAnalyzer::ANALYZER_LLC); }从源码可以整理出 Ethertype 分发表Ethertype协议子分析器0x0800IPv4IP0x86DDIPv6IP0x0806 / 0x8035ARP / RARPARP0x8100 / 0x88A8 / 0x9100VLAN802.1Q / QinQVLAN0x8847MPLSMPLS0x88E7PBBProvider Backbone BridgePBB0x8864PPPoEPPPOE0x8926VNTAGVMware 虚拟网络标签VNTAG文件头部的注释解释了三个魔法键的用意0x0001、0x0002、0x0003故意落在标准 ethertype 区间1536 以上之外用来表示无法用 ethertype 判断时转发给 SNAP、Novell 802.3、LLC 的路径。也就是说当以太网帧长度字段不足以直接判定类型时Zeek 会走这几条特殊分发路径。vlan/main.zeekscripts/base/packet-protocols/vlan/main.zeek几乎复刻了同样的分发逻辑只是父分析器从ANALYZER_ETHERNET换成了ANALYZER_VLAN这样剥离 VLAN 头后的内层帧仍能继续走相同的 ethertype 分拣实现多级 VLAN包括 QinQ 嵌套的连续解析。网络层分发IP 分析器与协议号映射ip/main.zeekscripts/base/packet-protocols/ip/main.zeek把 IP 协议号映射到传输层/隧道分析器是整个网络层分发的枢纽module PacketAnalyzer::IP; export { ## Default analyzer const default_analyzer: PacketAnalyzer::Tag PacketAnalyzer::ANALYZER_UNKNOWN_IP_TRANSPORT redef; } const IPPROTO_TCP : count 6; const IPPROTO_UDP : count 17; const IPPROTO_ICMP : count 1; const IPPROTO_ICMP6 : count 58; const IPPROTO_IPIP : count 4; const IPPROTO_IPV6 : count 41; const IPPROTO_GRE : count 47; function analyzer_option_change_ignore_checksums_nets(ID: string, new_value: set[subnet], location: string) : set[subnet] { if ( ID ignore_checksums_nets ) PacketAnalyzer::__set_ignore_checksums_nets(new_value); return new_value; } event zeek_init() priority20 { PacketAnalyzer::register_packet_analyzer(PacketAnalyzer::ANALYZER_IP, IPPROTO_IPIP, PacketAnalyzer::ANALYZER_IPTUNNEL); PacketAnalyzer::register_packet_analyzer(PacketAnalyzer::ANALYZER_IP, IPPROTO_IPV6, PacketAnalyzer::ANALYZER_IPTUNNEL); PacketAnalyzer::register_packet_analyzer(PacketAnalyzer::ANALYZER_IP, IPPROTO_GRE, PacketAnalyzer::ANALYZER_GRE); PacketAnalyzer::register_packet_analyzer(PacketAnalyzer::ANALYZER_IP, IPPROTO_TCP, PacketAnalyzer::ANALYZER_TCP); PacketAnalyzer::register_packet_analyzer(PacketAnalyzer::ANALYZER_IP, IPPROTO_UDP, PacketAnalyzer::ANALYZER_UDP); PacketAnalyzer::register_packet_analyzer(PacketAnalyzer::ANALYZER_IP, IPPROTO_ICMP, PacketAnalyzer::ANALYZER_ICMP); PacketAnalyzer::register_packet_analyzer(PacketAnalyzer::ANALYZER_IP, IPPROTO_ICMP6, PacketAnalyzer::ANALYZER_ICMP); Option::set_change_handler(ignore_checksums_nets, analyzer_option_change_ignore_checksums_nets, 5); }IP 协议号分发表整理如下协议号名称子分析器1ICMPICMP4IP-in-IPIPTUNNEL6TCPTCP17UDPUDP41IPv66in4 隧道IPTUNNEL47GREGRE58ICMPv6ICMP这段代码还体现了 Zeek 的运行时配置联动机制analyzer_option_change_ignore_checksums_nets通过Option::set_change_handler挂接到全局选项ignore_checksums_nets上一旦用户在策略层修改该选项立即调用PacketAnalyzer::__set_ignore_checksums_nets更新底层校验行为。换句话说IP 层的校验和忽略网段配置是可热更新的无需重启 Zeek。IP 层还有一个值得注意的默认值default_analyzer为ANALYZER_UNKNOWN_IP_TRANSPORT即遇到未注册的协议号时Zeek 不会报错中断而是走未知传输层分析器继续保持连接状态并上报相关的未知协议信息。传输层TCP 与 UDPudp/main.zeekscripts/base/packet-protocols/udp/main.zeek与tcp/main.zeekscripts/base/packet-protocols/tcp/main.zeek本身非常精简前者仅保留module PacketAnalyzer::UDP;声明后者只有一行模块声明和一段被注释掉的空zeek_init。从源码结构可以推断TCP/UDP 分析器的解析主体由 C 侧实现src/packet_analysis/protocol/tcp、src/packet_analysis/protocol/udp脚本侧只承担命名空间与扩展挂钩的角色。真正的端口到应用层分析器分发发生在 Zeek 的连接级分析器框架中——也就是base/frameworks/analyzer被 scripts/base/packet-protocols/main.zeek 顶部load base/frameworks/analyzer/main.zeek引入其职责是把解析好的 TCP/UDP 流交给 HTTP、DNS 等应用层分析器。隧道与封装协议族隧道协议是本包的重头戏索引文档中列出了 GRE、IPTunnel、AYIYA、Geneve、VXLAN、Teredo、GTPv1 七个子目录覆盖了数据中心、运营商与 IPv6 过渡场景的主要封装手段。IPTunnel二层隧道与 Aruba 场景iptunnel/main.zeekscripts/base/packet-protocols/iptunnel/main.zeek把 IP 隧道视为内层又是完整报文的场景。源码注释说明了 Aruba 的处理Aruba 无线隧道通过 GRE 承载GRE 设置gre_link_type DLT_IEEE_802_11使内层按 802.11 解析否则默认按裸 IPDLT_RAW处理。该文件随后把 0x8200 到 0x8370 这一整段 ethertype 区间全部注册为转发到ANALYZER_IEEE802_11覆盖了 Aruba 隧道内层帧常见的以太类型范围文件末尾还留有 TODO 注释讨论 0x9000 应如何丢弃——这些细节体现了隧道解析在真实网络中的边界情况处理。其他隧道分析器GREscripts/base/packet-protocols/gre/main.zeekdefault_analyzer为ANALYZER_IPTUNNEL即 GRE 解封装后的内层默认按 IP 隧道继续解析同时把 UDP 4754 注册为 GRE 的知名端口。VXLAN / Genevevxlan/main.zeek、geneve/main.zeek与 GRE 类似将 UDP 知名端口绑定到相应分析器内层默认进入 IPTUNNEL 或以太网分析链。Teredoteredo/main.zeek处理 Teredo 隧道将 IPv6 报文封装在 UDP 中穿越 IPv4 网络。AYIYAayiya/main.zeek处理 AYIYAAnything In Anything隧道协议。GTPv1gtpv1/main.zeekGPRS 隧道协议 v1用于移动运营商核心网按 GTP 消息类型与 TEID 关联隧道内会话。这些脚本的注册模式高度一致都以zeek_init() priority20调用register_packet_analyzer或register_for_ports并把隧道解封装后的内层交给谁通过default_analyzer显式声明——这正是 Zeek 能以统一框架支持多层嵌套隧道的关键设计。skip 与 null两个伪协议skip/main.zeekscripts/base/packet-protocols/skip/main.zeek定义了一个可配置的跳过机制module PacketAnalyzer::SKIP; export { ## Default analyzer const default_analyzer: PacketAnalyzer::Tag PacketAnalyzer::ANALYZER_IP redef; ## Bytes to skip. const skip_bytes: count 0 redef; }skip_bytes允许跳过报文头部指定数量的字节后再交给下一个分析器默认值 0可通过redef修改默认目标仍是 IP 分析器。它常用于处理某些带自定义前导头的链路。null分析器null/main.zeek则是空转占位供父分析器在没有实质内容可解析时使用两者共同保证了分析链的连续性。IGMP脚本层完整示例IGMP 是索引文档中唯一附带详细说明的协议也是观察脚本定义类型 Spicy 分析器 事件出口完整链路的最佳样例它包含三个脚本文件scripts/base/packet-protocols/igmp/types.zeek定义 IGMP 消息类型枚举与 v3 组记录类型均以 RFC 3376 为准module IGMP; export { ## IGMP message types, as defined in :rfc:3376#section-4. type MessageType: enum { MEMBERSHIP_QUERY 0x11, MEMBERSHIP_REPORT_V1 0x12, MEMBERSHIP_REPORT_V2 0x16, LEAVE_GROUP 0x17, MEMBERSHIP_REPORT_V3 0x22, BAD_CHECKSUM 0x00 }; ## IGMP Version 3 Membership Report Group record types, as defined in ## :rfc:3376#section-4.2.12 type GroupType: enum { MODE_IS_INCLUDE 1, MODE_IS_EXCLUDE 2, CHANGE_TO_INCLUDE_MODE 3, CHANGE_TO_EXCLUDE_MODE 4, ALLOW_NEW_SOURCES 5, BLOCK_OLD_SOURCES 6 }; ## IGMP Version 3 Membership Report Group record, as defined in ## :rfc:3376#section-4.2 type Group: record { group_type: GroupType; aux_data_len: count; num_sources: count; multicast_addr: addr; sources: vector of addr; aux_data: string; }; }scripts/base/packet-protocols/igmp/main.zeek把 Spicy 实现的 IGMP 分析器注册到 IP 协议号 2 上module IGMP; event zeek_init() priority5 { if ( ! PacketAnalyzer::try_register_packet_analyzer_by_name(IP, 0x02, IGMP) ) { Reporter::error(Failed to register IGMP Spicy analyzer.); } }这里用的是按名称注册的try_register_packet_analyzer_by_name对应 src/packet_analysis/packet_analysis.bif优先级为 5注册失败会通过Reporter::error显式报错——这也是所有 Spicy 分析器插件注册的标准失败处理模式。IGMP 报文在 IP 层由协议号 2 直接分发无需端口绑定。scripts/base/packet-protocols/igmp/spicy-events.zeek定义 Spicy 分析器向上层抛出的 Zeek 事件共 45 行覆盖IGMP::message每个 IGMP 报文一条携带raw_pkt_hdr与消息类型、IGMP::membership_query、IGMP::membership_report_v1、IGMP::membership_report_v2、IGMP::leave_group以及 v3 版本的事件如带源地址向量的 Membership Report v3。这些事件就是脚本开发者在策略层编写告警与统计逻辑的入口点例如可以订阅IGMP::leave_group检测组播成员快速离开行为。其余链路层协议索引文档中还列出若干链路层分析器各自承担特定封装LLC / SNAP / Novell 802.3llc/、snap/、novell_802_3/处理以太网 II 帧之外的 IEEE 802.2 LLC、SNAP 子网访问协议以及 Novell 802.3 原始帧格式是 Ethernet 分析器通过三个魔法键0x0001/0x0002/0x0003转发的目标PPPoE / PPP / PPP_serialpppoe/、ppp/、ppp_serial/宽带拨号链路族PPPoE 帧经 0x8864 从 Ethernet 进入解封装后交给 PPP再继续解析 PPP 承载的网络层协议FDDI / IEEE 802.11 / IEEE 802.11 Radiofddi/、ieee802_11/、ieee802_11_radio/由 ROOT 分析器按 DLT 分发支撑无线与老式局域网Linux SLL / SLL2 / NFLOGlinux_sll/、linux_sll2/、nflog/Linux cooked 捕获格式与 netfilter 日志设备常见于tcpdump -i any与 iptables NFLOG 抓包场景MPLS / PBB / VNTAGmpls/、pbb/、vntag/由 Ethernet 分析器按 ethertype 分发分别处理标签交换、运营商骨干桥与 VMware VNTAG 封装。与源码的对应关系base/packet-protocols的脚本只承担注册表角色真正的协议解码逻辑位于 C 侧 src/packet_analysis/protocol 目录含ethernet、ip、tcp、udp、icmp、gre、vxlan、geneve、teredo、vntag等子目录以及 Spicy 分析器目录如 IGMP 的 Spicy 实现。register_packet_analyzer的 BIF 声明在 src/packet_analysis/packet_analysis.bif其运行时行为由 src/packet_analysis/Manager.cc 实现。如果读者想验证本篇文章的分发表可直接对照各子目录下的main.zeek与 scripts/base/packet-protocols/load.zeek 的load顺序进行交叉核对。小结读透 base/packet-protocols 的三个抓手加载顺序即解析顺序__load__.zeek中的load顺序与报文分析链的构造顺序一一对应从 rootDLT到链路层ethertype到网络层协议号再到隧道default_analyzer 指定内层去向三张分发表ROOT 的 DLT 表、ETHERNET/VLAN 的 ethertype 表、IP 的协议号表是理解任何报文下一步去哪的关键默认值与可 redef 常量max_depth默认 25、default_analyzer、skip_bytes等均支持redef策略脚本可以在不改动核心代码的前提下调整解析深度与默认分发路径。掌握这些机制后无论是排查为什么某个隧道报文没被解析还是为自定义封装编写自己的 packet analyzer你都能直接从scripts/base/packet-protocols与src/packet_analysis/protocol定位到对应实现并沿用register_packet_analyzerdefault_analyzer的既有模式完成注册。赞分享网络安全网络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点击查看免费下载相关推荐RevokeMsgPatcher 微信QQ防撤回补丁RevokeMsgPatcher 微信QQ防撤回补丁 RevokeMsgPatcher 是一个用于 Windows 电脑版微信、QQ、TIM 的防撤回补丁工具。网络安全网络IDSZeek Teredo 隧道分析事件详解从 RFC 4380 封装解析到脚本层事件编程Zeek Teredo 隧道分析事件详解从 RFC 4380 封装解析到脚本层事件编程 导读 TeredoRFC 4380是一种将 IPv6 报文封装进网络安全网络IDSZeek 包分析框架Packet Analysis深入解析从链路层解析到会话构建的插件化架构Zeek 包分析框架Packet Analysis深入解析从链路层解析到会话构建的插件化架构 Packet Analysis包分析是 Zeek 负责解网络安全网络IDS上一篇反向操控串口屏serial-display-module模拟按键按下/抬起的2种玩法下一篇源师兄活动信息平台实战案例2025鸿蒙生态人才大会全解读附参与路径与时间安排创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

数琨创享 Sigmar TQMS 全面质量管理数智化运营平台——21大应用场景发布

数琨创享 Sigmar TQMS 全面质量管理数智化运营平台——21大应用场景发布

数琨创享 Sigmar TQMS全面质量管理数智化运营平台质量问题:可预判 可溯源 可根治 可改进质量全程:可追溯 可归因 可管理质量成本:有来处 有去处 有责任人管得住过程,查得清问题,算得明成本智能分析,…

2026/10/9 5:28:34 阅读更多 →
3D图形开发实战:从坐标变换到渲染管线与性能优化

3D图形开发实战:从坐标变换到渲染管线与性能优化

1. 从“2. 3D图形”这个标题说起:为什么它值得单独拎出来讲看到“2. 3D图形”这个标题,很多人第一反应可能是:这不就是计算机图形学里最基础的一章吗?教科书目录里排第二章,前面讲完数学基础,后面接着讲渲染…

2026/10/9 5:28:34 阅读更多 →
物联网复杂无线通信场景下,天线系统如何成为连接能力的关键组件

物联网复杂无线通信场景下,天线系统如何成为连接能力的关键组件

1. 引言 在物联网加速落地的今天,设备能否稳定联网,往往不取决于主控芯片有多快,而取决于天线系统能不能在多频段、多协议、高密度、严苛环境中保持干净、高效、可靠的信号传输。尤其当设备被压缩到手机大小、需要同时运行蜂窝、GNSS、Wi-Fi、…

2026/10/9 5:28:34 阅读更多 →

最新新闻

方便买网站项目策划书样本:从技术选型到跑通第一单的实操指南

方便买网站项目策划书样本:从技术选型到跑通第一单的实操指南

简介:这份《方便买网站项目策划书样本》面向电商创业者、网络营销初学者及需要撰写购物网站运营方案的学生与从业者,提供一份可参考的策划书范本,帮助解决网站定位、营销推广与运营思路梳理等实际问题。资源包共1个doc文档,大小约…

2026/10/9 11:43:46 阅读更多 →
高阶OAM调制与5G NR误码率仿真:从原理到MATLAB实现

高阶OAM调制与5G NR误码率仿真:从原理到MATLAB实现

简介:面向5G及未来通信方向的研究人员与学生,这份资源聚焦高阶OAM(轨道角动量)调制在5G移动通信中的应用,可用于理解OAM模式复用、QPSK调制及AWGN信道下的误码率分析。压缩包体积仅2KB,内含1个Matlab脚本&a…

2026/10/9 11:43:46 阅读更多 →
Cursor 报错 This model provider doesn‘t serve your region:把 Base URL 改到 TaoToken 的排查清单

Cursor 报错 This model provider doesn‘t serve your region:把 Base URL 改到 TaoToken 的排查清单

/* 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 11:43:46 阅读更多 →
股权设计最大的坑:权责不对等,如何用机制让责任匹配权力

股权设计最大的坑:权责不对等,如何用机制让责任匹配权力

前阵子有个做智能硬件的创始人和我聊股权方案,背景挺典型:合伙人出资60万占30%,他出技术加全职管理占70%,公司已经跑了一年,产品出了三版,账面刚回正。我问他三个问题:发不出工资的那两个月是谁…

2026/10/9 11:43:46 阅读更多 →
从Nginx日志分析到前端性能调优:缓存命中率与TTFB排查实战

从Nginx日志分析到前端性能调优:缓存命中率与TTFB排查实战

那是一个普通的周二下午,线上C端首页监控突然一片红,LCP从1.8秒直接飙到6.2秒。我打开DevTools,发现最大的那个JS chunk的TTFB(Time To First Byte)是4.7秒。第一反应是后端接口慢了,可后端同事调出Nginx a…

2026/10/9 11:43:46 阅读更多 →
Xshell授权真相与安全终端替代方案指南

Xshell授权真相与安全终端替代方案指南

1. 项目概述:为什么“Xshell免费版下载”这个需求背后藏着大量认知偏差“Xshell官网免费版下载”——这七个字在搜索框里每天被输入成千上万次,但几乎99%的提问者并不清楚自己真正要找的是什么。我接触过上百位刚入门的运维新人、高校实验室学生、中小企…

2026/10/9 11:42:45 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

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/8 15:26:40 阅读更多 →
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/8 21:13:17 阅读更多 →
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/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练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/9 6:17:20 阅读更多 →