nunoOliveiraqwe/torii
GitHub: nunoOliveiraqwe/torii
一款面向公网暴露服务的轻量级反向代理,集实时安全仪表板、自动TLS、蜜罐和访问控制于一体,帮助用户洞察并拦截恶意流量。
Stars: 58 | Forks: 0
_ _ _
| |_ ___ _ __ (_|_)
| __/ _ \| '_ \| | |
| || (_) | | | | |
\__\___/|_| |_|_|
洞察一切访问你服务器的请求。拦截那些不该出现的访问。
在暴露于互联网的树莓派上的实时仪表板。每一个请求,每一个被封禁的 IP,每一个被抓到的机器人——尽在实时掌握之中。
## 这是什么?
一个带有内置安全仪表板的反向代理。只需一个二进制文件,一个配置文件,没有任何依赖。
你只需将它指向你的服务,暴露在互联网上,然后观察接下来会发生什么。Torii 负责处理路由、TLS
证书、速率限制和机器人防御——并将这一切以实时的方式展示给你。
## 30 秒快速开始
```
go build -o torii ./cmd/torii
./torii -config config.yaml --debug
```
打开 `http://127.0.0.1:27000/ui`,设置你的密码,然后你就可以查看实时流量了。`--debug` 会启动模拟的后端服务,
这样你可以直接探索而无需配置真实的服务。
### 最小配置
```
log:
log-level: INFO
api-server:
host: 127.0.0.1
port: 27000
net-config:
http:
- port: 80
default:
backend: http://192.168.1.50:8080
```
就是这样。Torii 会自动添加请求日志、指标和请求 ID。
完整配置参考 → [docs/configuration.md](docs/configuration.md)
## 它能拦截什么
Torii 正运行在一个对互联网开放端口的树莓派 3 上。以下是典型的一天中所遇到的情况:
- **探测漏洞的扫描器** — `.env`、`wp-login.php`、`.git/config` — 被蜜罐陷阱捕获并自动封禁
- **已知的扫描器 User-Agent** — Nuclei、zgrab、爬虫、AI 爬虫 — 一旦匹配便立即拦截
- **有已知滥用记录的 IP** — 通过 AbuseIPDB 进行实时检查
- **暴力破解尝试** — 受到速率限制并正确返回 `429` + `Retry-After`,对屡次违规者进行封禁
- **来自异常国家的流量** — 在到达你的服务之前就被 GeoIP 拦截
所有被拦截的内容都会连同时间戳、IP 以及被拦截的原因显示在仪表板中。
| 活动日志 | 负载状态 |
|:------------------------------------------:|:--------------------------------------------:|
|  |  |
## 功能特性
**路由** — HTTP/HTTPS,虚拟主机路由,支持通配符的基于路径的路由,以及按路径覆盖后端。
**自动 TLS** — 通过 DNS-01 方式使用 Let's Encrypt。无需开放 80 端口。支持按域名配置 SNI。后台自动续期。
**机器人防御** — UA 拦截(扫描器、爬虫、AI 爬虫),带有可选欺骗模式(网络粘包陷阱、伪造凭据、无限数据流)的蜜罐陷阱,GeoIP 封禁。
**速率限制** — 令牌桶算法,支持全局限制或按客户端 IP 限制。
**熔断器** — 停止将流量转发到不健康的后端,直到它们恢复正常。
**AbuseIPDB 集成** — 根据社区滥用报告检查客户端 IP。可选择将被封禁的 IP 回报给官方。
**实时仪表板** — 分层指标(全局 → 路由 → 路径),通过 SSE 实现实时请求与错误日志,被封禁的 IP 日志。
**19 个可组合的中间件** — 全部支持按路由或按路径配置。[完整列表 →](docs/configuration.md#middleware-reference)
## Homepage 集成
Torii 支持具有作用域的 API 密钥,用于只读统计数据访问。将以下内容添加到你的 [Homepage](https://gethomepage.dev) 配置中:
```
- Torii:
icon: shield
href: http://127.0.0.1:27000/ui
widget:
type: customapi
url: http://127.0.0.1:27000/api/v1/proxy/metrics
headers:
Authorization: Bearer
mappings:
- field: total_requests
label: Requests
- field: blocked_ips
label: Blocked IPs
```
## 截图
| 仪表板 | 代理路由 |
|:--------------------------------------------:|:--------------------------------------------------:|
|  |  |
## 安装
### 二进制文件
```
go build -o torii ./cmd/torii
./torii -config config.yaml
```
### Docker
```
docker run -d \
--network host \
-v torii-data:/data \
-v /path/to/config.yaml:/etc/torii/config.yaml \
ghcr.io/nunoOliveiraqwe/torii:latest
```
建议使用 `--network host`,这样 Torii 就可以直接绑定到宿主机的网络接口上。
| 挂载点 | 用途 |
|------------------------|--------------------------------------------|
| `torii-data:/data` | SQLite 数据库(在重启后依然保留) |
| `/path/to/config.yaml` | 配置文件 |
从源码构建 (Docker)
```
docker build -f docker/Multistage.Dockerfile -t torii .
```
Torii 使用了 `mattn/go-sqlite3`,这需要 CGO 的支持。构建此二进制文件时必须设置 `CGO_ENABLED=1`。
### Debian / Ubuntu
```
dpkg -i torii__amd64.deb
```
## 性能
在 **树莓派 3**(4核 ARM,906 MB 内存)上通过完整的 HTTPS 中间件链路的测试结果:
| 并发数 | 请求/秒 | p50 | p99 |
|:-----------:|--------:|-------:|-------:|
| 10 | **663** | 12 ms | 98 ms |
| 100 | **656** | 146 ms | 359 ms |
**台式机** (AMD 9800X3D,32 GB 内存):
| 并发数 | 请求/秒 | p50 | p99 |
|:-----------:|-----------:|------:|-------:|
| 100 | **9,540** | 9 ms | 96 ms |
| 200 | **13,114** | 12 ms | 100 ms |
## 文档
- [配置与中间件参考](docs/configuration.md)
- [管理 API](docs/api.md)
## 待办事项
记录已完成和接下来要完成的内容。这不是路线图,只是我为这个项目做的个人备忘录。
### 仍需完善
- [ ] 创建 HTTP 代理 UI:目前功能可用,但用户体验需要再打磨一下
- [ ] ACME UI:需要为单个证书提供一个撤销按钮(虽然这可能会引发一些“有趣”的副作用),目前重置按钮的位置也不够合理
- [ ] 代理路由 UI:主机名应该是可点击的链接,并在新标签页中打开
### 即将开发
- [x] 滚动日志需要与指标系统解耦。目前指标中间件被用来追踪日志,但这感觉不太对,不够优雅,而且在全局中间件中引发了一些~~问题~~怪异行为。
- [ ] 使已启用的 API 服务器中间件能够通过配置文件进行完全配置
- [ ] TCP 代理:配置 schema 已经有了,但实现还没有
- [ ] UA 指纹轮换检测:在扫描过程中轮换 User-Agent 的机器人很容易被识别——真正的客户端不会在请求之间从 macOS 切换到 Linux 再切换到 Windows。跟踪每个 IP 的 UA 一致性,对那些操作系统/浏览器系列发生非自然快速变化的 IP 进行标记或拦截。我曾遇到一个在一次扫描中轮换了 20 多个 UA 的机器人,在几分钟内命中了 100 多个端点。蜜罐捕获了它,但这将增加一层针对 UA 轮换的防御。
- [ ] ForwardAuth 中间件:将认证决策委托给外部服务(类似于 Traefik 的 ForwardAuth / nginx 的 auth_request)
- [x] 根据IP或其他请求属性设置请求头(例如添加 `X-Client-IP` $remote_addr`),需要整理一份可被用作模板的有用属性列表
- [ ] 诱饵域名,例如 `admin.yourdomain.com`,这些域名没有任何理由接收任何流量,因此对它们的任何请求都将是非常可疑的。我可能会通过接入 DNS 提供商的集成来自动创建和移除这些诱饵域名,以便它们可以定期轮换。这将是一个抓取那些针对特定子域(如 `admin`、`dev`、`staging`)的机器人的绝佳方式,而不必在这些子域上暴露任何真实服务。额外的好处是它可以作为一个合法的 IP 陷阱,任何命中此域名的 IP 都会被立即封禁,有趣的是,在验证其是否合法之前,他们必须先建立连接,而我只需要在他们连接后将其封禁即可。
- [ ] CrowdSec 集成:使用流模式将 Torii 实现为 CrowdSec bouncer。通过长轮询访问 CrowdSec LAPI,使得 IP 检查变成纯粹的内存查询,没有逐请求的延迟。CrowdSec 作为独立的 daemon 运行,解析 Torii 的日志,并受益于社区拦截列表。包含两个方向:Torii 作为执行器(读取决策)和 Torii 作为传感器(向 CrowdSec 提供日志以进行场景检测)。
- [ ] 检测那些狡猾的访问者。大多数流量通过正确的规则都很容易捕获,但总会有一些机器人能够避过雷达。实现一个基于请求模式(如高请求率、异常路径、不一致的 UA)的“可疑活动”评分,并标记超过特定阈值的 IP 供人工审查。这将是一种捕获那些刚好能够避开陷阱但其行为仍然不像真实用户的机器人的方法。
- [ ] 主动后端健康检查,定期在后台探测后端,以便在真实流量受到影响之前将其标记为宕机,而不是完全依赖熔断器的被动故障检测。按后端配置:健康检查路径、间隔、超时以及在健康/不健康状态之间转换所需的连续失败/成功阈值。不健康的后端应当显示在仪表板中。健康检查状态和熔断器状态应共享相同的后端状态,这样它们才不会互相矛盾。
- [x] 内部事件总线,一个轻量级的发布/订阅主干,使得中间件和子系统可以发出和响应事件(请求被拦截、蜜罐被触发、后端下线、可疑 IP 被标记等)而无需直接耦合。这似乎是不可避免的,因为我不断看到到处都出现了对它的需求。这是让 CrowdSec 传感器模式、可疑活动评分、诱饵域名拦截(其中 IP 在中间件间共享)、UA 轮换检测以及告警/Webhook 等功能都能被干净利落地实现的前提。没有它,每一个新功能都需要直接深入到其他组件的内部。
### 已知问题
- [x] 随着标志 `--data-dir` 的引入,默认配置文件的位置现在相对于数据目录,然而,当通过 `--config` 指定配置文件时,路径并不会相对于数据目录进行解析,并且通过 UI 进行更改时,持久化位置是在数据目录。由于数据目录中没有配置文件,因此默认文件名 'torii-conf.yaml' 会被创建在数据目录中并持久化更改。在重启时,配置文件标志始终优先,所以如果使用了该标志,通过 UI 所做的更改就不会被加载。配置文件的位置在 CLI 和 UI 之间不一致。需要对此进行统一,使得配置文件位置存在单一事实来源,理想情况下 CLI 标志应当是事实来源,而 UI 应当持久化到该位置,无论它是默认路径还是自定义路径。这意味着如果配置文件被指定到了另一个位置,那么数据目录中将只包含 sqlite 数据库。
### 可能会做
- [ ] 代理级别的身份验证:提供登录页面,使代理在将流量转发给后端之前先处理身份验证
- [ ] 专属的 Tarpitting 中间件(与蜜罐欺骗模式区分开来)
- [ ] Anubis 集成(我非常想做这个,但考虑到 Anubis 拥有非常庞大的配置项,需要弄清楚如何最好地进行集成)
- [ ] Webhooks/告警:通过 Webhooks 或与 Slack/Discord 等服务的集成,对可疑活动、被封禁的 IP、后端健康状况变化等进行通知。
- [ ] JA3/JA4 指纹识别,目前还不确定这要如何应用,但如果能够对 TLS 客户端的 JA3/JA4 哈希进行指纹识别将会非常有意思,但是,这比做一个中间件要复杂得多,因为它需要深入到 TLS 握手层面。还不确定我能不能优雅地实现这个功能。
## 环境要求
- Go 1.26+
## 许可证
[GNU Affero General Public License v3.0](LICENSE)标签:ACME证书, CISA项目, DNS解析, EVTX分析, Go语言, IP封禁, Raspberry Pi, TLS终止, WAF, Web服务器, 内存执行, 单文件部署, 反向代理, 可视化面板, 地理封锁, 威胁情报, 安全网关, 密码管理, 开发者工具, 开源项目, 插件系统, 日志审计, 机器人防御, 程序破解, 端口扫描防御, 网络信息收集, 网络安全, 网络流量分析, 蜜罐, 证书利用, 请求拦截, 边缘计算, 防爬虫, 限流, 隐私保护, 零依赖