Suricata DHCP 时间类检测关键字(dhcp.leasetime / dhcp.rebinding_time / dhcp.renewal_time)使用与原理详解
网络安全【免费下载链接】suricataSuricata is a network Intrusion Detection System, Intrusion Prevention System and Network Security Monitoring engine developed by the OISF and the Suricata community.项目地址https://gitcode.com/gh_mirrors/su/suricata点击查看免费下载DHCPDynamic Host Configuration Protocol租约协商过程中携带的时间信息租约时长、续约时间 T1、重绑定时间 T2是识别异常客户端行为、检测恶意 DHCP 配置的重要手段。本文以 Suricata 官方规则文档 dhcp-keywords.rst 为核心系统讲解dhcp.leasetime、dhcp.rebinding_time、dhcp.renewal_time三个检测关键字的语法、比较操作符与完整规则示例并结合仓库中 Rust 实现的解析器与检测引擎源码深入剖析这三个关键字从 DHCP 报文选项到规则匹配的底层调用链。读完本文你将能够直接编写出可投入实战的 DHCP 时间类 Suricata 检测规则。一、三个关键字速览Suricata 的 DHCP 应用层解析器位于 rust/src/dhcp/从 DHCP 报文中提取三类时间选项并对应注册了三个检测关键字关键字匹配内容对应 DHCP 选项dhcp.leasetimeDHCP 租约时间lease timeOption 51IP Address Lease Timedhcp.rebinding_timeDHCP 重绑定时间rebinding timeT2Option 59Rebinding (T2) Time Valuedhcp.renewal_timeDHCP 续约时间renewal timeT1Option 58Renewal (T1) Time Value三者均为整数型关键字使用无符号 64 位整数unsigned 64-bit integer作为匹配类型。单位均为秒与 DHCP 选项在报文中的原始编码4 字节大端序秒数保持一致。在 RFC 标准中这三个时间存在严格的递进关系renewal_time (T1) rebinding_time (T2) lease_time典型默认值为租约的 50% 与 87.5%。规则引擎本身不校验该大小关系但撰写检测规则时可以利用这一行业常识设计可疑性判定逻辑。二、语法与比较操作符三个关键字的语法完全一致通用形式为dhcp.keyword:[op]number其中[op]为可选的比较操作符。时间值既可以精确匹配也可以通过操作符进行大小比较文档给出的合法用法包括dhcp.leasetime:3 # exactly 3 dhcp.leasetime:3 # smaller than 3 dhcp.leasetime:2 # greater or equal than 2即支持:精确等于、小于、大于等于等操作符。从实现层面看这三个关键字全部复用 Suricata 通用无符号 64 位整型关键字解析与匹配框架SCDetectU64Parse/SCDetectU64Match见 rust/src/dhcp/detect.rs因此与dsize、flowint等 uint64 关键字保持一致的比较语义和取值处理。三、dhcp.leasetime匹配 DHCP 租约时间dhcp.leasetime匹配 DHCP 报文中 Option 51IP Address Lease Time声明的租约时长即服务器允许客户端使用该 IP 地址的时长秒。官方文档给出的语法与示例dhcp.leasetime:[op]number dhcp.leasetime:3 # exactly 3 dhcp.leasetime:3 # smaller than 3 dhcp.leasetime:2 # greater or equal than 2完整的规则示例注意必须使用alert dhcp协议匹配关键字才会生效alert dhcp any any - any any (msg:small DHCP lease time (3); dhcp.leasetime:3; sid:1; rev:1;)典型应用场景租约时间过短往往意味着 DHCP 服务器配置异常或存在针对租约池的恶意耗竭行为租约时间异常长则可能用于长期固定 IP 地址、逃避 IP 变化检测。可配合sid、rev与msg等通用关键字组织告警信息。从源码看匹配逻辑位于 rust/src/dhcp/detect.rs检测引擎在应用层事务DHCPTransaction上遍历 DHCP 报文的所有选项定位DHCP_OPT_ADDRESS_TIME即 Option 51常量定义见 rust/src/dhcp/dhcp.rs后将解析出的秒数值与规则中声明的整型条件做比较命中则返回 1否则返回 0。选项缺失时如 DHCP Discover 报文通常不带 Option 51直接判定不匹配。四、dhcp.rebinding_time匹配重绑定时间dhcp.rebinding_time匹配 DHCP 报文中的 Option 59Rebinding (T2) Time Value。重绑定时间是客户端在无法完成 T1 续约后进入重绑定阶段向任意服务器广播请求的时间点典型值为租约的 87.5%。语法与示例dhcp.rebinding_time:[op]number dhcp.rebinding_time:3 # exactly 3 dhcp.rebinding_time:3 # smaller than 3 dhcp.rebinding_time:2 # greater or equal than 2完整规则示例alert dhcp any any - any any (msg:small DHCP rebinding time (3); dhcp.rebinding_time:3; sid:1; rev:1;)源码中的匹配实现见 rust/src/dhcp/detect.rs通过dhcp_tx_get_time(tx, DHCP_OPT_REBINDING_TIME)提取 Option 59常量定义见 rust/src/dhcp/dhcp.rs的秒数值后交给 uint64 匹配框架比较。与dhcp.leasetime一样仅当 DHCP 报文中实际携带该选项时才可能命中。五、dhcp.renewal_time匹配续约时间dhcp.renewal_time匹配 DHCP 报文中的 Option 58Renewal (T1) Time Value。续约时间是客户端向原 DHCP 服务器单播续约的时间点典型值为租约的 50%。语法与示例dhcp.renewal_time:[op]number dhcp.renewal_time:3 # exactly 3 dhcp.renewal_time:3 # smaller than 3 dhcp.renewal_time:2 # greater or equal than 2完整规则示例alert dhcp any any - any any (msg:small DHCP renewal time (3); dhcp.renewal_time:3; sid:1; rev:1;)匹配实现见 rust/src/dhcp/detect.rs提取DHCP_OPT_RENEWAL_TIMEOption 58常量定义见 rust/src/dhcp/dhcp.rs后参与比较。六、源码级原理从报文选项到规则命中6.1 选项解析严格校验 4 字节长度三个时间值的原始编码均为 DHCP 选项的标准 TLV 格式code len valuevalue 为 4 字节大端序秒数。解析函数parse_address_time_option见 rust/src/dhcp/parser.rs专门处理这三个选项读取 code 与 len 字段若 len 不等于 4则判定该选项为 malformed格式畸形回落为通用选项解析并打上畸形标记长度合法时按大端序读取 u32 秒数包装为DHCPOptionWrapper::TimeValue。解析器主流程parse_option见 rust/src/dhcp/parser.rs将DHCP_OPT_ADDRESS_TIME、DHCP_OPT_RENEWAL_TIME、DHCP_OPT_REBINDING_TIME三个 code 统一路由到该函数其余选项走parse_generic_option。这也解释了为什么关键字虽声明为 64 位整型实际报文取值却来自 32 位字段底层统一复用 uint64 比较框架规则侧无需区分。6.2 关键字注册与事务匹配三个关键字的注册集中在SCDetectDHCPRegister见 rust/src/dhcp/detect.rs每个关键字都完成三件事通过SCDetectHelperKeywordRegister注册关键字名如dhcp.leasetime、描述与文档 URL通过SCDetectHelperBufferProgressRegister注册缓冲区且同时覆盖客户端到服务器STREAM_TOSERVER与服务器到客户端STREAM_TOCLIENT两个方向——这意味着 DHCP 请求与应答报文中的时间选项都能被匹配挂接Setup、AppLayerTxMatch、Free三个回调Setup 阶段调用SCDetectSignatureSetAppProto将规则绑定到 DHCP 应用层协议ALPROTO_DHCP并解析整型条件TxMatch 阶段在事务级执行比较Free 阶段释放解析上下文。匹配辅助函数dhcp_tx_get_time见 rust/src/dhcp/detect.rs遍历事务内消息的选项列表按 code 定位对应选项并取回秒数值若报文中不存在该选项则返回None匹配函数直接返回不命中。从该结构可以推断一条规则即使同时声明多个时间关键字各关键字也会独立作用于同一 DHCP 事务缺任一选项的报文只会对缺失项不命中不会导致整条规则失效。6.3 单元测试佐证解析器的单元测试位于 rust/src/dhcp/parser.rs并随仓库携带真实抓包样本discover.pcap、offer.pcap、request.pcap、ack.pcap。例如test_parse_discover从 discover.pcap 中截取 DHCP 负载并断言头部字段与选项序列DHCP_OPT_TYPE、DHCP_OPT_CLIENT_ID、DHCP_OPT_REQUESTED_IP、DHCP_OPT_PARAMETER_LIST、DHCP_OPT_END的解析结果test_parse_sname_overload等用例则验证了选项区扩展到 sname/file 字段overload时的解析正确性与畸形容错。这些测试为关键字依赖的选项解析层提供了可靠的正确性保障。七、与 EVE JSON 日志的呼应检测关键字与日志输出共用同一套解析结果DHCP 事务记录器 rust/src/dhcp/logger.rs 在输出 EVE JSON 时将DHCP_OPT_ADDRESS_TIME、DHCP_OPT_REBINDING_TIME、DHCP_OPT_RENEWAL_TIME分别映射为lease_time、rebinding_time、renewal_time字段注意日志中lease_time与rebinding_time仅在扩展日志模式extendedtrue下输出而renewal_time始终输出。EVE JSON 格式说明见 eve-json-format.rst给出的语义为lease_time服务器向客户端分配 IP 地址的时长renewal_time客户端自开始请求或续约流程起经过的秒数rebinding_time客户端开始续租前的秒数。这意味着在 output-json-dhcp.c 驱动的 EVE 日志中你可以先观察基线报文的lease_time/renewal_time/rebinding_time数值分布再据此编写精准的检测规则阈值实现日志标定 → 规则落地的闭环。八、实战规则建议8.1 组合三个时间关键字利用 T1 T2 租约时间的标准关系可在一条规则中同时限定三者识别时间配置异常如 T1 ≥ T2alert dhcp any any - any any (msg:DHCP renewal time not smaller than rebinding time; dhcp.renewal_time:1; dhcp.rebinding_time:1; dhcp.renewal_time:100; dhcp.rebinding_time:100; sid:1000001; rev:1;)注意Suricata 当前并不直接支持在规则内比较两个字段的大小需通过固定阈值组合间接表达上例仅演示多关键字叠加写法实际阈值应依据网络基线调整。8.2 联合 DHCP 报文类型关键字可结合 DHCP 消息类型过滤出应答类报文再评估时间例如仅对 DHCPOFFER/DHCPACK 中的租约时间进行判定alert dhcp any any - any any (msg:suspicious short DHCP lease offered; dhcp.leasetime:300; sid:1000002; rev:1;)8.3 匹配范围建议三个关键字均以秒为单位常见合法租约从数分钟到数天不等。对过短租约类规则建议阈值设在 3003600 秒区间并结合实际网络观察对异常长租约类规则如dhcp.leasetime:864000即超过 10 天需先确认业务是否存在长期固定地址场景避免误报。九、小结三个 DHCP 时间关键字语法统一dhcp.keyword:[op]number支持精确与大小比较取值类型为无符号 64 位整数单位为秒分别对应 DHCP Option 51 / 58 / 59且客户端与服务器两个方向均参与匹配底层由 rust/src/dhcp/parser.rs 的严格 TLV 解析长度必须为 4 字节与 rust/src/dhcp/detect.rs 的 uint64 匹配框架共同支撑并与 EVE 日志字段lease_time、renewal_time、rebinding_time一一对应规则必须声明alert dhcp协议头才生效选项缺失的报文对该关键字直接不命中。官方文档dhcp-keywords.rst是这三个关键字最权威的语法参考本文在其基础上补充了源码调用链、解析细节与实战组合用法可直接作为编写 DHCP 检测规则的技术手册使用。赞分享网络安全【免费下载链接】suricataSuricata is a network Intrusion Detection System, Intrusion Prevention System and Network Security Monitoring engine developed by the OISF and the Suricata community.项目地址https://gitcode.com/gh_mirrors/su/suricata点击查看免费下载相关推荐PHPStan 错误标识符 outOfClass.static 详解在类作用域外使用 static 关键字的检测与修复PHPStan 错误标识符 outOfClass.static 详解在类作用域外使用 static 关键字的检测与修复 outOfClass.static 是开发工具代码质量静态分析Suricata EVE JSON Schema 完全指南字段定义、检测关键字映射与验证工具链Suricata EVE JSON Schema 完全指南字段定义、检测关键字映射与验证工具链 Suricata 的 EVEExtensible Event网络安全Suricata 规则编写实战base64_decode 与 base64_data 关键字从入门到源码级原理Suricata 规则编写实战base64_decode 与 base64_data 关键字从入门到源码级原理 Base64 编码常被恶意软件和攻击流量用来混网络安全上一篇Edge-TTS 文本转语音从文字到配音 MP3 只差 3 条命令下一篇免费开源AMD Ryzen调试工具SMUDebugTool新手也能轻松掌控硬件性能创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

用本地LLM+Captum,让时间序列模型的预测结果自动“说人话”

用本地LLM+Captum,让时间序列模型的预测结果自动“说人话”

做时间序列预测的工程师,几乎都遇到过同一个场景:模型明明把下一周销量预测准了,业务负责人却追着问“为什么这周涨了 20%?”。你打开 Notebook 算了一堆 SHAP 值,截个图发过去,对方看不懂,你自…

2026/10/9 2:09:24 阅读更多 →
ESP32-C3与合宙Air6208选型对比:架构、功耗与量产成本

ESP32-C3与合宙Air6208选型对比:架构、功耗与量产成本

/* 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 2:09:24 阅读更多 →
NYU-DLSP20 第 9 周讲义精读:能量模型视角下的 GAN 原理、三大陷阱与 DCGAN PyTorch 实战

NYU-DLSP20 第 9 周讲义精读:能量模型视角下的 GAN 原理、三大陷阱与 DCGAN PyTorch 实战

示例工程 【免费下载链接】NYU-DLSP20 NYU Deep Learning Spring 2020 项目地址: https://gitcode.com/gh_mirrors/pyt/pytorch-Deep-Learning 点击查看 免费下载 本文基于 NYU Deep Learning Spring 2020(NYU-DLSP20)课程第 9 周讲义&#…

2026/10/9 2:09:24 阅读更多 →

最新新闻

蓄电池与超级电容混合储能Simulink仿真:能量管理策略与模型搭建

蓄电池与超级电容混合储能Simulink仿真:能量管理策略与模型搭建

做混合储能仿真的朋友,多少都经历过这种场面:负载一开,蓄电池电流瞬间拉满,SOC曲线像过山车,控制器忙得团团转,可效果始终不尽如人意。其实问题往往不在控制器本身,而在能量管理策略没有把"…

2026/10/9 3:34:14 阅读更多 →
云原生架构白皮书精读:容器化部署与Kubernetes编排落地指南

云原生架构白皮书精读:容器化部署与Kubernetes编排落地指南

/* 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 3:34:14 阅读更多 →
告别手动部署:我用XinServer三天完成项目交付的全过程

告别手动部署:我用XinServer三天完成项目交付的全过程

交付项目最怕的不是写代码,而是代码写完之后那一整套部署、测试、交接的烂摊子。我上个月刚交付了一个数据看板类的管理系统,从开发完成到客户那边能打开页面看到真实数据,前后只用了三天。这中间起最大作用的,就是 XinServer 这个…

2026/10/9 3:34:14 阅读更多 →
C# 完全端口 TCP 服务器与客户端源码实战:从 Socket 到生产级参数调优

C# 完全端口 TCP 服务器与客户端源码实战:从 Socket 到生产级参数调优

简介:这份源码资源面向具备一定C#与网络编程基础的开发者,聚焦Windows平台下高性能TCP通信的实现与验证。核心采用完成端口(IOCP)模型编写服务器端,并配套完整客户端,可用于高并发场景下的收发性能测试与网…

2026/10/9 3:34:14 阅读更多 →
圆柱壳自由振动必算:Sanders理论+切比雪夫多项式求模态全流程

圆柱壳自由振动必算:Sanders理论+切比雪夫多项式求模态全流程

/* 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 3:34:14 阅读更多 →
从元器件到LM317可调电源:零基础硬件电路设计实战指南

从元器件到LM317可调电源:零基础硬件电路设计实战指南

/* 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 3:33:14 阅读更多 →

日新闻

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/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 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/7 13:34:55 阅读更多 →