tn3w/IPBlocklist

GitHub: tn3w/IPBlocklist

将 163 个威胁情报订阅源聚合为支持毫秒级查询的二进制黑名单,并提供文本、JSON 等多种格式输出。

Stars: 2 | Forks: 0

# IP黑名单

GitHub Workflow Status Feed Count Artifact Count

IPBlocklist 将 IP 和 ASN 威胁情报聚合为四个发布产物: - `blocklist.bin`:用于应用查询的紧凑二进制数据 - `blocklist.txt`:用于防火墙的计分、CIDR 精简文本黑名单 - `asns.json`:按订阅源名称键控的规范化 ASN 列表 - `asn_prefixes.json`:ASN → 宣告前缀的缓存 当前数据集由 163 个订阅源构建,包含 IPv4、IPv6、CIDR 范围、从 ASN 订阅源派生的宣告前缀,以及来自 IP2X 的代理类型范围。 订阅源集包括 OXL risk-db-lists 来源,涵盖托管、爬虫、VPN、扫描器、代理、Tor、ISP、教育、动态和顶级报告信誉列表,涵盖 ASN、网络和 IP 范围。 ## 演示 在线查询页面位于 [ipblocklist.tn3w.dev](https://ipblocklist.tn3w.dev)。它客户端加载 `blocklist.bin`、`feeds.json`、`asns.json` 和 `asn_prefixes.json`,支持 IP 和 ASN 查询,包含详细结果、订阅源元数据工具提示、分数可视化和每个 ASN 的宣告前缀列表。 如需精简、高度优化的 API 服务器,请参阅 [tn3w/ipblocklist-api](https://github.com/tn3w/ipblocklist-api): ``` curl https://ipblocklist-api.tn3w.dev/lookup/1.2.3.4 ``` ``` { "ip": "1.2.3.4", "max_score": 0.81, "top_category": "spam", "categories": ["malware", "spam"], "flags": ["is_spammer", "is_phishing"], "feeds": ["hphosts_psh", "hphosts_fsa"] } ``` ## 下载 ``` wget https://github.com/tn3w/IPBlocklist/releases/latest/download/blocklist.bin wget https://github.com/tn3w/IPBlocklist/releases/latest/download/blocklist.txt wget https://github.com/tn3w/IPBlocklist/releases/latest/download/asns.json wget https://github.com/tn3w/IPBlocklist/releases/latest/download/asn_prefixes.json ``` ## 可视化 ``` flowchart LR A[feeds.json] --> B[aggregator.py] B --> C[blocklist.bin] B --> D[asns.json] B --> E[scored ranges] E --> F[cidr_minimizer] F --> G[blocklist.txt] ``` ``` flowchart TD A[IP and CIDR feeds] --> D[normalize and deduplicate] B[ASN feeds from remote sources] --> C[RIPEstat announced prefixes] S[Static ASN lists in feeds.json] --> C C --> D S --> J[asns.json] B --> J D --> E[blocklist.bin] D --> F[scoring and thresholding] F --> G[cidr_minimizer] G --> H[blocklist.txt] ``` ## 管道 `aggregator.py` 下载订阅源、通过 RIPEstat 将 ASN 解析为前缀、合并重叠范围,并写入 `blocklist.bin`、`asns.json` 和 `blocklist.txt`。 标记为 `is_asn` 的订阅源支持远程(`url` + `regex`)或静态(`asns`)输入。 使用 `base_score: 0.0` 将 ASN 订阅源包含在 `blocklist.bin`/`asns.json` 中,同时不影响 `blocklist.txt`。 ## 产物 ### `blocklist.bin` 用于快速查询的自描述二进制格式(v2)。无需外部 JSON。 ``` [4 bytes: magic "IPBL"] [1 byte: version (2)] [4 bytes: timestamp (unix, LE)] [1 byte: flag count] for each flag: [1 byte: name length] [N bytes: flag name (utf-8)] [1 byte: category count] for each category: [1 byte: name length] [N bytes: category name (utf-8)] [2 bytes: feed count (LE)] for each feed: [1 byte: feed name length] [N bytes: feed name (utf-8)] [1 byte: base_score (0-200, divide by 200.0)] [1 byte: confidence (0-200, divide by 200.0)] [4 bytes: flags bitmask (LE, bit i = flag at index i)] [1 byte: categories bitmask (bit i = category at index i)] [4 bytes: range count (LE)] for each range: [varint: start delta from previous start] [varint: range size (end - start)] ``` 标志和类别存储为字符串表,后跟每个订阅源的位掩码,保持格式紧凑且完全自包含。 请参阅 `examples/` 目录以获取多种语言的查询实现示例。 ### `blocklist.txt` 从计分范围经过阈值处理、CIDR 提升和不可路由范围移除后生成的文本黑名单。 支持的输出形式: - 单个 IPv4:`1.2.3.4` - IPv4 CIDR:`1.2.3.0/24` - IPv4 范围:`1.2.3.1-1.2.3.254` - 单个 IPv6:`2001:db8::1` - IPv6 CIDR:`2001:db8::/32` - IPv6 范围:`2001:db8::1-2001:db8::ff` ### `asns.json` 按订阅源名称键控的 JSON 对象。 ``` { "datacenter_asns": ["16509", "15169"], "bgptools_c2_asns": ["14618"], "bgptools_tor_asns": ["60729", "53667"], "tor_static_asns": ["60729", "53667"] } ``` ### `asn_prefixes.json` 按 ASN 键控的 JSON 对象。 ``` { "16509": ["192.0.2.0/24", "198.51.100.0/24"], "15169": ["203.0.113.0/24"] } ``` ## 订阅源模型 通用字段: - `name` - `description` - `base_score` - `confidence` - `flags` - `categories` `flags` 是布尔指示器。规范值: - `is_anycast` - `is_brute_force` - `is_c2_server` - `is_cdn` - `is_compromised` - `is_datacenter` - `is_isp` - `is_malware` - `is_mobile` - `is_phishing` - `is_proxy` - `is_scanner` - `is_spammer` - `is_tor` - `is_vpn` `categories` 是计分桶。支持的值: - `anonymizer` - `attacks` - `botnet` - `compromised` - `infrastructure` - `malware` - `spam` IP 和 CIDR 订阅源字段: - `url` - `regex` ASN 订阅源字段: - `is_asn` - `url` 和 `regex`,或 `asns` 可选字段: - `provider_name` - `asns` ## 使用方法 在本地构建产物: ``` python aggregator.py ``` ASN 前缀查询缓存在 `asn_prefixes.json`(ASN → 宣告前缀)中。首次运行时缓存为空,每个 ASN 都通过 RIPEstat 解析。后续运行会跳过已解析的 ASN,仅获取新的 ASN,使增量重建显著更快。删除 `asn_prefixes.json` 可强制完全刷新。 查询 `blocklist.bin` 中的一个或多个 IP: ``` python lookup.py 8.8.8.8 1.1.1.1 ``` 输出包含订阅源元数据: ``` 8.8.8.8: x4bnet_datacenter_ipv4 | score=0.11 | flags=is_datacenter | cats=infrastructure ``` ## 示例实现 `examples/` 目录包含完整的单文件查询实现: | 语言 | 文件 | IPv6 | | ---------- | -------------- | ---- | | C | `lookup.c` | 是 | | C++ | `lookup.cpp` | 否 | | C# | `lookup.cs` | 否 | | Crystal | `lookup.cr` | 否 | | D | `lookup.d` | 否 | | Dart | `lookup.dart` | 否 | | Elixir | `lookup.exs` | 否 | | Erlang | `lookup.erl` | 否 | | Go | `lookup.go` | 是 | | Haskell | `lookup.hs` | 否 | | Java | `lookup.java` | 否 | | JavaScript | `lookup.js` | 否 | | Kotlin | `lookup.kt` | 否 | | Lua | `lookup.lua` | 否 | | Nim | `lookup.nim` | 否 | | Perl | `lookup.pl` | 否 | | PHP | `lookup.php` | 否 | | Python | `lookup.py` | 是 | | Ruby | `lookup.rb` | 是 | | Rust | `lookup.rs` | 是 | | Scala | `lookup.scala` | 否 | | Shell | `lookup.sh` | 否 | | Swift | `lookup.swift` | 否 | | TypeScript | `lookup.ts` | 否 | | Zig | `lookup.zig` | 否 | 完全类型化的 Python 变体位于 `lookup_typed.py`。 将文本黑名单加载到 `ipset`: ``` ipset create blocklist hash:net while IFS= read -r line; do [[ "$line" =~ ^# ]] && continue ipset add blocklist "$line" 2>/dev/null done < blocklist.txt ``` 在 Python 中读取 `asns.json`: ``` import json with open("asns.json") as file: asn_lists = json.load(file) tor_asns = set(asn_lists["bgptools_tor_asns"]) print("60729" in tor_asns) ``` 在 Python 中读取 `asn_prefixes.json`: ``` import json with open("asn_prefixes.json") as file: asn_prefixes = json.load(file) asn = "16509" prefixes = asn_prefixes.get(asn, []) print(f"ASN {asn} announces these prefixes: {prefixes}") ``` 在 Python 中检查 IP 是否被 `blocklist.txt` 覆盖: ``` import ipaddress def line_matches_ip(line, address): if not line or line.startswith("#"): return False if "-" in line: start_text, end_text = line.split("-", 1) start = ipaddress.ip_address(start_text) end = ipaddress.ip_address(end_text) return int(start) <= int(address) <= int(end) if "/" in line: return address in ipaddress.ip_network(line, strict=False) return address == ipaddress.ip_address(line) def ip_in_blocklist_txt(ip_value, path="blocklist.txt"): address = ipaddress.ip_address(ip_value) with open(path) as file: for raw_line in file: if line_matches_ip(raw_line.strip(), address): return True return False print(ip_in_blocklist_txt("8.8.8.8")) ``` ## 性能 - 订阅源总数:163 - 代理类型范围:410 万 - 条目总数:约 910 万 - 典型查询延迟:低于 1 毫秒 - 二进制大小:约 12 MB - 内存占用:约 120 MB ## AI 披露 本项目在开发过程中使用了 AI 工具协助,包括 GPT-5.4 和 Claude Opus 4.6。这些工具用于帮助生成代码、文档和其他内容。人类贡献者在整个开发过程中提供了指导、审查和监督,以确保最终产品的质量和准确性。AI 生成内容的示例是 ./examples 目录,其中包含多种编程语言的查询实现,这些实现是在 AI 工具的帮助下创建的。 ## 许可证 [LICENSE](LICENSE)
标签:163个威胁源, ASN, CIDR, IPv4, IPv6, IP信誉, IP黑名单, JS文件枚举, PowerShell, Tor检测, VPN检测, 二进制搜索, 代理检测, 可视化界面, 垃圾邮件, 威胁情报, 威胁情报聚合, 威胁源, 开发者工具, 快速查询, 恶意IP检测, 恶意软件, 扫描器检测, 数据可视化, 日志审计, 爬虫检测, 网络安全, 逆向工具, 钓鱼检测, 防火墙规则, 隐私保护