cbuijs/aggrip
GitHub: cbuijs/aggrip
一套高性能命令行工具,用于聚合、分类、排序与去重 IP、CIDR 和域名。
Stars: 7 | Forks: 0
# Aggrip - IP、CIDR 和 DNS 域实用工具
一组高度优化的 Python 3 命令行工具,用于处理、聚合和排序 IP 地址、CIDR 网络和 DNS 域名列表。这些工具专为 Unix 类环境中的高性能管道操作而设计。
## INTRO
我曾多年担任网络与安全顾问,每天“吞下”数据和迁移。奇怪的是,这种疯狂渗透到了我的爱好中。作为一个地道的荷兰极客,捣鼓“DNS”是我在慵懒周日下午真正喜欢做的事情……没错,真的如此!
为了在与工作中各种奇怪边缘案例保持理智,我编写了这些脚本来支持我的家庭实验室(说实话,它们在工作中也依然救我狗命)。最终成果就是这套用于 grep、分类、聚合和排序 IP、CIDR 和域名的高度优化工具集。
只需 `cat` 一些混乱的数据并通过管道连接它们,尽情玩耍吧。记住……永远都是 DNS!(当然还有任何 TCP/IP 的东西)。
## 工具概览
### 分类与分析工具
* **`categorize.py`**
将混合输入的 IP、CIDR 和域名流分类到高度特定的逻辑区段。
* **IP/CIDR:** 支持高级 RFC 定义(例如 Carrier-Grade NAT、多播、链路本地、Class E)、特殊用途 IP 地址和标准 BOGON 映射。原生将反向 DNS(`.arpa`)指针解码回其真实的 IP 表示形式以实现准确路由。
* **域名:** 支持特殊用途域名 RFC、ccTLD 国家映射、eTLD 启发式、Web3/加密域名以及 WPAD 检测。
* **启发式:** 基于首标签分析,实现对广告和追踪器子域的快速路径正则检测。
* **格式化:** 默认严格丢弃无效垃圾文本。输出按默认分组并按字母/IP 排序。支持 `-i` / `--inline` 标志将输出扁平化,并以行内注释形式附加具体的 RFC/分类名称。
* **`categorize2.py`**
执行与 `categorize.py` 完全相同的深度分类、RFC 映射和启发式扫描,但使用高速批量内存读取、快速路径文本跳过和统一输出缓冲,以最大化处理大型数据集的吞吐量。
*注意:执行速度显著更快,但需要更多内存。*
### IP 地址与 CIDR 工具
* **`aggrip.py`**
将原始 IP 地址和 CIDR 块列表聚合成合并优化的 CIDR 列表。使用 `netaddr` 库。
* **`aggrip2.py`**
执行与 `aggrip.py` 相同的聚合,但使用 Python 内置的 `ipaddress` 模块。
*注意:此版本更快但消耗更多内存。*
* **`aggrip-asn.py`**
根据复合标识符聚合 IP 到 CIDR 列表。读取制表符分隔的输入(`CIDR \t ID \t Name`),按 ID/Name 排序、分组并合并 CIDR 而不丢失标识元数据。
* **`aggrip-asn2.py`**
执行与 `aggrip-asn.py` 完全相同的复合标识符聚合,但使用高速批量内存读取、预计算整数元数据排序和元组映射,显著提升执行速度。
*注意:执行更快但需要更多内存。*
* **`getip.py`**
一个强大的提取工具,充当 IP 感知的 `grep`。读取输入并明确提取有效 IP 地址、IP 范围(空格或短横线分隔)以及 CIDR,同时自动丢弃垃圾文本。默认情况下无效 CIDR 主机位会被自动截断,但可通过 `-s` / `--strict` 参数严格拒绝。默认严格验证行首,但支持“任意位置”(`-a` / `--anywhere`)深度扫描参数。输出严格合并、去重并按 IP 排序的 CIDR 列表。
* **`getip2.py`**
执行与 `getip.py` 完全相同的提取、整合和格式化(包括 `-s` / `--strict` 功能),但使用高速批量行读取、批量字符串缓冲和快速字符启发式跳过,显著提升深度扫描大型文本的速度。
*注意:执行更快但需要更多内存。*
* **`ipsort.py`**
读取 STDIN,根据非 IP 文本(如注释、标题或空行)识别逻辑文档区段,并在每个区段内执行严格的 IP 感知排序(IPv4 在前,然后是 IPv6)。完美保留原始文档布局和区段注释。可选使用 `-a` / `--aggregate` 标志在保留的区段内执行 CIDR 聚合,以及使用 `-r` / `--reverse` 标志进行降序排序。
* **`ipsort2.py`**
执行与 `ipsort.py` 完全相同的分段布局保留 IP 排序、可选聚合(`-a` / `--aggregate`)和反向排序(`-r` / `--reverse`),但使用高速批量内存读取、启发式文本跳过和分段数组排序。
*注意:执行更快但需要更多内存。*
* **`range2cidr.py`**
将 IP 范围语法(例如 `192.168.1.0-192.168.1.255`)转换为标准 CIDR 表示法。支持空格和短横线分隔符。参见 **`getip.py`** 获取更通用的版本。
* **`range2cidr2.py`**
执行与 `range2cidr.py` 相同的 IP 范围语法转换,但使用批量文本摄取和批量输出缓冲。
*注意:执行更快但需要更多内存。*
* **`revip.py`**
将 IP 地址或 CIDR 列表转换为对应的反向 DNS 查找名称(IPv4 使用 `in-addr.arpa`,IPv6 使用 `ip6.arpa`)。
* **`revip2.py`**
执行与 `revip.py` 相同的反向 DNS 查找名称生成,但使用批量内存分块和优化字符串切片,显著减少大型数据集的处理时间。
*注意:执行更快但需要更多内存。*
### DNS 域名工具
* **`clean-dom.py`**
DNS 块列表的综合优化脚本。它将一个或多个块列表与可选的允许列表和 Top-N 列表进行交叉引用,同时对所有提供的文件中的子域名进行去重。
**高级解析和路由功能:**
* 接受本地文件路径和远程 URL(`http://` 或 `https://`)。
* 支持标准纯域名列表、HOSTS 文件语法和 Adblock 语法。
* 动态路由位于块列表文件中的行内 Adblock 允许规则(`@@||domain.com^`)到允许列表。
* 完全解析并强制执行 Adblock `$denyallow` 修饰符,作为对块和允许列表规则的严格例外。
* 自动规范化输入(转换为小写、去除首尾点、移除前导通配符 `*.domain.com` -> `domain.com`)。
* 可选丢弃未使用的允许列表条目(`--optimize-allowlist`),以确保导出的允许列表被严格利用。
* 动态输出为纯域名、HOSTS 或标准 Adblock 格式。
* 支持直接写入独立的块列表和允许列表文件。
*(注意:这是唯一一个不使用 STDIN 而是强制使用标准命令行参数的工具。它支持每个参数传递多个文件。详见 [clean-dom-manual.md](https://github.com/cbuijs/aggrip/blob/master/clean-dom-manual.md) 获取高级用法)。*
* **`clean-dom2.py`**
执行与 `clean-dom.py` 完全相同的 DNS 优化、路由和去重,但使用高速批量内存读取和反向字符串 `O(N log N)` 排序算法。
*注意:对于大型块列表,执行显著更快,但消耗更多 RAM。命令参数相同。*
* **`domsort.py`**
读取 STDIN,根据非域名文本(如注释或空行)识别逻辑文档区段,并在区段内严格验证并按根级别向下(树形/TLD 优先)对域名进行排序。完美保留原始文档布局。支持 `-l` / `--less-strict` 标志以允许域名中包含下划线(`_`)和星号(`*`)(例如通配符或 SRV 记录)而不破坏字母顺序。此外支持标准 A-Z 排序(`-a` / `--alphabetical`)和降序排序(`-r` / `--reverse`)。
* **`domsort2.py`**
执行与 `domsort.py` 完全相同的分段布局保留域名排序及可选参数支持(`-l` / `--less-strict`、`-a` / `--alphabetical`、`-r` / `--reverse`),但使用高速批量内存读取、快速路径文本跳过和分段数组排序。
*注意:执行更快但需要更多内存。*
* **`getdom.py`**
一个强大的提取工具,域名感知的 `grep`。从标准输入读取文本(纯列表、HOSTS 格式、Adblock 订阅源或 URL),提取有效 DNS 域名并丢弃垃圾文本、IP 地址和注释。支持 `-a` / `--allow` 标志仅提取 Adblock/AdGuard “允许列表”域名(例如以 `@@` 开头的规则或 `$denyallow` 修饰符中的孤立例外)。也支持 `-l` / `--less-strict` 标志以允许域名中包含下划线(`_`)和星号(`*`)以提取通配符或 SRV 记录。使用 `-o` / `--output` 参数可将提取的域名即时格式化为 `plain`(默认)、`adblock`(动态输出 `||domain^` 或 `@@||domain^`,取决于 `-a` 标志)或 `hosts`(前置 `0.0.0.0`)。
* **`getdom2.py`**
执行与 `getdom.py` 完全相同的域名提取、语法路由和可定制输出格式化(`-o`),但使用高速批量内存摄取和统一输出缓冲,显著提升扫描大型数据集的速度。
*注意:执行更快但需要更多内存。*
* **`undup.py`**
通过删除已存在父域名的子域名来去重 DNS 域名列表(例如,若存在 `example.com` 则移除 `sub.example.com`)。支持 `-l` / `--less-strict` 标志以在去重通配符和 SRV 记录时允许下划线(`_`)和星号(`*`)。
* **`undup2.py`**
执行与 `undup.py` 相同的去重和可选的宽松验证(`-l` / `--less-strict`),但以原始二进制/字节块读取和过滤数据。
*注意:执行更快但需要更多内存。*
## 使用说明
除了 `clean-dom.py` 之外,这些工具不需要强制性的命令行文件参数。它们被设计为通过标准输入(STDIN)和标准输出(STDOUT)链式调用,遵循通用/最佳实践。
**注意:** 可以通过 `-h` 或 `--help` 标志启动任意脚本以获取可用命令行参数的详细信息。
### 管道示例:
```
cat raw_ips.txt | ./aggrip.py > optimized_cidrs.txt
cat ranges.txt | ./range2cidr.py | ./aggrip.py
cat mixed_sources.txt | ./getdom2.py -l | ./undup2.py -l | ./domsort2.py > clean_domains.txt
cat messy_adblock.txt | ./getdom2.py -a -o adblock > clean_allowlist.txt
cat mixed_ips_and_comments.txt | ./ipsort.py -r > nicely_sorted_sections.txt
cat messy_sections.txt | ./ipsort2.py -a > aggregated_sections.txt
cat wildcard_zones.txt | ./domsort2.py -l -a -r > clean_zones.txt
cat messy_dump_of_everything.log | ./categorize2.py -i > flagged_inventory.txt
cat ips.list | ./ipsort.py -a | ./revip.py | ./categorize.py > neat_categorized_rev_ips.txt
```
### 关于 `clean-dom.py`:
```
./clean-dom.py --blocklist bl1.txt https://example.com/bl2.txt \
[--allowlist al1.txt] \
[--topnlist top1.txt] \
[-o {domain,hosts,adblock}] \
[--out-blocklist out_bl.txt] \
[--out-allowlist out_al.txt] \
[--optimize-allowlist] \
[--suppress-comments] \
[-v | --verbose]
```
*使用 `-v` 或 `--verbose` 标志可向 STDERR 打印加载进度、处理阶段和最终的重复统计摘要。*
## 依赖与安装
部分工具(`aggrip.py`、`aggrip-asn.py`)需要外部库 `netaddr`。
要安装或升级所需依赖项,请运行:
```
pip install -r requirements.txt
```
标签:ARPa, B类E, CC顶级域, CIDR, DNS, eTLD, IP, IP地址处理, Python, RFC, SEO, SYN扫描, Unix管道, Web3, WPAD检测, 加密域名, 反向DNS, 垃圾数据清理, 域名解析, 多播, 广告子域, 快速路径正则, 排序, 无后门, 特殊用途IP, 系统分析, 网络分析, 网络分类, 网络工具, 聚合, 载波级NAT, 过滤, 追踪子域, 链路本地, 首标签分析