hnlcory/NetPyINT-Public
GitHub: hnlcory/NetPyINT-Public
一款用于解析 OpenWRT 防火墙日志、聚合多源 OSINT 威胁情报并进行自动化威胁评分与拦截列表导出的 Python 桌面应用。
Stars: 0 | Forks: 0
# NetPyINT — 网络威胁情报工具
一款用于防火墙日志分析、多源 OSINT 富化以及自动化威胁评分的 Python 桌面应用程序。NetPyINT 可以解析 WAN reject 和 banIP 日志,查询 10 个威胁情报平台,按照 0–100 的综合标准对每个 IP 进行评分,并导出带有日期且可直接导入路由器的拦截列表。
NetPyINT 支持两种日志格式 —— 默认的 `reject wan in` 防火墙日志行以及 `banIP/inbound/drop/*` 条目 —— 这些格式由 **OpenWRT** 原生生成(分别对应其自带的防火墙和流行的 banIP 拦截列表插件)。任何输出匹配日志语法的防火墙都能被完美解析,但 OpenWRT 是其主要目标。
## 功能
- **日志解析** — 支持两种防火墙日志格式:WAN reject (`reject wan in`) 和 banIP drop (`banIP/inbound/drop/*`),两者均为 OpenWRT 原生支持。提取源/目标 IP、端口、协议和时间戳,并自动进行去重和命中计数。
- **10 个 OSINT 平台** — 在单次扫描过程中查询 AbuseIPDB、VirusTotal、Shodan、Shodan InternetDB、GreyNoise、AlienVault OTX、ProxyCheck、IPInfo、ip-api.com 以及 DNS 反向解析。
- **多源反向 DNS** — DNS PTR 记录是权威来源;当不存在 PTR 记录时,由 ip-api、IPInfo、Shodan 或 InternetDB 已返回的主机名按此优先级顺序填补空白。已存储的扫描数据会在启动时进行追溯回填,无需额外的 API 调用。
- **三态分类** — Pending → Partial → Final。在至少有一个平台报告数据之前,IP 将保持 Pending 状态,随后进入 Partial 状态,直到所有 KEY 平台(AbuseIPDB + VirusTotal)均已报告,此时它们将获得最终的威胁等级。
- **加权威胁评分** — 根据具有可配置权重的多个来源生成综合 0–100 分数,并映射到六个严重程度级别(Critical、High、Medium、Low、Optional、No Threat)。
- **多线程扫描** — 支持暂停、恢复和停止控制的后台扫描线程。在长时间的扫描过程中,GUI 保持响应。
- **并行工作进程** — 可配置的并行扫描工作进程(1–8 个),在 API 速率限制允许的情况下可实现更高的吞吐量。
- **自动开始扫描** — 可选的定期计时器,可按可配置的间隔(1–24 小时)对当前过滤后的 IP 集重新扫描,并可选择在下一个周期之前设置 5 分钟的扫描后缓冲时间。
- **高级过滤控制** — 用于分数范围、首次/最后出现近期度、命中数阈值、ASN/ISP 子字符串搜索以及国家多选的可折叠侧边栏面板。与现有的覆盖范围过滤器进行“与”组合,并驱动主表、Data Insights 和 Recalculate Levels。条件组合可以保存为命名预设。
- **SQLite 持久化** — 所有 IP 数据、扫描结果和审计日志都存储在本地索引数据库中,并支持升级时的自动 schema 迁移。
- **导出拦截列表** — 带有按严重程度划分的复选框、实时 IP 计数以及可直接导入路由器的带日期输出文件的模式对话框。
- **导出 / 导入完整报告 (JSON)** — 将整个数据库导出为 JSON 文件;重新导入以在另一安装实例上恢复或合并记录。
- **重新计算级别** — 根据现有数据重新计算威胁级别,无需进行 API 调用,范围仅限于当前过滤视图。
- **Data Insights** — 显示分数统计、威胁分类、国家/地区分布、平台覆盖率、漏洞摘要、时间活动、重犯指标、ASN/ISP 排名、协议/端口模式、ProxyCheck 和 OTX 分布、标签共现、新增命中激增以及扫描健康状况的分析选项卡 —— 所有内容都根据当前表视图(覆盖范围过滤器、搜索词和高级过滤控制)进行了过滤。
- **搜索栏** — 跨 IP、国家、反向 DNS、威胁级别、GreyNoise 类别和 ProxyCheck 类型,通过防抖机制进行基于 SQL 的搜索。
- **国家代码高亮** — 配置关注的国家代码列表;匹配的行将获得玫瑰色背景,并在 CC 列附加 ★ 后缀。
- **扫描日志保留** — 自动和按需清理旧的 scan_log 审计行,具有可配置的保留窗口。
- **Log Helper** — 用于在导入前清理、脱敏和预处理原始防火墙日志文件的配套实用程序。
- **达到速率限制时自动停止** — 当每个活跃平台都连续遇到速率限制错误时,自动停止扫描,节省 API 配额。
## 要求
- Python 3.10 或更高版本
- Tkinter(包含在大多数 Python 安装中)
- 无需第三方包 —— 仅使用 Python 标准库
## 快速开始
```
python3 netpyint_main.py
```
首次启动时,NetPyINT 会在工作目录中创建 `netpyint_config.json`,其中包含空的 API 密钥字段和默认设置。该工具在没有任何 API 密钥的情况下也能完全运行,但平台覆盖范围将仅限于无需密钥的服务(InternetDB、OTX、ip-api.com、DNS)。
### 添加 API 密钥
转到 **Settings → API Keys**,为您拥有账户的任何平台输入密钥:
| 平台 | 获取密钥地址 | 免费额度 |
|---|---|---|
| AbuseIPDB | [abuseipdb.com/account/api](https://www.abuseipdb.com/account/api) | 1,000 次检查/天 |
| VirusTotal | [virustotal.com/gui/my-apikey](https://www.virustotal.com/gui/my-apikey) | 4 次查询/分钟 |
| Shodan | [account.shodan.io](https://account.shodan.io/) | 仅限付费 |
| GreyNoise | [viz.greynoise.io/account/api-key](https://viz.greynoise.io/account/api-key) | 社区版(免费) |
| ProxyCheck | [proxycheck.io/dashboard](https://proxycheck.io/dashboard/) | 1,000 次查询/天 |
| IPInfo | [ipinfo.io/account/token](https://ipinfo.io/account/token) | 50,000 次/月 |
无需密钥的平台:
| 平台 | 服务 URL | 免费额度 | 提供的数据 |
|---|---|---|---|
| **Shodan InternetDB** | [internetdb.shodan.io](https://internetdb.shodan.io) | 无限(无需认证) | 开放端口、CVE、CPE 标识符、威胁标签 |
| **AlienVault OTX** | [otx.alienvault.com](https://otx.alienvault.com) | 100 次查询/小时 | 将 IP 与已知活动关联的威胁情报 pulse |
| **ip-api.com** | [ip-api.com](https://ip-api.com) | 45 次请求/分钟 | 国家、城市、ISP、ASN、代理/托管检测 |
| **DNS Reverse Lookup** | 系统解析器(无 HTTP) | 无限制 | IP 地址的 PTR 记录 |
### 加载日志
点击 **Load Log** 并选择防火墙日志文件。NetPyINT 会自动解析这两种格式 —— 两者都是 OpenWRT 原生支持的(自带防火墙的 reject 行和 banIP 插件的 drop 行):
```
Mon Mar 23 13:16:49 2026 kern.warn kernel: [311423.870453] reject wan in: IN=eth1 OUT= SRC=118.123.1.39 DST=10.0.0.1 PROTO=TCP SPT=12345 DPT=22
```
```
Mon Mar 23 13:16:46 2026 kern.warn kernel: [311420.900353] banIP/inbound/drop/country.v4: IN=eth0 OUT= SRC=85.217.149.48 DST=10.0.0.1 PROTO=UDP SPT=9999 DPT=53
```
IP 将按地址进行聚合,并统计命中数、端口集、协议集和时间戳范围。私有 IP 将被自动排除。分数会在导入后立即计算,以便 Score 列在无需重启的情况下正确排序。
### 日志 Helper
点击 **📋 Log Helper** 打开配套的 `log_helper.py` 实用程序。它用于在原始防火墙日志文件导入 NetPyINT 之前对其进行清理、日期过滤和 WAN-IP 脱敏处理。
### 扫描
点击 **Scan IPs** 开始为每个已加载的 IP 查询所有已启用的平台。扫描在后台线程中运行 —— 随时可以使用 **Pause**、**Resume** 或 **Stop**。进度和每个 IP 的结果会流式传输到 Scan Log 选项卡。在侧边栏中启用 **Auto Start Scan** 可让 NetPyINT 按计时器自动重新扫描当前过滤的 IP 集,而不是手动触发扫描 —— 有关间隔和延迟后设置,请参阅下文的配置。
## OSINT 平台
### KEY 平台(确定最终威胁级别所需)
| 平台 | 权重 | 提供的数据 |
|---|---|---|
| **AbuseIPDB** | 35% | 来自系统管理员报告的众包滥用置信度分数 (0–100) |
| **VirusTotal** | 25% | 70 多个扫描引擎将 IP 标记为恶意的百分比 |
在 IP 从 Partial 转变为最终威胁级别之前,两者都必须成功报告。这可以防止不完整的数据产生误导性的低分。
### 补充平台
| 平台 | 评分影响 | 提供的数据 |
|---|---|---|
| **Shodan** | 最高 +10 分 (CVE) | 开放端口、已知漏洞、ISP/ASN、操作系统、主机名(反向 DNS 后备) |
| **Shodan InternetDB** | 最高 +10 分 (CVE) + 最高 +5 分 (标签) | Shodan 的免费替代方案:端口、CVE、CPE 标识符、标签(malware、c2、tor、eol-os)、主机名(反向 DNS 后备) |
| **GreyNoise** | ±10 分 | 批量扫描器分类:恶意 (+10)、良性 (−5)、未知 (0) |
| **AlienVault OTX** | 最高 +10 分 | 将 IP 关联到已知威胁活动的 pulse 计数 |
| **ProxyCheck** | 最高 +5 分(纯加法) | 代理/VPN/Tor/爬虫检测、风险评分、运营商信息、攻击历史 |
| **IPInfo** | 仅上下文 | 地理位置、ASN 所有者、主机名(反向 DNS 后备) |
| **ip-api.com** | 仅上下文 | 国家、城市、ISP、代理/托管标志、主机名(反向 DNS 后备) |
| **DNS Reverse Lookup** | 仅上下文 | IP 地址的 PTR 记录 —— 主要、权威的反向 DNS 来源 |
### 反向 DNS 后备链
DNS 反向解析是权威的:如果它解析出 PTR 记录,该值始终具有最高优先级,包括覆盖先前扫描中由较低优先级平台回填的值。当 DNS 未返回任何内容时,NetPyINT 会按优先级顺序回退到其他平台响应中已存在的主机名:
1. DNS Reverse Lookup
2. ip-api(免费)
3. IPInfo
4. Shodan
5. Shodan InternetDB
后备平台仅在其仍为空时才写入反向 DNS 字段 —— 一旦链中的任何平台填充了该字段,较低优先级的平台将成为无操作。在启动时,每个反向 DNS 字段为空的 IP 都会根据其已存储的扫描数据进行重新检查,因此升级到此功能可以追溯填补空白,而无需重新查询任何 API。
### 漏洞去重
来自付费 Shodan 和免费 InternetDB 的 CVE 会在评分之前合并为一个去重集合,因此两个平台发现的同一个 CVE 只会被计算一次。
## 威胁评分
### 综合分数 (0–100)
| 来源 | 权重/最大值 | 备注 |
|---|---|---|
| AbuseIPDB 置信度 | 分数的 35% | `score × 0.35` |
| VirusTotal 恶意百分比 | 分数的 25% | `score × 0.25` |
| 漏洞 (Shodan + InternetDB CVE) | 最高 10 分 | 每个唯一 CVE +3 分,有上限 |
| InternetDB 威胁标签 | 最高 5 分 | 每个标签 +2 分:malware、c2、tor、eol-os、eol-product |
| GreyNoise 分类 | ±10 分 | 恶意 +10,良性 −5 |
| AlienVault OTX pulse | 最高 10 分 | 每个 pulse +2 分,有上限 |
| ProxyCheck 检测 | 最高 5 分 | Tor +5,代理/VPN +3,爬虫 +2(纯加法,有上限) |
| 本地命中频率 | 最高 10 分 | 100+ 次命中 = +10,50+ = +7,20+ = +5,5+ = +3 |
### 分数 → 威胁级别映射
| 分数范围 | 级别 | 建议操作 |
|---|---|---|
| ≥ 80 | **Critical** | 立即拦截 |
| ≥ 60 | **High** | 存在恶意活动的有力证据 |
| ≥ 40 | **Medium** | 中度怀疑,值得拦截 |
| ≥ 20 | **Low** | 轻微标记,持续监控 |
| ≥ 5 | **Optional** | 风险可忽略不计 |
| < 5 | **No Threat** | 良性 |
三态分类
1. **Pending** — 没有平台成功扫描过此 IP。新加载的 IP 从此处开始。每次扫描尝试均出错的 IP 也将保持在此状态。
2. **Partial** — 至少有一个平台报告了数据,但 KEY 平台(AbuseIPDB + VirusTotal)尚未全部报告。分数已计算,但可能不可靠。
3. **Final** — 所有 KEY 平台均已报告。分数将映射到上述威胁级别。
## GUI 布局
### 顶部栏
Load Log、Log Helper、Delete Selected、Scan IPs、Pause/Resume、Stop、Export Blocklist
### 主表
可排序的 Treeview,具有颜色编码的威胁级别和多选功能。列:IP、Threat Level、Score、Hits、First Seen、Last Seen、Country (CC)、AbuseIPDB%、VT%、OTX、Type、Tags、Reverse DNS、ProxyCheck Risk、GreyNoise。除 Tags(JSON 数组)外,所有列均为 SQL 排序(推送到数据库)。
表格上方带有防抖功能的 **Search** 栏可跨 IP、国家、反向 DNS、威胁级别、GreyNoise 类别和 ProxyCheck 类型实时过滤行。
### 右侧边栏
- **平台复选框** — 每次扫描启用/禁用单个 OSINT 源;Select All / Deselect All 按钮
- **统计信息** — Total IPs、Scanned、Critical、High、Medium、Partial、Low、Pending、Optional、No Threat、Blocklist count
- **扫描开关** — "Scan new IPs only" 和 **Auto Start Scan**(对当前过滤视图进行定期重新扫描;状态标签显示下次运行的大致时间)
- **Filter by Coverage**(可折叠) — 带有 All IPs、Partial(扫描不完整)、Pending(未扫描)、Missing: [每个平台]、Threat: [每个级别]、Country: Highlighted 的下拉菜单;**▶ Rescan Filtered** 和 **🔄 Recalculate Levels** 按钮(在扫描进行时均被禁用)
- **Advanced Filter Controls**(可折叠,默认处于折叠状态) — 请参阅下方的专门章节
### 底部选项卡
- **IP Details** — 完整的富化信息显示,包括 OSINT 分数、Shodan 端口/漏洞、InternetDB 标签/CPE、ProxyCheck 检测标志和运营商信息、日志上下文,以及带有 [KEY] 标记的按平台扫描覆盖范围 (✓/✗)
- **Data Insights** — 当前过滤视图(Filter by Coverage、搜索词和 Advanced Filter Controls)的分析仪表板:分数统计、威胁级别细分、排名前列的国家/ASN/ISP、平台覆盖率条形图、漏洞摘要、时间活动、重犯指标、端口/协议/规则模式、ProxyCheck 和 OTX 分布、InternetDB 标签共现、新增命中激增检测和扫描健康分数
- **Scan Log** — 每次 API 调用、错误和威胁级别分配的带时间戳的审计跟踪
- **Parsed Entries** — 最近一次导入解析出的原始日志行
### 右键上下文菜单
Delete Selected IPs、Rescan Selected IPs
## 高级过滤控制
一个可折叠的侧边栏面板,提供连续标准过滤,该过滤与 "Filter by Coverage" 下拉菜单以及面板内的所有其他控件进行“与”组合。默认处于折叠状态 —— 请参阅 **Settings → Start with Advanced Filters Hidden** 以更改启动行为。
| 控件 | 类型 | 行为 |
|---|---|---|
| Score 最小/最大值 | 双滑块 + 数字输入 | 威胁分数介于两个边界 (0–100) 之间;未触碰的全范围滑块不应用任何过滤 |
| 首次出现 ≤ N 天前 | Spinbox + 快速预设 (1d / 7d / 30d / 90d) | `0` 禁用该标准 |
| 最后出现 ≤ N 天前 | Spinbox + 快速预设 (1d / 7d / 30d / 90d) | `0` 禁用该标准 |
| Hits ≥ N | Spinbox | `0` 禁用该标准 |
| ASN/ISP 包含 | 文本输入,以逗号分隔 | 多个术语采用“或”逻辑连接 |
| Countries | 可搜索的多选列表 | 空选择意味着“无国家过滤器”,而不是“排除所有国家” |
所有标准均应用于主表、Data Insights 选项卡和 Recalculate Levels 按钮。面板标题在折叠时会显示当前活跃标准的数量(例如 "▶ Advanced Filters (3 active)")。点击 **Clear All Advanced Filters** 可将每个控件重置为默认值。
过滤组合可以通过 **Save As...** 保存为命名 **预设**,并通过 **Delete** 删除;预设持久化存储在 `netpyint_config.json` 中。面板的折叠/展开状态以及任何当前应用的标准仅在当前会话有效,并在每次启动时重置 —— 只有已保存的预设本身会被持久化。
## Data Insights 选项卡
**Data Insights** 选项卡会针对当前在表格中可见的任何 IP 集(遵循活跃的覆盖过滤器、搜索词和高级过滤控件)生成完整的分析报告。当该选项卡被选中时会自动刷新。所有 23 个部分均以等宽字体呈现为纯文本条形图和表格。
### 分数摘要
所有已评分 IP 的 `full_score` 的平均值、中位数、最小值、最大值和总体标准差。还显示分数 ≥ 75(“高风险”)的 IP 数量和百分比,以及有多少 IP 仍未评分(分数 = −1 / Pending)。
### 威胁级别细分
过滤集(Critical → High → Medium → Low → Optional → No Threat → Partial → Pending)中出现的每个威胁级别的计数和百分比条形图,按严重程度排序。
### 国家分布
按 IP 数量排名前 10 的来源国家及其百分比条形图,以及剩余部分的“其他”汇总。没有国家数据的 IP 将被排除在外。
### ASN 和 ISP 摘要
按 IP 数量排名前 10 的自治系统号 (ASN) 和前 10 的 ISP,有助于识别容忍滥用的托管基础设施。在一个 ASN 中的高度集中可能支持基于 ASN 进行拦截的规则。
### 平台覆盖率
显示当前视图中每个 OSINT 平台成功扫描的 IP 百分比的条形图。用于在开始重新扫描之前识别覆盖盲区。
### 平台相关性
两个主要平台之间的一致性:有多少 IP 被 AbuseIPDB 和 VirusTotal 同时扫描过,有多少 IP 的两项分数都 ≥ 50(高可信度威胁),以及有多少 IP 存在严重分歧(一个 ≥ 50,另一个 ≤ 10)——这是用于手动审查的有效分诊信号。还显示被 3 个或更多平台扫描过的 IP。
### GreyNoise 摘要
GreyNoise 分类的细分:恶意、良性、未知(已查询但不在 GreyNoise 的数据集中)和未查询。单独显示被标记为批量扫描噪音的 IP 和被标记为 RIOT(已知良好的基础设施)的 IP。
### 漏洞摘要
至少包含一个 CVE 的 IP 计数、整个集合中的 CVE 实例总数,以及前 10 个最常见的 CVE ID。来自 Shodan 和 InternetDB 的 CVE 会按 IP 去重,因此不会重复计算同一个 CVE。还显示具有开放端口的 IP 以及按 IP 数量排名前 10 的最常见的开放端口。
### InternetDB 标签
集合中出现的每个 InternetDB 标签(例如 `malware`、`c2`、`tor`、`eol-os`、`vpn`、`cdn`、`self-signed`)的频率计数。显示有多少 IP 带有每个标签。
### 标签共现
哪些 InternetDB 标签对最频繁地同时出现在同一个 IP 上。有助于识别复合威胁 —— 一个被标记为 `malware + c2 + tor` 的 IP 比只有一个标签的 IP 危险得多。还显示具有最多不同标签的 IP。
### CPE 摘要
通过 InternetDB 在攻击者 IP 上观察到的前 15 个 CPE(通用平台枚举)字符串,用于识别在攻击者基础设施上运行的软件和操作系统版本。每个 CPE 均按 IP 去重,因此计数代表了“运行此软件的 IP 数量”。
### 端口和服务风险
将目标端口映射到已知的服务风险类别 —— Critical(RDP 3389、SMB 445、MSSQL 1433、MySQL 3306、PostgreSQL 5432、Telnet 23)、High(SSH 22、FTP 21、SMTP 25、POP3 110、IMAP 143)、Medium(HTTP 80/8080、HTTPS 443/8443)。显示有多少 IP 锁定了每个风险类别,以及按 IP 数量排名前 10 的已知服务端口。
### 协议和目标端口模式
集合中所有 IP 的前 10 个协议(TCP、UDP、ICMP)、前 10 个目标端口和前 10 个防火墙规则名称。派生自导入时捕获的日志数据。
### 源端口摘要
在所有 IP 中观察到的前 10 个源端口。异常的源端口可以揭示扫描工具或僵尸网络特征。
### 重犯指标
根据命中频率将 IP 分类为持久型机器人(≥ 100 次命中)、中等型(10–99 次命中)和一次性探测(< 10 次命中)。还显示最高命中数和每个 IP 的平均命中数。高命中 IP 应优先拦截。
### 新增命中激增
识别那些 `new_hits`(在最近一次日志导入中新增的命中数)占其总命中数 ≥ 50% 的 IP —— 表明它们是最近活跃或不断升级的攻击者。按原始新增命中数列出前 5 个 IP。
### 时间活动
今天、过去 7 天和过去 30 天内首次出现的 IP。平均和最长潜伏期(last_seen − first_seen,以天为单位)。“活跃时间最长”的 IP:具有最近最后出现日期和最旧首次出现日期的 IP。
### ProxyCheck 风险分布
根据 ProxyCheck 风险分数将查询的 IP 划分至不同区间:Low(0–24)、Medium(25–49)、High(50–74)、Critical(75–100)。显示已查询 IP 中的平均和中位数风险。
### ProxyCheck 类型
过滤集中每个 ProxyCheck 分类令牌(例如 `vpn`、`proxy`、`tor`、`hosting`、`scraper`)的频率。
### OTX 分布
根据 AlienVault OTX pulse 计数划分 IP:零 pulse、低 (1–5)、中 (6–10)、高 (10+)、未查询。按 pulse 计数列出前 5 个 IP 及其威胁级别和国家。
### 扫描盲区
列出仍然缺失 AbuseIPDB 或 VirusTotal(两个主要平台)扫描记录的命中次数最高的 IP。按 total_hits 降序排序,以便最活跃的未扫描 IP 显示在最前面 —— 有助于确定接下来优先扫描哪些 IP 以获得最大的覆盖范围提升。
### 拦截列表捕获
细分首先捕获每个 IP 的防火墙规则:banIP blocklist.v4、banIP country.v4 或默认的 "reject wan in" 兜底策略。优先顺序为 blocklist → country → default,因此每个 IP 只会被计数一次。
### 数据集健康状况
整体扫描覆盖率分数:所有 IP 的所有 `scanned_*` 标志总和除以(总 IP 数 × 10 个平台)× 100%。还显示完全扫描(所有 10 个标志 = 1)、零扫描(纯日志条目,从未进行过富化)和部分扫描的 IP 计数。低分意味着威胁级别和洞察可能基于不完整的数据。
## 导出拦截列表
点击 **Export Blocklist** 打开包含以下内容的模式对话框:
- 每个严重程度级别(Critical、High、Medium、Low、Optional)的复选框
- 随着复选框的切换实时更新的 IP 计数
- Select All / Deselect All 按钮
- 带日期的输出文件:`blocklist_YYYY-MM-DD.txt`
导出的文件每行包含一个 IP,可直接导入路由器的访问控制列表。
## 导出 / 导入完整报告
**File → Export Full Report (JSON)…** 将所有 IP 记录和富化字段保存到便携式 JSON 文件中,并按严重程度排序。**File → Import Full Report (JSON)…** 使用 `INSERT … ON CONFLICT DO UPDATE` 合并恢复记录,保留导入文件中不存在的任何列。
## 配置
### netpyint_config.json
首次运行时自动创建。包含:
| 键 | 默认值 | 描述 |
|---|---|---|
| `api_keys` | `{}` | 每个平台的 API 密钥(本地存储,除了发送给相应的 API 外,从不传输) |
| `enabled_platforms` | 全部为 `true` | 10 个平台各自的布尔值切换开关 |
| `scan_delay_ms` | `1100` | API 调用之间的毫秒数(速率限制安全措施) |
| `parallel_workers` | `1` | 同时扫描的 IP 数量( = 串行,最大 8) |
| `scan_new_only` | `false` | 如果为 true,则仅扫描威胁级别为 "Pending" 的 IP |
| `max_abuseipdb_days` | `90` | AbuseIPDB 回溯窗口(以天为单位) |
| `auto_stop_rate_limit` | `true` | 当所有活跃平台都连续遇到速率限制时自动停止扫描 |
| `start_advanced_filters_hidden` | `true` | 启动时“高级过滤控制”面板是否处于折叠状态 |
| `auto_scan_enabled` | `false` | 启用定期“自动开始扫描”计时器 |
| `auto_scan_interval_hours` | `1` | 自动扫描之间的间隔小时数 (1–24) |
| `auto_scan_post_delay` | `false` | 在扫描完成之后、下一次自动扫描之前增加 5 分钟的缓冲时间 |
| `cc_highlight_codes` | `[]` | 其对应行将获得玫瑰色背景和 ★ 标记的国家代码(例如 `["CN","RU"]`) |
| `filter_presets` | `{}` | 已保存的“高级过滤控制”组合,按键名索引 |
| `scan_log_max_days` | `60` | 保留 `scan_log` 行的天数;`0` = 永久保留 |
| `last_key_platforms` | 自动设置 | 内部属性 —— 上次启动时 `KEY_PLATFORMS` 的快照,用于检测更改并触发对陈旧 Partial 级别的一次性重新计算。不可由用户编辑。 |
### 设置对话框
- **Settings → API Keys** — 为 AbuseIPDB、VirusTotal、Shodan、GreyNoise、ProxyCheck、IPInfo 输入/更新密钥
- **Settings → Scan Settings** — 调整扫描延迟、并行工作进程、AbuseIPDB 最大天数以及“自动开始扫描”间隔/延迟后缓冲时间
- **Settings → Auto-Stop on Rate Limits** — 通过菜单复选按钮切换自动停止行为
- **Settings → Start with Advanced Filters Hidden** — 切换“高级过滤控制”面板是否在下一次启动时以折叠状态开始
## 数据库
NetPyINT 在 WAL 模式下使用 SQLite 以实现并发的读/写访问。数据库文件 `netpyint_threat_intel.db` 在工作目录中创建。
### Schema
`ips` 表为每个唯一的 IP 地址存储一行,包含以下列:
- 标识:`ip`(主键)
- 时间:`first_seen`、`last_seen`、`last_scanned`
- 计数:`total_hits`、`new_hits`
- 地理位置:`country`、`city`、`isp`、`asn`、`reverse_dns`(主要来源是 DNS PTR;后备为 ip-api/IPInfo/Shodan/InternetDB 主机名 —— 请参阅上文的反向 DNS 后备链)
- AbuseIPDB:`abuseipdb_score`(0–100 置信度,如果未查询则为 −1)
- VirusTotal:`vt_score`(0–100 恶意百分比,如果未查询则为 −1)
- Shodan:`shodan_ports`、`shodan_vulns`(JSON 数组)
- InternetDB:`internetdb_ports`、`internetdb_vulns`、`internetdb_tags`、`internetdb_cpes`(JSON 数组)
- GreyNoise:`greynoise_class`、`greynoise_noise`、`greynoise_riot`
- OTX:`otx_pulses`
- ProxyCheck:`proxycheck_risk`、`proxycheck_type`、`proxycheck_data`(完整 JSON)
- IPInfo:`ipinfo_data`(完整 JSON)
- 日志上下文:`log_rules`、`dst_ports`、`src_ports`、`protocols`
- 分类:`threat_level`、`full_score`、`vuln_count`、`tag_count`(缓存的评分输入,避免在每次加载时重新解析 JSON)、`raw_results`(包含所有 API 响应的完整 JSON)
- 备注:`notes`(用户可编辑)
- 扫描标志:10 个 `scanned_*` 列(每个平台一个,0/1)
`scan_log` 表提供审计跟踪,包含每次 API 调用的时间戳、IP、平台、状态和截断的响应。
### Schema 迁移
在启动时,`init_db()` 会通过 `ALTER TABLE` 自动添加任何缺失的列,从而实现无缝升级而不丢失数据。具有旧版 schema 的现有数据库将被透明地迁移。
启动时会创建四个覆盖索引(使用 `IF NOT EXISTS`,因此应用于现有数据库是安全的):
- `idx_ips_threat_level` — 加速过滤查询和 Pending/Partial 视图
- `idx_ips_full_score` — 加速 Score 和 Threat 列的排序
- `idx_ips_country` — 加速 Country Highlighted 过滤器
- `idx_ips_total_hits` — 加速默认表排序
### 扫描日志保留
`scan_log` 审计表随着每次 API 调用增加一行。在启动时,早于 `scan_log_max_days`(默认为 60,`0` 禁用清理)的行会被自动删除。**File → Prune Scan Log…** 会打开一个对话框,显示当前行数以及最早/最新的条目日期,并提供针对任何保留窗口的手动清理选项。
## 错误处理
每个平台的错误响应都会被单独处理,以防止存储虚假数据:
| 平台 | 错误场景 | 行为 |
|---|---|---|
| AbuseIPDB | HTTP 429、`{"errors":[...]}`、null 数据 | 返回 `_error`,扫描标志保持为 0 |
| VirusTotal | HTTP 429、`QuotaExceededError`、空属性 | 返回 `_error`,扫描标志保持为 0 |
| Shodan | HTTP 401/429、body 中包含 `{"error":"..."}` | 返回 `_error`,扫描标志保持为 0 |
| InternetDB | HTTP 404(IP 不在数据库中) | 有效的空结果 —— 设置扫描标志为 1 |
| GreyNoise | HTTP 404(未观察到 IP) | 有效的“未知” —— 设置扫描标志为 1 |
| GreyNoise | HTTP 429(速率限制) | 返回 `_error`,扫描标志保持为 0 |
| ProxyCheck | `status: denied/refused/error` | 返回 `_error`,扫描标志保持为 0 |
| ip-api.com | HTTP 200 且 `status: fail` | 返回 `_error`,扫描标志保持为 0 |
| DNS | `socket.timeout` | 返回 `_error`,扫描标志保持为 0 |
| DNS | `socket.herror`(无 PTR 记录) | 有效结果 —— 设置扫描标志为 1 |
所有错误都会连同平台名称和错误消息一起记录到 Scan Log 选项卡中。所有请求都会发送 `User-Agent: NetPyINT-ThreatIntel/{VERSION}` 标头,以避免 Cloudflare 机器人拦截(错误 1010)。
## 项目结构
```
netpyint_main.py Main application entry point and GUI controller
helpers/
config.py Constants, default settings, config file I/O
db_repository.py All SQLite queries (data access layer) + index management
scan_engine.py Per-IP scan worker, platform registry, rate limiting
scoring.py Weighted threat scoring and level mapping
log_parser.py Firewall log regex, parsing, and aggregation
api_requests.py OSINT platform HTTP clients
data_insights.py Analytics engine for the Data Insights tab
filter_panel.py Advanced Filter Controls sidebar widget
formatting.py Shared date/score/country display formatting
settings_dialogs.py API Keys and Scan Settings dialogs
export_import.py Blocklist export, JSON export/import, Clear Database
utils.py Shared parsing primitives (JSON lists, ctime)
log_helper.py Companion log-cleaning and blocklist utility
netpyint_config.json Auto-generated configuration (API keys, settings)
netpyint_threat_intel.db Auto-generated SQLite database
```
## 许可证
有关条款,请参见 LICENSE 文件。
标签:ESC4, OpenWRT, OSINT, Python, 威胁情报, 开发者工具, 无后门, 逆向工具, 防火墙