tn3w/IPBlocklist
GitHub: tn3w/IPBlocklist
将 163 个威胁情报订阅源聚合为支持毫秒级查询的二进制黑名单,并提供文本、JSON 等多种格式输出。
Stars: 2 | Forks: 0
# IP黑名单
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检测, 恶意软件, 扫描器检测, 数据可视化, 日志审计, 爬虫检测, 网络安全, 逆向工具, 钓鱼检测, 防火墙规则, 隐私保护