
网络安全网络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 源码树中的核心脚本 scripts/base/packet-protocols/ip/main.zeek 及其自动生成文档 doc/scripts/base/packet-protocols/ip/main.zeek.rst 展开系统讲解 Zeek 在链路层之上、传输层之下对 IPv4/IPv6 数据包的分析处理逻辑。你将掌握PacketAnalyzer::IP命名空间的核心配置项default_analyzer的语义与重定义方法、IP 协议号与传输层分析器的注册映射关系、ignore_checksums_nets校验豁免机制的底层原理以及 IP 分析器在 C 层的完整处理流水线头部长校验、分片重组、隧道检测、协议分发从而具备在真实环境中定制 IP 层分析行为的实战能力。一、模块定位脚本文档与源码的对应关系Zeek 的脚本层文档采用自动生成机制doc/scripts/base/packet-protocols/ip/main.zeek.rst是 scripts/base/packet-protocols/ip/main.zeek 的接口文档声明了PacketAnalyzer::IP命名空间及其对外可重定义选项。该脚本本身只包含两个文件load.zeek仅一行load ./main负责加载主脚本main.zeek核心逻辑声明模块、协议常量、选项与初始化事件。脚本模块module PacketAnalyzer::IP对应 C 层的同名命名空间zeek::packet_analysis::IP其实现位于 src/packet_analysis/protocol/ip/IP.cc 与 src/packet_analysis/protocol/ip/IP.h。插件注册入口 Plugin.cc 将分析器以名称IP注册为 packet analyzer 组件插件描述为 Packet analyzer for IP fallback (v4 or v6)说明该分析器是 IPv4/IPv6 的统一入口。二、核心可重定义选项default_analyzer文档定义的唯一对外配置项是PacketAnalyzer::IP::default_analyzer其完整规格如下属性值类型PacketAnalyzer::Tagredef可重定义默认值PacketAnalyzer::ANALYZER_UNKNOWN_IP_TRANSPORT语义默认分析器Default analyzer源码中的声明与文档一致module PacketAnalyzer::IP; export { ## Default analyzer const default_analyzer: PacketAnalyzer::Tag PacketAnalyzer::ANALYZER_UNKNOWN_IP_TRANSPORT redef; }2.1 语义解读default_analyzer定义了当 IP 数据包的上层协议无法映射到任何已注册传输层分析器时Zeek 默认采用的PacketAnalyzer::Tag。默认值ANALYZER_UNKNOWN_IP_TRANSPORT表明对于未知的 IP 传输协议Zeek 会将其归类为未知传输并交由对应的处理逻辑通常是记录 weird 事件并丢弃无法解析的载荷而不是强行为其匹配错误的解析器。2.2 实战重定义方法由于该选项带redef属性用户可以在自己的 Zeek 脚本如 site/local.zeek中覆盖它。典型的重定义写法# 例如将未知 IP 传输协议统一交给某个自定义的 PacketAnalyzer::Tag redef PacketAnalyzer::IP::default_analyzer PacketAnalyzer::ANALYZER_MY_CUSTOM;需要说明的是default_analyzer是脚本层的兜底标签真正决定 IP 载荷分发去向的是zeek_init中通过register_packet_analyzer建立的协议号 → 分析器映射见下节。当映射表中不存在某协议号时这个默认标签才作为回退值生效。三、IP 协议号常量与传输层分析器注册main.zeek在模块内声明了 7 个 IP 协议号常量覆盖了 Zeek 在内核IP 分析器层面直接参与分发的协议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;这些数值与 IANA 分配的 IP 协议号一一对应TCP6、UDP17、ICMP1、ICMPv658、IP-in-IP4、IPv6 封装41、GRE47。3.1 zeek_init 中的注册表脚本在zeek_init事件优先级 20中完成所有映射注册可整理为一张清晰的映射表父分析器协议号子分析器ANALYZER_IPIPPROTO_IPIP(4)ANALYZER_IPTUNNELANALYZER_IPIPPROTO_IPV6(41)ANALYZER_IPTUNNELANALYZER_IPIPPROTO_GRE(47)ANALYZER_GREANALYZER_IPIPPROTO_TCP(6)ANALYZER_TCPANALYZER_IPIPPROTO_UDP(17)ANALYZER_UDPANALYZER_IPIPPROTO_ICMP(1)ANALYZER_ICMPANALYZER_IPIPPROTO_ICMP6(58)ANALYZER_ICMP关键要点隧道协议优先IP-in-IP、IPv6-in-IP、GRE 这三种封装协议被直接路由到IPTUNNEL/GRE分析器使 Zeek 具备隧道内再解封装的能力。结合 IP.cc 中packet-tunnel_type BifEnum::Tunnel::IP的赋值逻辑当NextProto()为 4 或 41 时设置可以确认 IP 层主动标记隧道类型供上层 VXLAN、Teredo 等分析器识别封装链。ICMP 复用ICMPv658与 ICMP1共用ANALYZER_ICMP即同一个分析器同时处理两代 ICMP 协议。分发的入口register_packet_analyzer将映射写入 packet analyzer 管理器对应 C 的packet_mgr-RegisterProtocol见 packet_analysis.bif 中register_packet_analyzer的 bif 实现此后ForwardPacket依据协议号查找子分析器继续处理。3.2 未覆盖协议的去向TCP/UDP/ICMP/隧道协议之外的协议号如 ESP50、SCTP132 等没有在脚本层注册分析器。IP 分析器通过ForwardPacket转发时找不到对应子分析器会触发Weird报告或落入default_analyzer所指向的ANALYZER_UNKNOWN_IP_TRANSPORT兜底路径。这正是default_analyzer选项存在的意义。四、checksum 豁免ignore_checksums_nets 的完整链路main.zeek中最具实战价值的部分是 checksum 校验的网段级豁免机制涉及脚本、bif 与 C 三层联动。4.1 选项定义ignore_checksums_nets是一个全局 option定义于 scripts/base/init-bare.zeek## Checksums are ignored for all packets with a src address within this set of ## networks. Useful for cases where a host might be seeing packets collected ## from local hosts before checksums were applied by hardware. This frequently ## manifests when sniffing a local management interface on a host and Zeek sees ## packets before the hardware has had a chance to apply the checksums. option ignore_checksums_nets: set[subnet] set();该 option 的典型使用场景在宿主机本地管理网卡上抓包时硬件尚未对报文计算 checksumZeek 会误报大量bad_IP_checksum。此时将源地址所在网段加入该集合即可豁免校验。4.2 动态同步机制main.zeek通过Option::set_change_handler将 option 的变更事件与回调函数绑定保证运行期修改ignore_checksums_nets能立即同步到 C 层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; }回调调用内部函数PacketAnalyzer::__set_ignore_checksums_nets其 bif 定义于 packet_analysis.bif## Internal function that is used to update the core-mirror of the script-level ignore_checksums_nets variable. function PacketAnalyzer::__set_ignore_checksums_nets%(v: subnet_set%) : bool %{ if ( v-GetType()-Tag() ! zeek::TYPE_TABLE ) zeek::emit_builtin_error(update_ignore_checksums_net() requires a table/set argument); zeek::packet_analysis::IP::IPBasedAnalyzer::SetIgnoreChecksumsNets(zeek::IntrusivePtr{zeek::NewRef{}, v-AsTableVal()}); return true; %}4.3 C 侧的核心镜像C 端由IPBasedAnalyzer维护该集合的镜像实现在 IPBasedAnalyzer.ccTableValPtr IPBasedAnalyzer::ignore_checksums_nets_table nullptr; void IPBasedAnalyzer::SetIgnoreChecksumsNets(TableValPtr t) { IPBasedAnalyzer::ignore_checksums_nets_table std::move(t); } TableValPtr IPBasedAnalyzer::GetIgnoreChecksumsNets() { if ( ! IPBasedAnalyzer::ignore_checksums_nets_table ) IPBasedAnalyzer::ignore_checksums_nets_table zeek::id::find_valTableVal(ignore_checksums_nets); return IPBasedAnalyzer::ignore_checksums_nets_table; }注释明确说明该缓存的设计动机避免基于 IP 的分析器TCP/UDP/ICMP每次查包时都去脚本层做开销较高的变量查找。GetIgnoreChecksumsNets()在首次访问时直接从脚本 ID 表取回ignore_checksums_nets的值作为兜底。4.4 校验豁免的判定位置校验判定发生在 IP 分析器的核心处理函数中IP.ccif ( ! packet-l3_checksummed ! zeek::detail::ignore_checksums ip4 ! IPBasedAnalyzer::GetIgnoreChecksumsNets()-Contains(packet-ip_hdr-IPHeaderSrcAddr()) zeek::detail::in_cksum(reinterpret_castconst uint8_t*(ip4), ip_hdr_len) ! 0xffff ) { Weird(bad_IP_checksum, packet); return false; }由该代码可以总结出校验跳过需满足的任一条件网卡/驱动已承诺做过 L3 校验l3_checksummed为真全局关闭校验ignore_checksums为真或命令行-C选项——见 init-bare.zeek 中ignore_checksums的注释说明-C会覆盖该变量源地址命中ignore_checksums_nets中的网段。只有同时不满足上述条件且 IP 首部校验和非法时才上报bad_IP_checksum并丢弃该包。五、C 实现纵深IPAnalyzer::AnalyzePacket 处理流水线脚本层负责注册与配置真正的包处理逻辑在 IP.cc 的IPAnalyzer::AnalyzePacket()L31-L276。从源码结构看其流水线依次包含以下阶段5.1 头部长度与版本判定首先校验捕获长度足以容纳 IP 头IPv4 最小 20 字节不足则报truncated_IP随后读取ip_v字段判断版本4 走 IPv4 分支构造IP_Hdr并置l3_proto L3_IPV46 走 IPv6 分支额外校验 40 字节最小头长置L3_IPV6其余版本报unknown_ip_version并拒绝。5.2 长度字段交叉校验这是健壮性最强的部分逐项检查TotalLen() 0时若开启ignore_checksums则用 caplen 兜底应对 TCP 分段卸载 TSO 将 ip_len 清零的常见现象否则直接返回此时 checksum 也必然错误packet-len total_len hdr_size报truncated_IP_lenIP 头长度大于总长度或大于捕获长度时分别报invalid_IP_header_size、internally_truncated_headerIPv4/IPv6 的最小头部尺寸不满足时报IPv4_min_header_size/IPv6_min_header_size。5.3 封装栈记录与包过滤若packet-encap非空处于隧道链中将当前 IP 头保存到封装栈最后一层供回溯时使用随后交给PacketFilter匹配命中过滤规则则直接丢弃。5.4 分片重组检测到分片IsFragment()时置dump_packet true强制记录分片捕获长度不足的分片除首片外直接丢弃首片对头部-only 追踪仍有分析价值完整分片交给fragment_mgr-NextFragment()重组重组未完成则返回完成后用重组包替换原ip_hdr、同步len/cap_len。这也印证了FragmentReassemblerTracker对重组器生命周期含定时器的托管。5.5 ESP 与移动性头的截断处理当LastHeader() IPPROTO_ESP时载荷已加密停止构建协议链触发esp_packet事件并返回当LastHeader() IPPROTO_MOBILITY时校验移动头 checksumbad_MH_checksum触发mobile_ipv6_message事件若NextProto()非IPPROTO_NONE还会报mobility_piggyback。5.6 载荷前移与协议分发将data指针移到ip_hdr-Payload()用PayloadLen()限制剩余长度proto ip_hdr-NextProto()写入packet-proto。分发前再做一次bogus_IP_header_lengths检查若proto为 IPv4/IPv6 则设置tunnel_type BifEnum::Tunnel::IPIPPROTO_NONE且非 Teredo 气泡场景时报ipv6_no_next其余协议一律走ForwardPacket(len, data, packet, proto)交给下一级分析器。5.7 辅助解析接口 ParsePacketIP.h 还导出了ParsePacket()辅助函数供隧道解析场景使用校验 caplen 是否足够容纳 IP 头、包头版本号是否与protoIPPROTO_IPV4/IPPROTO_IPV6一致并要求捕获长度与TotalLen()严格相等返回OK/CAPLEN_TOO_SMALL/CAPLEN_TOO_LARGE/BAD_PROTOCOL四态结果。六、IPBasedAnalyzer传输层分析器的公共基类default_analyzer与 checksum 豁免都属于 IP 分析体系的通用机制其载体是 IPBasedAnalyzer——被 TCP、UDP、ICMP 分析器继承复用的基类头文件注释A base class for reuse by packet analyzers based on IP... to reduce a large amount of duplicated code。它提供的公共能力包括端口→会话分析器映射RegisterAnalyzerForPort/UnregisterAnalyzerForPort维护知名端口到分析器标签的映射内部为std::mapuint32_t, tag_set*DumpPortDebug输出调试信息连接创建与角色判定InitConnKey初始化五元组ConnKeyNewConn创建Connection对象WantConnection决定是否分析该连接含源/响应角色翻转判断IsLikelyServerPort判断端口是否更像服务端头部截断检查CheckHeaderTrunc统一校验传输层头长度checksum 集合镜像前文所述的SetIgnoreChecksumsNets/GetIgnoreChecksumsNets静态接口即定义于此。会话接入方面MakeSessionAdapter将数据包分析接入 session 分析框架TCP/UDP 的会话状态机、重组器等均由该适配器桥接MakePIA则为需要协议识别辅助PIA的分析器提供钩子。连接键ConnKey按是否携带 VLAN 信息分为两种实现位于 src/packet_analysis/protocol/ip/conn_key/fivetuple 与 vlan_fivetuple 子目录共同基类在 IPBasedConnKey.h。七、实战配置与验证7.1 豁免内网网段 checksum 校验# 在 site/local.zeek 或自定义脚本中 option ignore_checksums_nets { 192.168.0.0/16, 10.0.0.0/8 };该配置实时生效依赖Option::set_change_handler动态同步适用于本地管理口抓包、硬件未打校验和的场景。7.2 为未知 IP 传输协议指定默认分析器redef PacketAnalyzer::IP::default_analyzer PacketAnalyzer::ANALYZER_UDP;注意此重定义只影响查不到映射的协议号的兜底分发已注册的 TCP/UDP/ICMP/隧道协议仍按第五节所述映射表路由。7.3 自定义协议号注册若需让某个自定义协议号走特定分析器参照main.zeek的zeek_init写法event zeek_init() priority20 { PacketAnalyzer::register_packet_analyzer(PacketAnalyzer::ANALYZER_IP, 132, PacketAnalyzer::ANALYZER_SCTP); }7.4 验证手段使用 Zeek 自带测试体系验证行为IP 分析相关 btest 用例位于 testing/btest如 checksum、分片、隧道相关.test文件运行期可通过zeek -C全局关闭 checksum 校验-C覆盖ignore_checksums或观察weird日志中的bad_IP_checksum、truncated_IP、unknown_ip_version、ipv6_no_next等事件来定位 IP 层异常。结语PacketAnalyzer::IP模块是 Zeek 数据包分析链中承上启下的关键一环脚本层以极简的代码协议号常量 一张注册表 一个可重定义默认分析器 一个 checksum 豁免 option完成了全部配置面C 层的IPAnalyzer::AnalyzePacket则以严格的头部校验、分片重组、隧道封装追踪和协议分发保障了解析的健壮性。理解default_analyzer与ignore_checksums_nets这两个配置入口配合 IP.cc 的源码细节即可在真实环境中精准定制与排障 IP 层分析行为。赞分享网络安全网络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 网络分析框架中的 PPPoE 包分析器与 PacketAnalyzer::PPPoE::session_id() 函数深度解析Zeek 网络分析框架中的 PPPoE 包分析器与 PacketAnalyzer::PPPoE::session_id 函数深度解析 本文围绕 Zeek 内置的网络安全网络IDS5G网络数据包解析终极指南深入理解TCP/IP协议解析5G网络数据包解析终极指南深入理解TCP/IP协议解析 随着5G技术的快速发展网络数据包解析在通信领域变得越来越重要。本文将为您详细介绍如何使用ANTLR语编程语言编译器开发工具RevokeMsgPatcher 微信QQ防撤回补丁RevokeMsgPatcher 微信QQ防撤回补丁 RevokeMsgPatcher 是一个用于 Windows 电脑版微信、QQ、TIM 的防撤回补丁工具。网络安全网络IDS上一篇Apache DataFusion分布式锁性能测试吞吐量与延迟下一篇Nuclide高级重构工具代码提取与内联重构创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考