IP 地址匹配实战指南)
网络安全【免费下载链接】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点击查看免费下载导读本文围绕 Suricata 检测规则中的ip.src与ip.dst两个粘性缓冲区sticky buffer关键字展开讲解如何将源/目的 IP 地址作为可检测缓冲区与content、pcre、dataset等匹配机制组合实现基于 IP 黑名单的入站/出站告警等实战场景。读完本文你将掌握ip.src/ip.dst的语法、二进制匹配原理、与 datasets / iprep 的搭配方式以及其在源码中的实现与性能路径能够直接写出可运行的 IP 地址匹配规则。一、背景Suricata 中的 IP 地址匹配方式在 Suricata 规则体系中对 IP 地址的匹配主要有三条路径各自适用不同的场景IP 元组tuple参数即规则头中的$HOME_NET、$EXTERNAL_NET、any等地址变量用于规则级别的源/目的地址限定属于最基本的过滤手段。iprep 关键字基于 IP 信誉reputation系统的匹配可对 IP 所属类别与信誉分值进行判断详见 ip-reputation-rules.rst。ip.src/ip.dst粘性缓冲区把源/目的 IP 地址当作一个缓冲区进而与content、pcre、dataset、to_md5等变换transform组合使用。其中ip.src与ip.dst属于与数据集datasets交互的典型代表——它们匹配 IP 地址的二进制表示兼容ip与ipv4两种数据集类型是官方文档 ipaddr.rst 的主题也是本文的核心。二、ip.src源 IP 粘性缓冲区2.1 语法与语义ip.src是一个粘性缓冲区sticky buffer用于对数据包的源 IP 地址进行匹配。它匹配的是地址的二进制表示binary representation而不是字符串形式的点分十进制或十六进制文本。作为粘性缓冲区ip.src本身不带任何选项参数源码中以SIGMATCH_NOOPT标志标记见 detect-ipaddr.c它的作用是激活IP 地址缓冲区让后续的content、pcre、dataset等匹配操作作用于该缓冲区上。2.2 官方示例入站黑名单检测官方文档给出了一个基于源 IP 黑名单的入站告警示例alert tcp $EXTERNAL_NET any - $HOME_NET any (msg:Inbound bad list; flow:to_server; ip.src; dataset:isset,badips,type ip,load badips.list; sid:1; rev:1;)规则解析alert tcp $EXTERNAL_NET any - $HOME_NET any匹配外部网络到内部网络的 TCP 流量flow:to_server限定为客户端发往服务器的方向ip.src激活源 IP 粘性缓冲区dataset:isset,badips,type ip,load badips.list检查源 IP 是否存在于名为badips的ip类型数据集中数据集在启动时从badips.list文件加载msg/sid/rev告警信息与规则标识。2.3 匹配原理二进制表示与 IPv4/IPv6 自适应从源码看ip.src的匹配数据直接取自数据包地址结构体且对 IPv4 与 IPv6 自适应若数据包为 IPv4则取p-src.address.address_un_data8的前 4 字节作为缓冲区内容若数据包为 IPv6则取完整的 16 字节既非 IPv4 也非 IPv6 时缓冲区为空返回 NULL不参与匹配。相关实现见 detect-ipaddr.c 中的GetDataSrc()函数。注释中特别说明Suricata 将 IPv4 地址存储在字段的开头IPv4 address stored at the beginning of the field因此对 IPv4 只需截取前 4 字节即可得到完整的二进制地址。由于匹配的是原始二进制字节ip.src不能直接与十六进制点分文本形式的content匹配除非借助变换但它天然适合与同样基于二进制值的数据集datasets配合这正是官方示例采用dataset:isset的原因。三、ip.dst目的 IP 粘性缓冲区3.1 语法与语义ip.dst与ip.src完全对称是用于匹配目的 IP 地址的粘性缓冲区。同样匹配二进制表示兼容ip与ipv4两种数据集类型同样无选项参数SIGMATCH_NOOPT见 detect-ipaddr.c。3.2 官方示例出站黑名单检测alert tcp $HOME_NET any - any any (msg:Outbound bad list; flow:to_server; ip.dst; dataset:isset,badips,type ip,load badips.list; sid:1; rev:1;)规则解析alert tcp $HOME_NET any - any any匹配内部网络发出的 TCP 流量flow:to_server流量方向限定ip.dst激活目的 IP 粘性缓冲区dataset:isset,badips,type ip,load badips.list判断目的 IP 是否命中黑名单数据集。配合ip.src示例可以组成入站查源 IP、出站查目的 IP的完整黑名单防护体系内部主机访问已知恶意地址时由ip.dst告警外部恶意源访问内部网络时由ip.src告警。3.3 匹配原理与 ip.src 对称的实现ip.dst的数据取自p-dst.address.address_un_data8IPv4 取前 4 字节、IPv6 取 16 字节其余逻辑与ip.src完全一致见 detect-ipaddr.c 中的GetDataDst()函数。四、源码实现与注册机制深度解析4.1 关键字注册ip.src与ip.dst的注册逻辑集中在DetectIPAddrBufferRegister()函数detect-ipaddr.c核心步骤包括填充签名匹配表将DETECT_IPADDR_SRC/DETECT_IPADDR_DST两个枚举项定义于 detect-engine-register.h注册为名为ip.src/ip.dst的关键字注册缓冲区类型通过DetectBufferTypeRegister()注册新的缓冲区并调用DetectBufferTypeSupportsPacket()声明其支持数据包级packet-level匹配注册预过滤prefilter引擎DetectPktMpmRegister()将其注册到多模式匹配MPM预过滤路径预过滤优先级为 2注册检查引擎DetectPktInspectEngineRegister()将GetDataSrc/GetDataDst作为缓冲区数据获取回调使用通用的DetectEngineInspectPktBufferGeneric检查逻辑。从注册流程可以看出ip.src/ip.dst是完整意义上的数据包级粘性缓冲区具备 MPM 预过滤能力因此在规则集规模较大时IP 地址匹配可以借助预过滤提前淘汰大量不相关规则性能表现优于逐条遍历。4.2 设置阶段激活缓冲区列表DetectSrcIPAddrBufferSetup()/DetectDestIPAddrBufferSetup()detect-ipaddr.c在规则解析阶段被调用核心动作是SCDetectBufferSetActiveList()定义于 detect-engine-buffer.c将后续的content、pcre等内容匹配关键字挂载到ip.src/ip.dst对应的缓冲区列表list上这样规则中写在ip.src;之后的content就会针对源 IP 缓冲区进行匹配。4.3 单元测试佐证仓库中的测试用例 tests/detect-ipaddr.c 验证了该关键字的解析能力alert ip any any - any any (ip.src; content:A; sid:1; rev:1;)测试DetectIPAddrParseTest01验证了包含ip.src及后续content的规则可以被检测引擎正确解析、签名创建成功。这说明ip.src之后可以跟随常规的content匹配——尽管由于二进制表示的限制实际生产规则更多将其与数据集配合使用。五、与 datasets 的深度配合黑名单实战5.1 为什么 ip.src/ip.dst 适合搭配数据集IP 黑名单往往包含成千上万个条目如果为每个 IP 单独编写规则规则集将极其臃肿且性能低下。Suricata 的 datasets 机制提供大数据量集合匹配能力将海量条目加载到内存哈希表中运行时以 O(1) 复杂度判断某个值是否在集合中。ip.src/ip.dst匹配 IP 的二进制表示而ip/ipv4类型的 dataset 也基于 IP 二进制值存储与查找二者天然契合因此官方示例清一色采用dataset:isset形式。5.2 dataset 关键字语法回顾dataset关键字的完整语法为详见 datasets.rstdataset:cmd,name,options;其中cmdset加入集合、unset移出集合、isset判断是否在集合中、isnotset判断是否不在集合中typestring、md5、sha256、ipv4、ip——其中ipv4仅支持 IPv4ip同时支持 IPv4 与 IPv6load启动时从文件加载数据state同时指定加载与保存文件save退出时保存内存数据到文件memcap数据集最大内存上限hashsize哈希表大小建议与条目数量接近过小会导致启动时间较长。5.3 配置文件中预定义数据集除了在规则中内联声明数据集也可以在 Suricata 主配置文件中预定义datasets:配置节例如datasets: badips: type: ip load: badips.list memcap: 100mb hashsize: 2048此时规则中只需写dataset:isset,badips即可无需重复声明类型与加载文件。5.4 数据集文件格式badips.list为纯文本文件每行一个 IP或 CIDR 网段例如1.2.3.4 5.6.7.8 10.0.0.0/8type ip的数据集支持 CIDR 形式可有效压缩黑名单体积。六、与 iprep 的对比何时用哪一个ip.src/ip.dst与iprep都能基于 IP 做判断但定位不同维度ip.src / ip.dstdatasetiprep匹配内容IP 本身是否在集合中IP 的信誉类别与分值语法粘性缓冲区 dataset:issetiprep:方向,类别,运算符,分值典型场景自维护的 IP 黑/白名单基于信誉库的威胁等级判断规则头配合可与 IP-only 规则结合兼容 IP-only 规则iprep 示例详见 ip-reputation-rules.rstalert ip $HOME_NET any - any any (msg:IPREP internal host talking to CnC server; flow:to_server; iprep:dst,CnC,,30; sid:1; rev:1;)即目的 IP 在CnC类别中的信誉分值大于 30 时告警。若需要内网主机访问已知恶意地址类场景选择ip.dst dataset 自维护名单若希望依托信誉库的类别/分值维度做精细化判断则选择iprep。七、进阶粘性缓冲区与多缓冲区匹配ip.src/ip.dst属于 Suricata 7 引入的多缓冲区匹配multiple buffer matching能力家族之一官方支持列表见 multi-buffer-matching.rst。所谓粘性即在同一规则中关键字一旦出现其后的内容匹配就粘在该缓冲区上直到下一个粘性缓冲区关键字出现。基于这一特性可以写出更紧凑的规则例如在一条规则中分别对源与目的 IP 做不同的判断alert ip any any - any any (msg:IP pair check; ip.src; dataset:isset,src_bad,type ip; ip.dst; dataset:isset,dst_bad,type ip; sid:3; rev:1;)也可以将ip.src与变换transform结合——datasets 关键字本身感知变换见 datasets.rst例如对 IP 先做to_md5再查md5类型数据集。不过需要注意对 IP 做哈希变换的场景相对少见主流用法仍是直接的ip/ipv4类型集合判断。八、总结ip.src与ip.dst是 Suricata 提供的两个粘性缓冲区关键字分别激活源/目的 IP 地址缓冲区匹配地址的二进制表示它们兼容ip与ipv4两种数据集类型与dataset:isset配合可高效实现 IP 黑名单入站/出站检测源码层面二者注册为数据包级缓冲区具备 MPM 预过滤与通用检查引擎能力IPv4/IPv6 自适应取数实现位于 detect-ipaddr.c测试位于 tests/detect-ipaddr.c若需要基于 IP 信誉类别的精细化判断则应使用iprep关键字而非 IP 数据集。结合本文的规则示例与源码分析你可以立即在现有规则集中引入基于ip.src/ip.dst的 IP 黑名单检测或扩展为自定义的白名单、地理围栏geo-fencing等场景。赞分享网络安全【免费下载链接】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点击查看免费下载相关推荐Suricata 规则编写指南integer-keywords 整数匹配关键字全解析Suricata 规则编写指南integer keywords 整数匹配关键字全解析 本文是一份面向 Suricata 规则编写者的技术指南系统讲解基于无符网络安全高效解决Lapce远程SSH连接中打开文件夹无响应的实战指南高效解决Lapce远程SSH连接中打开文件夹无响应的实战指南 Lapce是一款基于Rust开发的闪电般快速且功能强大的代码编辑器它支持通过SSH协议连接远程服代码编辑器桌面应用开发工具Suricata IP ReputationIP 信誉机制完全指南配置、数据格式与 iprep 规则实战Suricata IP ReputationIP 信誉机制完全指南配置、数据格式与 iprep 规则实战 IP ReputationIP 信誉是 Su网络安全上一篇qrcp源码解析2CookieWaitGroup精妙设计让浏览器并行下载又快又不乱下一篇object-fit-images 配置详解watchMQ、skipTest 等高级选项实战创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考