krunalg/gravity-shield
GitHub: krunalg/gravity-shield
该项目为 Pi-hole 提供基于本地 LLM 推理和威胁情报同步的 DNS 层面恶意域名检测与自动拦截能力。
Stars: 0 | Forks: 0
# Pi-hole AI Guardian
为 Pi-hole 提供本地 AI 辅助的 DNS 威胁分类和威胁情报同步。
## 功能
- 实时监控 Pi-hole DNS 查询日志。
- 在要求 Granite 进行推理之前,先提取确定性的域名特征。
- 在拦截之前,使用相同的分类器验证威胁情报源的命中情况。
- 将恶意域名写入 Pi-hole 的 `Adaptive Threat Blocklist` 组。
- 批量处理 Pi-hole 列表重载,而不是在每次插入后都进行重载。
- 为关键/已知合法域名保留核心的永不对抗策略(never-block policy)。
## 架构
```
Pi-hole FTL log
-> DomainWatcher
-> feature extraction
-> Granite reasoning via Ollama
-> structured verdict
-> Pi-hole gravity.db
-> Adaptive Threat Blocklist group
Threat feeds (URLhaus, OpenPhish)
-> ThreatIntelSyncer
-> dedupe
-> feature extraction + Granite verification
-> Pi-hole gravity.db
-> Adaptive Threat Blocklist group
```
## 环境要求
- 安装了 Pi-hole v6.4+ 的 Raspberry Pi
- Python 3.11+
- GNU Make
- 包含 `granite4.1:3b` 的 Ollama
```
ollama pull granite4.1:3b
ollama serve
```
## 安装
```
git clone pihole-ai
cd pihole-ai
make install
make test
make setup
```
设置向导会创建:
- `.venv`
- `config_local.py`
- systemd 服务 `pihole-ai-$USER`
- 用于 `pihole reloadlists` 的 sudoers 规则
- Pi-hole 数据库/日志访问权限
## 验证
```
make daemon-status
make logs
```
检查最近的分类:
```
sqlite3 state.db \
"SELECT domain, category, confidence, rule_score, blocked FROM classifications ORDER BY classified_at DESC LIMIT 20"
```
检查 Pi-hole 拦截情况:
```
sudo sqlite3 /etc/pihole/gravity.db \
"SELECT domain, comment FROM domainlist WHERE comment LIKE 'AI:%' OR comment LIKE 'TI:%' LIMIT 20"
```
检查拦截组:
```
sudo sqlite3 /etc/pihole/gravity.db \
"SELECT id, name FROM \"group\" WHERE name='Adaptive Threat Blocklist'"
```
## 分类流程
分类器不再仅仅将原始域名发送给 Granite。它首先会构建结构化证据:
- 词法指标
- Shannon 熵
- 数字和连字符指标
- punycode/同形异义字信号
- TLD 风险
- 品牌相似度
- DGA 分数
- 规则分数及确定性原因
- 可用时的威胁情报上下文
Granite 返回 JSON:
```
{
"classification": "PHISHING",
"confidence": 0.97,
"severity": "HIGH",
"risk_score": 91,
"reasons": ["Brand impersonation", "Suspicious TLD"],
"recommended_action": "BLOCK"
}
```
只有当 action/category、置信度和规则分数通过配置的阈值时,域名才会被拦截。
## Pi-hole 组行为
每个新拦截的域名都会被映射到:
```
Adaptive Threat Blocklist
```
当存在 Pi-hole 组表时,`PiholeClient` 会创建该组,并将映射插入到 `domainlist_by_group` 中。
现有的历史条目不会自动迁移。
## 重载行为
域名会立即写入 `gravity.db`,但 Pi-hole 的重载是批量处理的:
```
PIHOLE_RELOAD_INTERVAL_SECONDS = 60
```
在 `config_local.py` 中将其设置为 `0` 即可立即重载。
## 永不拦截策略
受保护的域名和后缀配置于:
```
NEVER_BLOCK_DOMAINS
NEVER_BLOCK_SUFFIXES
```
该策略在最终的 Pi-hole 插入层执行,因此即使分类器或情报源结果出错,也无法插入受保护的域名。
## 配置
默认配置位于 `config.py` 中;本地覆盖配置位于 `config_local.py` 中。
重要设置:
```
OLLAMA_MODEL = "granite4.1:3b"
BLOCK_CONFIDENCE_THRESHOLD = 0.80
RULE_SCORE_THRESHOLD = 70
DGA_THRESHOLD = 0.70
ENTROPY_THRESHOLD = 3.8
BRAND_MATCH_THRESHOLD = 0.80
THREAT_INTEL_INTERVAL_HOURS = 6
PIHOLE_BLOCK_GROUP_NAME = "Adaptive Threat Blocklist"
PIHOLE_RELOAD_INTERVAL_SECONDS = 60
```
## 测试
```
make test
```
当前测试套件:44 个测试。所有外部服务均已被 mock。
## 项目结构
```
config.py
config_local.py
daemon.py
watcher.py
syncer.py
classifier.py
ollama_client.py
pihole_client.py
state_db.py
threat_intel.py
domain_policy.py
features/
extractor.py
lexical.py
entropy.py
digits.py
hyphens.py
punycode.py
tld.py
brand.py
dga.py
rules.py
tests/
```
## 故障排除
Ollama:
```
curl http://localhost:11434/api/tags
ollama list
```
守护进程:
```
sudo systemctl status pihole-ai-$USER
sudo journalctl -u pihole-ai-$USER -n 100
```
重载权限:
```
sudo -n pihole reloadlists
```
状态数据库:
```
sqlite3 state.db "SELECT * FROM sync_log ORDER BY synced_at DESC LIMIT 10"
sqlite3 state.db "SELECT * FROM classifications ORDER BY classified_at DESC LIMIT 5"
```
标签:AI风险缓解, DLL 劫持, DNS安全, IP 地址批量处理, Pi-hole, Sigma 规则, 域名分析, 大语言模型, 威胁情报, 开发者工具, 网络安全, 逆向工具, 隐私保护