Zeek Control 框架实战:远程运行时控制的事件协议、配置项与命令行操作全解析

📅 发布时间:2026/10/7 2:12:28
Zeek Control 框架实战:远程运行时控制的事件协议、配置项与命令行操作全解析
网络安全网络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 的 Control 框架base/frameworks/control为远程命令提供基础设施你可以通过 Broker 消息总线在运行时向一个正在运行的 Zeek 实例下发命令修改其行为或收集运行状态信息。本文以 doc/scripts/base/frameworks/control/main.zeek.rst 为主线结合 scripts/policy/frameworks/control/controller.zeek 与 scripts/policy/frameworks/control/controllee.zeek 的源码实现及testing/btest中的测试用例完整梳理框架入口、全部可配置项、事件接口、双角色协作流程与五种内置命令的实际用法读完即可独立搭建控制端→被控端的远程管控方案。框架定位与加载入口Control 框架的官方定位是The control framework provides the foundation for providing commands that can be taken remotely at runtime to modify a running Zeek instance or collect information from the running instance.提供可在运行时远程作用于 Zeek 实例、以修改实例行为或收集信息的命令基础。这一描述同时出现在框架 READMEscripts/base/frameworks/control/README与文档 doc/scripts/base/frameworks/control/index.rst 中。框架被组织为一个包package包入口文件为 scripts/base/frameworks/control/load.zeek其全部内容只有一行load ./main即入口只负责加载真正的核心定义文件 scripts/base/frameworks/control/main.zeek。main.zeek 声明了Control命名空间包含全部可重定义选项redef、常量与请求/响应事件。这正是__load__.zeek.rst文档中:Imports: base/frameworks/control/main.zeek所指向的依赖关系。在默认加载链上base 层的control包由 scripts/base/init-default.zeek第 37 行load base/frameworks/control自动加载同时在集群模式下scripts/base/frameworks/cluster/main.zeek第 18 行也会加载它。也就是说凡默认启动的 Zeek其脚本层已经具备了 Control 的事件与配置定义但真正可被远程控制还需要额外加载 policy 层的controller/controllee脚本见下文双角色架构。核心配置Redefinable Options 与常量main.zeek 中定义了 7 个可重定义选项和 2 个常量全部可在命令行或脚本中以redef覆盖。下表汇总了 doc/scripts/base/frameworks/control/main.zeek.rst 中记录的类型与默认值名称类型属性默认值用途Control::controllee_listenboolredefT被控端是否自行调用Broker::listen()集群模式下无需因为 setup 流程已调用Control::hostaddrredef0.0.0.0被控主机地址由控制端指定Control::host_portportredef0/tcp被控主机端口由控制端指定Control::zone_idstringredef当host为非全局 IPv6 地址、需要指定 RFC 4007zone_id时在此设置Control::cmdstringredef当前要执行的命令通常在命令行上设置Control::argstringredef供需要参数的命令使用Control::commandsset[string]redef见下当前可通过命令行下发到远程实例的命令集合Control::topic_prefixstring常量zeek/control通过 Broker 交换控制消息所用的主题前缀Control::ignore_idsset[string]常量{}配置更新过程中需要忽略的变量 ID 集合其中Control::commands的默认集合为const commands: set[string] { id_value, peer_status, net_stats, configuration_update, shutdown, } redef;从源码结构看scripts/base/frameworks/control/main.zeekcommands是控制端的白名单校验依据控制端脚本在zeek_init中检查cmd in commands若命令不在集合内会直接报错并终止见 scripts/policy/frameworks/control/controller.zeek。Control::ignore_ids则服务于configuration_update命令控制端收集所有可重定义的常量并同步给被控端时会跳过该集合中列出的 ID详见下文配置更新小节。事件协议请求/响应成对的消息接口框架的全部远程交互都建模为成对的 Broker 事件控制端发布*_request被控端处理并回发*_response。main.zeek 共声明 10 个事件请求事件响应事件载荷Control::id_value_request(id: string)Control::id_value_response(id: string, val: string)请求某个变量 ID 的当前值响应返回其字符串形式Control::peer_status_request()Control::peer_status_response(s: string)请求当前通信peer状态响应返回状态描述字符串Control::net_stats_request()Control::net_stats_response(s: string)请求当前网络统计响应返回统计字符串Control::configuration_update_request()Control::configuration_update_response()通知远端其配置可能已更新Control::shutdown_request()Control::shutdown_response()请求实例开始关闭此外还有一个特殊事件Control::configuration_update它是configuration_update_request的别名/包装事件被文档明确标注为控制框架的主要挂接点primary hooking point见 doc/scripts/base/frameworks/control/main.zeek.rst。其他脚本可以挂接它来做redef常量在运行时被修改后的附属处理。事件的具体语义均记录在 scripts/base/frameworks/control/main.zeek 的注释中而请求与响应两侧的实现分别位于 controllee 与 controller 脚本内。双角色架构controller 与 controlleeControl 框架在 policy 层拆分为两个脚本形成控制端controller/被控端controllee的双角色模型分别有独立文档doc/scripts/policy/frameworks/control/controller.zeek.rst 与 doc/scripts/policy/frameworks/control/controllee.zeek.rst。控制端 controllerscripts/policy/frameworks/control/controller.zeek 是一个临时工具脚本它被运行起来向远端发送一条命令收到响应后立即退出。源码注释给出的标准命令行用法为zeek scripts frameworks/control/controller Control::hosthost_addr Control::host_porthost_port Control::cmdcommand [Control::argarg]其核心执行流程从源码结构可以完整还原校验命令zeek_init() priority5中检查cmd in commands未知命令触发Reporter::error并terminate()随后Broker::subscribe(Control::topic_prefix)订阅控制主题并Broker::peer(cat(host), host_port)发起对目标实例的 Broker 对等连接controller.zeek。连接建立后下发Broker::peer_added事件priority-10中按cmd分发调用send_control_request(topic)通过Broker::publish发出对应的*_request事件对于configuration_update还会先同步可重定义常量见下文。收到响应即退出五个*_response事件处理器均priority-10在收到响应后触发terminate_event()结束进程controller.zeek。发送请求的分发逻辑在send_control_request()函数中controller.zeek其中id_value命令强制要求Control::arg非空否则Reporter::fatal。被控端 controlleescripts/policy/frameworks/control/controllee.zeek 是需要被远程控制的 Zeek 实例加载的脚本用法zeek scripts frameworks/control/controllee它只需要在分析脚本之外额外加载 controllee 脚本并在单机非集群场景下在通信节点配置中让本机作为被控制节点即可。其初始化逻辑zeek_init() priority-10仅在Cluster::backend Cluster::CLUSTER_BACKEND_BROKER时生效订阅主题Control::topic_prefix / Broker::node_id()并在Control::controllee_listen为真时调用Broker::listen()controllee.zeek。这也解释了选项controllee_listen的语义集群中由 setup 流程统一调用listen单机手动被控场景下才需要框架自己监听。各请求事件的被控端实现要点id_value_requestlookup_ID(id)查表取变量值fmt(%s, val)序列化为字符串发布到主题topic_prefix /id_value_response/ Cluster::nodepeer_status_request遍历Broker::peers()逐条输出network_time() peerid hostaddress statusstatus格式的状态行net_stats_request调用get_net_stats()输出recvd/dropped/link三个包计数configuration_update_request先触发别名事件Control::configuration_update()再回发configuration_update_responseshutdown_request先回发shutdown_response再schedule 1sec { terminate_event() }——延迟 1 秒执行是为了让当前事件队列先排空再优雅关闭controllee.zeek。Broker 主题结构结合两端实现可归纳出主题约定控制端订阅zeek/control前缀本身向zeek/control/peer_id下发请求被控端将各响应发布到zeek/control/response_type/Cluster::node。topic_prefix的默认值zeek/control保证了同一 Broker 网络中不同用途的消息互不干扰。命令行实战五种内置远程控制命令将上述角色组合起来即可用一条命令行完成对运行中实例的远程操作。五种命令的完整参数与行为如下命令必需参数控制端动作被控端行为id_valueControl::arg变量ID发布id_value_request(arg)返回该变量的当前值lookup_IDpeer_status无发布peer_status_request返回 Broker peer 列表及状态net_stats无发布net_stats_request返回收包/丢包/链路统计configuration_update无同步可重定义常量 发布configuration_update_request触发configuration_update别名事件并回执shutdown无发布shutdown_request回执后延迟 1 秒终止进程以查询变量为例典型的两端组合如下控制端zeek frameworks/control/controller \ Control::host127.0.0.1 \ Control::host_port47760/tcp \ Control::cmdid_value \ Control::argtest_var配置更新configuration_update的底层机制这是五种命令中机制最复杂的一个需要额外条件必须启用 Broker 的标识符identifier更新功能。控制端在Broker::peer_added中检查Broker::enable_identifier_updates未启用时直接Reporter::fatal(Identifier updates are disabled.)controller.zeek。启用后控制端调用configurable_ids()controller.zeek遍历global_ids()过滤条件为不在Control::ignore_ids中是常量t$constant可重定义t$redefinable不是函数t$type_name ! func——源码注释说明函数目前尚未完整支持序列化故不发送。随后对每个符合条件的 ID 调用Broker::publish_id(topic, id)将变量值推送给对端并统计发送数量写入日志Reporter::info(Control framework sent %d IDs, ...)。被控端侧则通过configuration_update_request→configuration_update事件挂接点让其他脚本有机会做附加处理。测试验证btest 中的 Control 用例仓库的testing/btest/scripts/base/frameworks/control/目录下有三个针对性测试可作为本文所述用法的可运行佐证id_value.zeek后台同时启动controllee与controller两个 Zeek 进程通过btest-bg-run控制端以Control::cmdid_value Control::argtest_var查询一个redef常量test_var被控端通过单独文件only-for-controllee.zeek重定义其值控制端打印收到的id_value_response验证远程取值链路。configuration_update.zeek先redef Broker::enable_identifier_updates T;开启标识符更新控制端加载test-redef.zeek其中重定义了test_var对运行中的被控端执行Control::cmdconfiguration_update随后被控端在zeek_done中打印更新后的test_var验证常量已通过 Broker 同步生效。shutdown.zeek控制端对运行中的被控端执行Control::cmdshutdown验证远程关闭流程。这三个测试覆盖了查询取值 / 配置同步 / 远程关闭三大核心场景与上文描述的send_control_request分发、configurable_ids()筛选及schedule 1sec延迟关闭逻辑一一对应。小结Zeek Control 框架是一个轻量而完整的远程管控方案base/frameworks/control定义了协议成对事件、配置选项与常量与命令白名单policy 层的controller/controllee分别实现下发与响应Broker 消息总线负责传输。若需要扩展自定义命令可沿此脉络在Control::commands中追加命令名、在 main.zeek 中补充对应请求/响应事件、并在 controllee 中实现处理逻辑。集群部署时框架由集群主脚本自动加载并复用集群的 Broker 连接单机部署时则按controllee_listen自行监听两种模式皆可开箱即用。赞分享网络安全网络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点击查看免费下载相关推荐一招搞定喜马拉雅VIP专辑3步实现批量下载与本地化保存的完整实战一招搞定喜马拉雅VIP专辑3步实现批量下载与本地化保存的完整实战 通勤路上想补一档付费专栏出差途中想重听有声小说可翻遍App都找不到下载到本地的按钮—网络安全网络IDSZeek 控制框架Control Framework详解基于 Broker 的远程运行时控制与信息采集Zeek 控制框架Control Framework详解基于 Broker 的远程运行时控制与信息采集 Control framework 是 Zeek网络安全网络IDSKornia PinholeCamera.scale 别名修复深度解析scaled.tx 不再污染源相机Kornia PinholeCamera.scale 别名修复深度解析scaled.tx 不再污染源相机 本篇技术指南围绕 Kornia 迁移日志 chang后端数据库负载均衡上一篇NVIDIA发布OpenReasoning-Nemotron-32B重新定义大模型推理能力的多智能体协作范式下一篇钉钉防撤回神器DingTalkRevokeMsgPatcher让重要消息无处遁形创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考