ARTICLE DETAIL

资讯详情

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

Zeek NetControl 流分流(Shunt)功能详解:shunt_flow 接口、netcontrol_shunt 日志与实战

Zeek NetControl 流分流(Shunt)功能详解:shunt_flow 接口、netcontrol_shunt 日志与实战 网络安全网络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 仓库中 doc/scripts/base/frameworks/netcontrol/shunt.zeek.rst 及 shunt.zeek 源码深入讲解 NetControl 框架的 shunt分流功能。shunt 用于告诉网络设备停止把某个单向流的报文继续转发给 Zeek从而让 Zeek 在识别出良性流量后节省分析资源。读完本文你将掌握NetControl::shunt_flow的完整签名与参数语义、NetControl::ShuntInfo日志记录结构、netcontrol_shunt日志流的字段含义并能写出可运行的 shunt 触发脚本理解其底层规则机制与测试验证方式。NetControl 框架中的 Shunt 定位Zeek 的 NetControl 框架见 doc/frameworks/netcontrol.rst是一个基于插件的流量控制框架它既能控制发往 Zeek 自身的监控路径也能在具备转发路径访问权限时控制网络设备的转发路径。默认情况下框架放行所有流量脚本可以添加规则对特定实体施加限制。Shunt 正是框架在监控路径上的典型应用。框架类型定义types.zeek将规则目标分成两类NetControl::FORWARD把规则主动应用到网络转发路径上影响所有网络流量NetControl::MONITOR把规则被动应用到发往 Zeek 的监控流量上。shunt_flow创建的是targetMONITOR的规则含义即Zeek 告诉网络硬件它不想再看到已被判定为良性的流量。这与 drop 系列函数targetFORWARD阻断转发形成鲜明对照shunt 不改变网络中报文的去向只是让 Zeek 不再接收它们。官方框架文档对shunt_flow的定位是Calling this function causes NetControl to stop forwarding a uni-directional flow of packets to Zeek. This allows Zeek to conserve resources by shunting flows that have been identified as being benign.shunt_flow接口签名与参数语义shunt_flow在 shunt.zeek 中声明是 NetControl 高层 API 中专门面向单向流的一个入口global shunt_flow: function(f: flow_id, t: interval, location: string default) : string;参数类型说明fflow_id要被 shunt 的单向流包含源/目的 IP 与端口tintervalshunt 保留的时间0表示无限期保留locationstring可选默认描述 shunt 触发位置的字符串返回值成功时返回插入规则的 ID 字符串失败时返回空字符串。注意返回值语义与add_rule保持一致所谓成功指有插件接受了这条规则并不保证硬件层面已真正生效因为硬件下发是异步的见 main.zeek。参数细节flow_id 与单向流flow_id是 Zeek 内建类型由src_h/src_p与dst_h/dst_p外加可选的 MAC 字段构成。shunt 针对的是单向流因此调用方应传入对应方向如 orig 方向或 resp 方向的四元组。expire 语义t即规则过期时间。传入0sec表示不过期规则会一直保留直到被显式remove_rule传入具体时长则到期后规则超时NetControl 会通过rule_timeout事件通知插件进行清理参见 main.zeek。location 的审计价值该字段会被写入日志用于追溯是哪段脚本/哪个策略触发了这次 shunt在多脚本协同的部署中尤其重要。源码实现shunt_flow 内部发生了什么shunt_flow的实现位于 shunt.zeek核心流程分为三步构造 Flow 实体 → 构造 DROP/MONITOR 规则 → 调用add_rule并写日志。function shunt_flow(f: flow_id, t: interval, location: string default) : string { local flow NetControl::Flow( $src_hf$src_h as subnet, $src_pf$src_p, $dst_hf$dst_h as subnet, $dst_pf$dst_p ); local e Entity($tyFLOW, $flowflow); local r Rule($tyDROP, $targetMONITOR, $entitye, $expiret, $locationlocation); local id add_rule(r); # Error should already be logged if ( id ) return id; local log ShuntInfo($tsnetwork_time(), $rule_idid, $ff, $expiret); if ( location ! ) log$locationlocation; Log::write(SHUNT, log); return id; }关键实现细节地址升格为子网f$src_h as subnet与f$dst_h as subnet把 IP 地址转成/32或/128子网。这是因为 NetControl 的Flow类型types.zeek中src_h/dst_h声明为subnet未设置的字段会被解释为通配符。也就是说你可以手动构造带有通配符的NetControl::Flow来实现对整段网段的 shunt。实体类型Entity($tyFLOW, ...)对应EntityType枚举中的FLOW——涉及单向流活动的实体types.zeek。规则类型Rule($tyDROP, $targetMONITOR, ...)。DROP规则类型表示停止转发匹配实体的所有报文types.zeek配合MONITOR目标即实现不再把该流送给 Zeek的语义。失败即短路add_rule返回空串表示没有插件接受规则错误已由框架写入 netcontrol 日志此时直接返回不再写 shunt 日志。日志只记成功只有规则被接受后才构造ShuntInfo并调用Log::write(SHUNT, log)保证netcontrol_shunt.log中的每行都对应一次成功的 shunt。规则生命周期与优先级规则加入框架后由 main.zeek 全生命周期跟踪rule_new在add_rule时触发rule_added/rule_exists/rule_timeout/rule_error/rule_removed分别汇报各阶段状态rule_destroyed表示规则彻底退出跟踪。多条规则同时命中同一实体时按priority排序取第一条priority越大优先级越高默认值由NetControl::default_priority决定见 types.zeek。若希望 shunt 规则能压过已有的低优先级 drop 规则可以手动构造更高优先级的规则高层shunt_flow本身使用默认优先级。netcontrol_shunt 日志ShuntInfo 记录结构每次成功的 shunt 都会写入netcontrol_shunt日志流。日志列由ShuntInforecord 定义shunt.zeek各字段均带log属性字段类型说明tstime记录活动发生的时间rule_idstring规则 ID在一次 Zeek 运行内唯一fflow_id被 shunt 的流的 ID四元组expireintervalshunt 的过期时长locationstring可选触发底层动作的位置描述日志流在zeek_init优先级 5中注册shunt.zeekevent zeek_init() priority5 { Log::create_stream(NetControl::SHUNT, Log::Stream($columnsShuntInfo, $evlog_netcontrol_shunt, $pathnetcontrol_shunt, $policylog_policy_shunt)); }$pathnetcontrol_shunt决定日志文件名即netcontrol_shunt.log。$evlog_netcontrol_shunt绑定事件任何脚本都可以订阅它来在记录落地前访问ShuntInforecord。$policylog_policy_shunt绑定策略钩子NetControl::log_policy_shuntLog::PolicyHook可在写日志前增删改字段或过滤记录。可订阅的事件与钩子event NetControl::log_netcontrol_shunt(rec: NetControl::ShuntInfo)日志写往框架前触发用于统一加工或转发 shunt 记录。hook NetControl::log_policy_shunt(rec: Log::PolicyHook, rec: any)类型为Log::PolicyHook标准的日志策略钩子可用break阻止该条记录落盘或直接改写rec字段。下面的示例演示如何利用策略钩子为 shunt 日志附加过滤例如只保留 location 非空的记录hook NetControl::log_policy_shunt(rec: NetControl::ShuntInfo) { if ( ! rec?$location ) break; # 丢弃没有 location 信息的 shunt 记录 }实战在脚本中触发一条 shunt要实际触发 shunt至少需要一个已激活的 NetControl 后端插件。最简单的后端是 debug 插件plugins/debug.zeek它把所有动作打印到标准输出。下面是一个完整可运行的示例参照官方集成测试 testing/btest/scripts/base/frameworks/netcontrol/basic.zeek 的结构编写load base/frameworks/netcontrol event NetControl::init() { local netcontrol_debug NetControl::create_debug(T); NetControl::activate(netcontrol_debug, 0); } event NetControl::init_done() priority-5 { # 把 192.168.17.1:32/tcp - 192.168.17.2:32/tcp 的单向流 shunt 30 秒 NetControl::shunt_flow( [$src_h192.168.17.1, $src_p32/tcp, $dst_h192.168.17.2, $dst_p32/tcp], 30sec, example-script ); }运行zeek basic.zeek后debug 插件会打印规则内容同时生成netcontrol_shunt.log。官方测试的基线文件 testing/btest/Baseline/scripts.base.frameworks.netcontrol.basic/netcontrol_shunt.log 展示了真实输出结构#fields ts rule_id f.src_h f.src_p f.dst_h f.dst_p expire location #types time string addr port addr port interval string XXXXXXXXXX.XXXXXX 2 192.168.17.1 32 192.168.17.2 32 30.000000 -可见f字段被展开为f.src_h/f.src_p/f.dst_h/f.dst_p四列本例未传location因此取值为-unset。测试验证shunt 功能如何被自动化检验Zeek 仓库用 btest 对 shunt 功能做了端到端验证。测试 testing/btest/scripts/base/frameworks/netcontrol/basic.zeek 在NetControl::init_done中依次调用shunt_flow、drop_address、whitelist_address、redirect_flow、quarantine_host等高层函数并对比netcontrol.log、netcontrol_shunt.log、netcontrol_drop.log与标准输出。其测试头注释# TEST-EXEC: zeek -b %INPUT # TEST-EXEC: btest-diff netcontrol.log # TEST-EXEC: btest-diff netcontrol_shunt.log测试先通过NetControl::create_debug(T)激活 debug 后端T表示接受所有操作再调用shunt_flow([$src_h192.168.17.1, $src_p32/tcp, $dst_h192.168.17.2, $dst_p32/tcp], 30sec)基线文件确认netcontrol_shunt.log中只有一行成功记录且rule_id为2与同一脚本中其他规则按插入顺序递增的 ID 对应。这组测试同时验证了shunt 只影响被指定流、规则被 debug 后端接受、日志字段尤其是f的四元组展开序列化正确。使用注意事项与边界必须有活动后端add_rule只有在至少一个插件接受规则时才返回非空 ID。若NetControl::init中未激活任何后端shunt_flow会静默返回错误信息写入 netcontrol 日志netcontrol_shunt.log中不会有对应记录。成功≠已生效与框架整体语义一致返回值只代表有插件接管了规则硬件层面的实际下发是异步的如需精确状态应订阅rule_added/rule_error等事件main.zeek。单向流语义flow_id是单向的若要屏蔽双向流量需要分别对两个方向调用shunt_flow或改用面向连接的drop_connection。资源回收t传0表示永久 shunt需要后续显式调用NetControl::remove_rule(id)才能撤销注意避免规则表无限增长固定时长则到期自动清理。location 是可选的审计线索在大型策略集中建议始终传入便于从日志反查触发点。延伸阅读框架整体架构与高层 API 总览doc/frameworks/netcontrol.rst其中shunt_flow被列为与drop_address、redirect_flow、quarantine_host并列的高层函数同系列实现对比drop.zeekDROP/FORWARD语义、main.zeek规则生命周期与add_rule低层 API核心类型定义types.zeekFlow、Entity、Rule、TargetType、RuleType后端插件示例plugins/debug.zeek官方集成测试testing/btest/scripts/base/frameworks/netcontrol/basic.zeek 及其 netcontrol_shunt.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点击查看免费下载相关推荐Zeek NetControl DROP 功能实现解析drop_address / drop_connection 的规则构建、netcontrol_drop 日志与策略钩子Zeek NetControl DROP 功能实现解析drop_address / drop_connection 的规则构建、netcontrol_drop网络安全网络IDSZeek NetControl 框架深入解析从 __load__.zeek 入口理解规则驱动的网络流量控制体系Zeek NetControl 框架深入解析从 __load__.zeek 入口理解规则驱动的网络流量控制体系 NetControl 是 Zeek 内置的插件网络安全网络IDSZeek dns.log 深度解析DNS 日志字段、查询流程与实战分析方法Zeek dns.log 深度解析DNS 日志字段、查询流程与实战分析方法 导读 dns.log 是 Zeek 生成的最重要数据源之一它记录了网络内每一笔应网络安全网络IDS上一篇Kritis源码解析Admission Controller如何实现部署时策略检查下一篇如何免费快速搭建个人专属的微信公众号RSS阅读器WeWe RSS终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表