ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Zeek PacketFilter 框架深度解析:BPF 抓包过滤器的管理、优先级与动态安装机制

Zeek PacketFilter 框架深度解析:BPF 抓包过滤器的管理、优先级与动态安装机制 网络安全网络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 的 PacketFilter 框架base/frameworks/packet-filter负责统一管理 Zeek 的 BPF 抓包过滤器capture filter从默认放行全部流量到命令行过滤器的优先级覆盖再到脚本内capture_filters/restrict_filters的叠加组合乃至运行期动态排除特定流量。阅读完本文你将掌握该框架的核心配置项default_capture_filter、restricted_filter、max_filter_compile_time等、四大公开 APIexclude、exclude_for、remove_exclude、install、三个工具函数combine_filters、port_to_bpf、sampling_filter以及丢包统计与失败通知机制并能在真实部署中正确编写和调试 Zeek 的抓包过滤规则。一、框架定位Zeek 如何决定抓什么流量PacketFilter 框架的官方定位非常明确它支撑了 Zeek 设置自身 BPF capture filter 的完整流程见 doc/scripts/base/frameworks/packet-filter/index.rst。框架由四个脚本组成load.zeek 负责统一加载脚本职责main.zeek核心过滤器优先级裁决、构建build、预编译校验与安装install、日志流与通知类型定义utils.zeek工具函数BPF 字符串拼接、端口转 BPF、IPv4/IPv6 采样过滤器生成netstats.zeek丢包统计周期性比对 NetStats 数据并发出Dropped_Packets通知load.zeek加载入口并在集群Cluster模式下额外加载./cluster脚本整个框架运行在PacketFilter命名空间下由zeek_init事件驱动完成首轮过滤器安装优先级-6的zeek_init在启动早期调用install()并启动一个每 5 分钟一次的filter_change_tracking()事件用于追踪是否有机制修改了过滤器状态见 main.zeek。二、过滤器优先级命令行 默认放行 脚本变量框架对过滤器来源的裁决顺序是理解整个框架的钥匙main.zeek 头部注释 与 index.rst 均有说明命令行过滤器优先如果在命令行上通过-e filter或-f指定了 BPF 过滤器脚本内部对应cmd_line_bpf_filter那么它无条件覆盖默认过滤器以及脚本中定义的所有过滤器。在build()函数中一旦发现cmd_line_bpf_filter ! 直接返回该字符串不再做任何组合见 main.zeek。默认放行全部流量没有命令行过滤器时默认采用default_capture_filter ip or not ip即抓取所有 IP 与非 IP 流量等价于“全部放行”。脚本变量叠加capture_filters表中的过滤器通过or与默认过滤器合并restrict_filters表中的过滤器通过and无条件收紧抓取范围。两个全局表的定义位于 scripts/base/init-bare.zeekglobal capture_filters: table[string] of string redef; global restrict_filters: table[string] of string redef;capture_filters名字到 BPF 表达式的映射各条目之间以or合并语义是“这些流量都抓”。restrict_filters同样为表各条目之间以and合并语义是“只在这些条件下抓”因此常被redef后用于精细收窄抓包范围。框架在zeek_init优先级 5中会预编译校验这两个表中的每一条过滤器一旦发现非法 BPF 表达式直接Reporter::fatal终止启动并给出包含表项名字的报错信息见 main.zeekfor ( id, cf in capture_filters ) { if ( ! test_filter(cf) ) Reporter::fatal(fmt(Invalid capture_filter named %s - %s, id, cf)); }三、核心可重定义选项Redefinable Options框架提供 5 个带redef属性的常量是运维中最常定制的部分全部定义在 main.zeek 与 main.zeek3.1PacketFilter::default_capture_filterstring默认ip or not ip默认抓包过滤器定义“默认情况下应抓取哪些流量”。注意即便你重定义此值restrict_filters中的过滤器依然会被and合并进来继续缩小抓取范围。若希望完全自定义抓包集合请同时配合修改capture_filters或restrict_filters。3.2PacketFilter::restricted_filterstring默认无条件与and到每一个动态构建过滤器开头的过滤器串。官方注释指出它主要用于“使用自定义过滤器但流量上带有 MPLS 或 VLAN 标签”的场景——例如流量带 VLAN 标签时标准 BPF 无法直接匹配高层协议需要先用restricted_filter剥离或放宽链路层条件。3.3PacketFilter::unrestricted_filterstring默认无条件或or到每一个动态构建过滤器开头的过滤器串。与restricted_filter相对用于无条件保证某类流量必定进入抓包范围例如必须抓到的管理面流量。3.4PacketFilter::max_filter_compile_timeinterval默认100msec允许 BPF 过滤器编译的最大时长。一旦单次编译超过该阈值框架会认为过滤器“过大”后续可能采取补偿措施缩减过滤器规模例如在集群等场景下拆解过滤器同时触发PacketFilter::Too_Long_To_Compile_Filter通知。该超时检查实现在install()中用编译前后的时间差current_time()-ts与阈值比较见 main.zeek。3.5PacketFilter::enable_auto_protocol_capture_filtersbool默认F开启旧的过滤方式“只为被分析协议监视常见端口”。默认关闭官方注释明确警告“除非你清楚自己在做什么否则保持 F”见 main.zeek。开启后build()会额外执行cfilter combine_filters(cfilter, or, Analyzer::get_bpf())把分析器框架推导出的协议端口 BPF 表达式并入抓包过滤器见 main.zeek。配置示例local.zeek 中覆盖默认值redef PacketFilter::default_capture_filter tcp or udp; redef PacketFilter::max_filter_compile_time 250msec; redef PacketFilter::restricted_filter vlan;四、状态变量与日志结构4.1PacketFilter::current_filterstring默认not set yet存放当前生效的默认抓包过滤器由框架内部维护用户不应直接修改main.zeek。install()在成功预编译后会将其更新为最新构建出的过滤器串并在过滤器未发生变化时tmp_filter current_filter直接跳过安装避免无谓开销见 main.zeek。4.2PacketFilter::Info记录与 packet_filter 日志流框架通过redef enum Log::ID { LOG }注册了PacketFilter::LOG日志流路径为packet_filter列定义在Info记录中main.zeek字段类型属性含义tstimelog尝试安装过滤器的时刻nodestringlog optional应用该过滤器的节点字符串表示在集群动态变更过滤器时尤其有用filterstringlog正在设置的过滤器串initboollog defaultF optional是否为初始化期间设置的过滤器successboollog defaultT optional过滤器是否成功应用failure_reasonstringlog optional创建/安装失败的原因字符串每次install()都会写入一条审计日志ts取network_time()若为 0初始化阶段则改用墙钟时间并置initTnode取peer_description见 main.zeek。写日志前会判断reading_live_traffic() || reading_traces()因此脱机处理 trace 时也会记录main.zeek。此外该流挂载了默认日志策略钩子PacketFilter::log_policy类型Log::PolicyHook供用户通过redef或 hook 附加过滤/改写逻辑。五、通知类型Notice::Type框架向Notice::Type枚举追加了 3 个与过滤器错误相关的通知main.zeek通知触发条件PacketFilter::Compile_Failure过滤器无法编译Pcap::precompile_pcap_filter返回失败且状态为fatalPacketFilter::Install_Failure过滤器通过编译但安装到抓包源失败Pcap::install_pcap_filter失败PacketFilter::Too_Long_To_Compile_Filter过滤器编译耗时超过max_filter_compile_time在install()中编译失败时会区分两种网络状态处理若network_time() 0.0尚未开始处理流量即初始化期调用Reporter::fatal直接终止否则仅Reporter::warning警告见 main.zeek。安装失败则置info$success F、记录failure_reason并发出Install_Failure通知见 main.zeek。此外框架还redef enum PcapFilterID追加了两个标识PacketFilter::DefaultPcapFilter默认过滤器编译/安装槽位与PacketFilter::FilterTester预编译测试槽位用于区分“正式安装”与“仅校验”两条编译通道。六、动态过滤器 API运行期抓包控制框架在运行期提供 4 个公开函数核心思想是维护一张dynamic_restrict_filters: table[string] of string动态限制表main.zeek表中每一条都以not ( ... )形式and进最终过滤器见 main.zeek。6.1PacketFilter::exclude(filter_id: string, filter: string): bool安装一个排除过滤器。参数中的 filter 应正向匹配要排除的流量框架会自动将其包装成not条件。返回布尔值表示是否安装成功。实现会先用test_filter预编译校验通过后才写入动态表并调用install()main.zeek。典型场景事件处理中动态屏蔽某个主机的流量。6.2PacketFilter::exclude_for(filter_id: string, filter: string, span: interval): bool临时排除在span时长内排除匹配流量到期后自动移除。其实现是调用exclude()成功后再schedule span { remove_dynamic_filter(filter_id) }main.zeek。注意文档参数名为lengthspan语义为过滤器保持的时长。6.3PacketFilter::remove_exclude(filter_id: string): bool按名字移除之前添加的排除过滤片段移除后原先被过滤的流量将重新允许通过。若存在该名字的片段则删除并触发install()返回T否则返回Fmain.zeek。框架同时注册了同名事件remove_dynamic_filtermain.zeek供定时器调用。6.4PacketFilter::install(): bool构建并安装一个新的动态抓包过滤器是整个框架的“提交动作”。执行流程main.zeek若正处于currently_building状态则直接返回F防止重入调用build()生成过滤器串若与current_filter相同则跳过无变化不重装用Pcap::precompile_pcap_filter(DefaultPcapFilter, ...)预编译失败/警告按第五节处理超时检测max_filter_compile_time更新current_filter写packet_filter审计日志调用Pcap::install_pcap_filter(DefaultPcapFilter)真正安装到抓包源失败则发Install_Failure复位filter_changed标志。底层能力由 src/iosource/pcap/pcap.bif 提供的Pcap::precompile_pcap_filter/Pcap::install_pcap_filter内建函数支撑由 C 侧PcapSource实现并通过 src/script_opt/FuncInfo.cc 标记为无脚本副作用以利于编译优化。七、插件机制注册自定义过滤生成器框架通过PacketFilter::FilterPlugin记录类型提供扩展点main.zeektype FilterPlugin: record { func : function(); # 生成完整过滤器时被直接调用的函数 };使用PacketFilter::register_filter_plugin(fp: FilterPlugin)注册后插件函数会在每次build()时被逐一调用plugin$func()见 main.zeek插件内部通常通过向capture_filters/restrict_filters或动态表写入内容来影响最终过滤器。这为第三方脚本“在每次构建过滤器时注入规则”提供了干净的 API。八、工具函数utils.zeek8.1PacketFilter::combine_filters(lfilter: string, op: string, rfilter: string): string用字符串运算符组合两条合法 BPF 过滤器utils.zeek。任一过滤器为空串时仍返回合法结果——这是全框架组合的基础设施两者皆空 → 返回空串左空 → 返回右右空 → 返回左否则 →(lfilter) op (rfilter)。op典型取or/and。正是它保证了capture_filters条目逐个or拼接、restrict_filters逐个and拼接以及unrestricted_filter/restricted_filter的收尾合并见 main.zeek。8.2PacketFilter::port_to_bpf(p: port): string将 Zeek 的port值转换为匹配该端口的 BPF 表达式utils.zeekfunction port_to_bpf(p: port): string { local tp get_port_transport_proto(p); return cat(tp, and , fmt(port %d, p)); }例如端口80/tcp会生成tcp and port 80。注意它不带not、也不带协议之外的其他条件因此结果可直接用于or组合或作为排除条件的主体。8.3PacketFilter::sampling_filter(num_parts: count, this_part: count): string生成对 IPv4 与 IPv6 流量进行采样分流的 BPF 过滤器utils.zeeknum_parts把流量分成几份this_part本过滤器接受第几份从 0 开始。它通过 IP 头中标识字段IPv4 的ip[14:2]ip[18:2]IPv6 的ip6[22:2]ip6[38:2]做模运算取余把流量按“num_parts 取模等于 this_part”均匀切分返回(v4_filter) or (v6_filter)的组合。源码注释也坦承这是“相当次优的过滤器但暂时够用”。典型用途在集群多节点上把流量按比例分片给不同节点处理。九、丢包统计netstats.zeeknetstats.zeek 负责报告各抓包源的丢包情况并通过Notice::Type { Dropped_Packets }追加通知类型。工作机制常量PacketFilter::stats_collection_interval 5min控制统计周期zeek_init时若不是在读取 trace! reading_traces()则调度首次net_stats_update因此从 trace 文件离线分析时不会产生丢包统计与 index.rst 描述一致net_stats_update(last_stat: NetStats)用当前get_net_stats()与上次快照做差pkts_dropped增量大于 0 时发出通知NOTICE(Notice::Info($noteDropped_Packets, $msgfmt(%d packets dropped after filtering, %d received%s, new_dropped, new_recvd new_dropped, new_link ! 0 ? fmt(, %d on link, new_link) : )));见 netstats.zeek。该脚本仅依赖base/frameworks/notice可独立加载。十、集群场景与加载方式__load__.zeek在加载三个子脚本后会检测集群框架若Cluster::is_enabled()为真则额外加载./cluster见load.zeek用于在集群节点间同步/协调动态过滤器变更。Info记录中的node字段正是为此设计它记录每个过滤器由哪个节点应用便于在多节点动态变更过滤器时审计定位。实际使用中只要加载了base/frameworks/packet-filter默认 Zeek 脚本加载链会包含以上能力即可用覆盖默认值只需在策略脚本如local.zeek中redef相应常量运行期排除流量则调用PacketFilter::exclude/exclude_for等函数。过滤器安装过程与结果均可在packet_filter日志流中审计编译/安装失败则由 Notice 框架上报供上层告警联动。赞分享网络安全网络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 Pcap 模块内置函数详解动态管理 PCAP/BPF 抓包过滤器Zeek Pcap 模块内置函数详解动态管理 PCAP/BPF 抓包过滤器 导读 本文以 Zeek 仓库中 doc/scripts/base/bif/pcap网络安全网络IDS如何快速掌握Wireshark抓包过滤器BPF语法完全指南如何快速掌握Wireshark抓包过滤器BPF语法完全指南 Wireshark是一款功能强大的网络协议分析工具而BPFBerkeley Packet Fi网络通信VidBee便携版解压即用免安装下载视频VidBee便携版解压即用免安装下载视频 在不能装软件的电脑上下载视频 公司的电脑不让装东西你只想快速保存一个B站或YouTube上的视频。别急着找安装器桌面应用音视频AI 应用语音上一篇YouTube.js 核心入口 Innertube 类完全指南从会话创建到视频下载的 API 全景解析下一篇DataHub Great Expectations 插件实战把 GX 数据质量断言结果接入 DataHub创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表