SonarSearch架构全景:从原始数据集到API响应的完整链路图解
SonarSearch架构全景从原始数据集到API响应的完整链路图解【免费下载链接】SonarSearchA rapid API for the Project Sonar dataset项目地址: https://gitcode.com/gh_mirrors/so/SonarSearchSonarSearch 是一个用 Go 语言打造的极速查询 API 项目专门服务于 Rapid7 的 Project Sonar 互联网测绘数据集。它通过一套自研索引机制让用户在数百 GB 的原始数据中实现毫秒级的子域名查询与IP 反向查询。这篇架构图解文章将带你从零理解 SonarSearch 的完整链路数据如何从一张 gzip 压缩的 JSON 快照一步步变成浏览器和命令行工具里返回的 API 响应。SonarSearch 架构全景一条数据从磁盘到响应的 5 步链路SonarSearch 的整体架构可以抽象为一条清晰的流水线全程只依赖 Go 生态无需复杂中间件① 原始数据集(fdns_a.json.gz) │ gunzip 解压 ▼ ② sonar2crobat 并行转换 → 排序后的 CSV 文本 │ ▼ ③ sort 排序(domain / reverse 两个文件) │ ▼ ④ crobat2index 构建偏移量索引 → Redis / Postgres │ ▼ ⑤ crobat-server 双通道服务(REST :1998 / gRPC :1997) │ ▼ 查询者: curl / crobat 客户端 / 浏览器整个项目的入口和构建都在根目录的 Makefile 中定义make会一次性编译出 4 个二进制分别是sonar2crobat、crobat2index、crobat-server和命令行客户端crobat。第一步Rapid7 Project Sonar 原始数据集长什么样Project Sonar 是 Rapid7 发布的全球互联网测绘数据集其中最常见的fdns_a记录是 JSON 格式的 DNS A 记录每行包含三个字段name域名、type记录类型通常为 a、valueIP 地址。{name:www.example.com,type:a,value:93.184.216.34}这份原始数据体量极大完整部署 SonarSearch 通常需要150–200GB 的磁盘空间来存放数据集和索引。由于数据集文件无法直接用于检索SonarSearch 设计了后面的转换与索引步骤。第二步sonar2crobat 并行数据转换生成可排序的 CSV原始 JSON 无法高效检索所以第一步要用sonar2crobat源码见 cmd/sonar2crobat/main.go把它转换成两种紧凑的 CSV 格式域名格式主域,顶级域,子域例如example,com,www反向格式IP整数,域名把 IPv4 转成 uint32 整数方便数值比较转换过程借鉴了MapReduce 思想程序会启动与 CPU 核数相同的 Map 协程并行解析 JSON再通过 channel 汇总到 Reducer 写入输出文件核心逻辑在 sonar2crobat/main.go 的Map与Reducer函数中。一条典型的转换命令如下gunzip 2021-12-31-1640909088-fdns_a.json.gz | sonar2crobat -i - -o crobat_unsorted转换完成后再用sort命令对两个文件排序。排序后的文件就是后续查询的“数据主体”sort -k1,1 -k2,2 -t, crobat_unsorted_domains crobat_sorted_domains sort -k1,1 -t, -n crobat_unsorted_reverse crobat_sorted_reverse第三步crobat2index 构建偏移量索引这是性能的关键有了排序后的文本文件SonarSearch 还要解决“如何快速定位”的问题。它的方案很巧妙索引里不存数据只存每类 key 在文件中的字节偏移量offset。crobat2index源码见 cmd/crobat2index/main.go会逐行扫描排序文件每当遇到新的 key 就输出一条SET key offset指令域名索引key 就是主域,顶级域反向索引key 是IP整数 ÷ 10向下取整后的值代码在 pkg/ipconv/ipconv.go 的RoundDecIP相当于把 IP 空间切成“桶”查询时先跳到桶起点再顺序扫描生成的结果既可以输出为Redis 协议直接管道给redis-cli也可以输出为 CSV 用Postgres 的 COPY导入表结构为crobat_index(key text, value text)。两种后端二选一即可Redis索引放内存约需 20GB RAM查询最快Postgres索引落盘内存占用低约 2–4GB适合流量不大的场景写入 Postgres 的示例crobat2index -i crobat_sorted_domains -f domain -backend postgres | psql -U postgres -h 127.0.0.1 -d postgres -c COPY crobat_index(key, value) from stdin (Delimiter ,)索引读取的实现集中在 pkg/search/indicies.go 的getPos函数——一次 RedisGET或 Postgres 查询就能拿到文件中的起始字节位置。第四步crobat-server 双通道查询服务REST gRPC索引就绪后启动crobat-server入口见 cmd/crobat-server/main.go即可对外服务。它会同时开启两个端口1997 端口gRPC 流式服务供官方命令行客户端使用1998 端口RESTful HTTP 服务供浏览器与任意语言调用REST 接口一览路由定义在 cmd/crobat-server/rest/server.go接口功能/subdomains/{domain}查询某个域名下的所有子域名/tlds/{domain}查询该域名出现的所有顶级域变体/all/{domain}跨所有 TLD 汇总全部结果/reverse/{ip}对单个 IP 做反向 DNS 查询/reverse/{ip}/{mask}对整段 CIDR 网段做反向查询接口支持limit和page参数做分页无需任何认证或特殊请求头开箱即用。gRPC 接口则定义在 proto/crobat.protoGetSubdomains、GetTLDs、ReverseDNS、ReverseDNSRange四个方法全部使用server streaming通过 HTTP/2 把结果一条条推给客户端。大批量查询时gRPC 的流式传输既减少了首包延迟也大幅降低了服务端内存压力因此官方强烈推荐大查询走 gRPC。第五步查询背后的检索原理正向 反向收到查询请求后服务端会把它丢进一个 5 个 worker 的协程池见 pkg/search/domains.go 的NewDomainPool与 pkg/search/reverse.go 的NewReversePool实际检索逻辑非常朴素子域名正向查询先用索引拿到该主域,顶级域在排序文件中的起始偏移然后打开文件Seek到该位置顺序读取并匹配前缀直到遇到不匹配的行就停止——因为文件已排序命中区间的数据一定是连续的。IP 反向查询把 IP 或 CIDR 网段转成[min, max]的 uint32 区间再按“每 10 个 IP 一个桶”的索引跳到起点顺序扫描区间内的所有记录并还原成 IP 字符串返回。这种“索引定位 顺序扫描”的组合让 SonarSearch 在无需常驻内存加载全部数据的前提下依然能获得接近随机访问的查询速度。配套利器crobat 命令行客户端crobat源码见 cmd/crobat/main.go是官方 CLI 客户端适合脚本化使用支持文件与引号列表批量输入crobat -s example.com # 查询子域名 crobat -r 8.8.8.8 # 反向查询单个 IP crobat -r 8.8.8.8/24 # 反向查询整个网段 crobat -t example.com # 查询 TLD 变体 crobat -u # 结果去重大查询慎用部署 SonarSearch 的资源与配置清单磁盘150–200GB数据集 排序文件 索引内存Redis 后端约 20GBPostgres 后端约 2–4GB启动配置通过环境变量注入前缀为CROBAT_例如CROBAT_POSTGRES_URL、CROBAT_CACHE_BACKEND、CROBAT_DOMAIN_FILE、CROBAT_REVERSE_FILE完整步骤参考项目 README 的 SonarSearch Setup Instructions 一节从编译make make install、建 Postgres 表到导入索引、启动服务都有对应命令。总结SonarSearch 架构的精髓在于“一次排序、双重索引、流式输出”用sonar2crobat把不可检索的 JSON 变成紧凑 CSV用sort让数据天然有序用crobat2index把 key 映射到文件偏移最后用 REST gRPC 双通道对外提供毫秒级查询。理解了这条从原始数据集到 API 响应的完整链路你就能基于它搭建属于自己的 Project Sonar 查询服务甚至替换或扩展其中的任意一环。【免费下载链接】SonarSearchA rapid API for the Project Sonar dataset项目地址: https://gitcode.com/gh_mirrors/so/SonarSearch创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考