This repository has been archived on 2025-09-14. You can view files and clone it, but cannot push or open issues or pull requests.
Files
tango-maat/docs/scan_api.md
2023-07-06 18:58:15 +08:00

112 lines
6.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Scan API
## 最大返回结果限制
多命中情况下按包含分组数由多到少返回分组数相同时按编译配置ID由大到小的顺序返回。
多命中扫描的最大命中次数受MAX_SCANNER_HIT_NUM宏控制当前为4096条。
如果命中条数超出4096则按照配置在IRIS库表文件出现的顺序返回。
## 流式跨包扫描
在配置表描述文件中如果指定某个字符串类域表设置的跨包缓存值且该值大于0则在为该表开启流式跨包扫描功能。
进行流式扫描中会对输入数据结束后缓存该值大小内容以便下次扫描时进行拼接。会增加一次内存拷贝并且该拷贝内存在下次扫描时复用。由此决定了下文中Maat_hit_detail_t结构体中命中位置指针的生存周期。
为了避免流式跨包扫描对带偏移量的字符串匹配的功能的干扰,流式扫描结构体中包含了一个当前已扫描长度的变量,用以显示表识输入数据的绝对偏移量。
## 结果缓存复用
另外为了提高系统的性能为每个scanner分配了一个region_rslt_buff用以缓存域扫描命中的中间结果。通过malloc分配长度为sizeof(scan_result_t)*MAX_SCANNER_HIT_NUM*scan_thread_num当外部调用扫描时根据thread_num参数分配region_rslt_buff+MAX_SCANNER_HIT_NUM*thread_num供当前线程保存域中间扫描结果。
### 命中结果返回条件
Maat_xx_scan函数输入的数据命中了某个域配置且满足某一编译配置就会返回该编译配置ID无论该编译配置是否已在之前扫描中命中。
### 命中结果执行顺序
多命中情况下,编译配置的按照如下顺序返回:
1. 两条编译配置的执行序号exec_seq都不为0执行序号较小的在前
2. 执行序号相同或者有任意一条编译配置的执行序号为0时依次按照以下顺序返回
1. 分组数量较多的在前
2. 编译配置ID较大的在前
## 命中路径
从待扫描数据的角度描述其域ID->子分组ID->顶级分组ID含虚拟表名->编译配置的ID序列称为命中路径。
一个待扫描数据在以下情况下有多个命中路径:
- 多规则命中输入同时命中多个region ID。如
- 输入URL: abc.com/index.html规则r1=”abc”r2=”index.html”输入有两个分别以r1和r2为起点的命中路径。
- 分组复用
- 分组间“与”运算
策略的结构是从compile到item的自顶向下而命中路径是从最底层的item到顶层的compile是自底向上的。它将网状和层次结构的object-policy图进行扁平化转换为图论中的路径。例如有如下策略
- 字符串object1包含 item1="abc"
- 字符串object2包含item2=".com"
- 字符串object3包含object2
- IP object4包含item3=192.168.0.1/24
- IP object5包含object4
- IP object6包含object5
- rule1=object1 & object6
- rule2=object1
输入url=abc.comua=chrome80IP=192.168.0.1的命中路径为
| 输入 | Region ID | Sub Group ID | Top Group ID | Virutal Table | Rule ID |
| ----------- | --------- | ----------------------- | ------------ | ------------- | ------- |
| abc.com | item1 | object1 | object1 | HTTP_URL | Rule1 |
| item2 | object2 | N/A因为没有最终命中 | N/A | N/A | |
| item1 | object1 | object1 | HTTP_URL | Rule2 | |
| 192.168.0.1 | item3 | object4 | object6 | IP | Rule2 |
| chrome80 | N/A | N/A | N/A | N/A | N/A |
命中关系还是一张图,采用邻接矩阵存储,而命中路径是邻接矩阵中的一行。
![Hit Path as a Graph](./imgs/hitpath.png)
## 组合扫描
同一网络传输单元的多个属性的扫描是通过scan_status* mid实现的其中缓存了已命中的子句id该ID在增量更新中不重用。
在一个mid的生存期内配置组合关系变化产生新的bool matcher。
- 如果是增量更新缓存的子句id会和新的bool matcher进行运算。由于子句ID在增量更新中不变化不会产生误命中。
- 如果是全量更新缓存的子句id不会和新的bool matcher进行运算。
## 常见故障处理
### 初始化失败
当出现Maat初始化失败、扫描不命中时首先查看Maat生成的日志文件FATAL级别的日志都会导致Maat不能正确加载、扫描配置。
日志提示“config file xxx,not full or inc config”请确认Maat_ feather/Maat_summon_feather/Maat_summon_feather_json初始化时传入的两个路径是否正确注意路径为IRIS配置线写入的index路径例如/home/ config/dest/index/,而不是/home /config/dest/。
该日志文件由Maat_summon_feather函数调用时传递的日志句柄所生成需要注意的是该句柄的日志级别过高会导致”INFO”级日志不可见。
### 扫描出现段错误
确认扫描传入的maat_state* state已在调用前创建。
确认输入的待扫描内容的内存可访问,长度参数正确。
### 扫描不命中
扫描不命中,首先查看初始化日志,判断加载的配置是否是你期待的路径。
然后判断配置加载是否有FATAL级别的错误日志。
接下来确认扫描时传入的table_id与期待的表名是否正确对应避免出现用表A的配置扫描表B的字段。
对于字符串扫描charset参数传递正确且包含在配置表描述文件通常为table_info.conf的”目的编码”中。如果不能确定可以暂时修改配置表描述文件中的do_merge列为”yes”。
在使用带有命中细节的函数扫描时一般detail_num应与rule_num相等。
IRIS文件模式下如待命中配置在增量索引中需要等待延迟加载日志中Postpone xx entries完成。调试时可将MAAT_OPT_SCANDIR_INTERVAL_MS 和MAAT_OPT_EFFECT_INVERVAL_MS设置为20毫秒。
另外JSON调试只能支持分组的模式下工作需要在配置表描述文件table_info.conf中增加分组表否则可能导致误命中或不命中。