fabriziosalmi/zion
GitHub: fabriziosalmi/zion
基于 Rust 的高性能 TLS 反向代理与内置零正则 WAF 安全网关,兼顾极致吞吐与开箱即用的 Web 攻击防护。
Stars: 7 | Forks: 0
# Zion Edge Gateway
[](https://github.com/fabriziosalmi/zion/actions/workflows/ci.yml)
[](https://github.com/fabriziosalmi/zion/releases)
[](https://github.com/fabriziosalmi/zion/blob/master/LICENSE)
[](https://github.com/fabriziosalmi/zion/tree/master/benchmarks)
[](https://github.com/fabriziosalmi/zion/blob/master/src/waf.rs)
## 功能特性
**核心代理**
- TLS 1.3 终止 (rustls + 硬件加密: AES-NI, AES-CE)
- HTTP/2 上游多路复用 (hyper-rustls ALPN 协商)
- 多 SNI 支持按域证书和 FNV 哈希查找
- 零停机 TLS 和 QUIC 热重载 (ArcSwap + watch channels)
- 零停机配置热重载 — `zion.toml` 的更改(路由、上游、WAF 配置、CORS、速率限制、XFF 策略、受信任代理、**监听端口**)将原子交换到正在运行的进程中。监听器重绑定:编辑 `[server.listen_*]` 并保存后,守护进程将绑定新地址并排空旧地址,且不会丢弃进行中的连接。无效配置和绑定失败将被拒绝;先前的状态将继续保留。通过 Prometheus 和 `/_zion/snapshot.json` 暴露代计数器。详见 [`docs/deploy/hot-reload.md`](https://fabriziosalmi.github.io/zion/deploy/hot-reload)。
- 会话票据 + 带 method gating 的 0-RTT 早期数据 (425 Too Early, RFC 8470)
- 通过 `instant-acme` 自动续签 ACME (HTTP-01, `--features acme`)
- JWT/OIDC 认证网关 (`--features auth`)
- HTTP/1.1, HTTP/2, HTTP/3 QUIC (`--features http3`)
- WebSocket 代理 (HTTP Upgrade + 双向管道, TLS 到上游)
- SSE 流式代理 (零缓冲)
**缓存**
- 两级 RAM 缓存:L1 线程本地 (O(1) LRU, 侵入式链表) + L2 DashMap
- L1/L2 基于世代的连贯性(更新后无陈旧数据)
- 请求合并 (singleflight):N 个并发缓存未命中 → 1 次上游获取(基于 `tokio::sync::watch`,即使在获取器于 subscribe 和 await 之间完成时也无竞争)
- 线程本地路由 LRU(FNV 哈希,O(1) get/insert/evict — 每个工作线程 256 条记录的容量)
- 启动时连接池预热
**WAF (零正则, O(N) 单次通过)**
- 包含两个模式集的 Aho-Corasick 扫描器:
- `balanced`(默认):约 120 个高精度模式 — 锚定 SQLi/XSS/CMDi、特定 SSRF 端点、CVE 级字符串 (Log4Shell, XXE)
- `aggressive`(通过 `mode = "aggressive"` 选择启用):增加约 70 个广泛子字符串模式(`alert(`, `eval(`, `$gt`, `os.system(`, 通用事件处理程序)以提高管理/内部路由的召回率
- 香农熵分析(默认 6.5 bits/byte;对于 JSON,仅在字符串字面量上计算)。可通过配置阈值及按配置的 kill-switch 调整。
- simd-json 结构验证(深度 + 字符串长度限制)
- Content-Type 严格验证及分隔符强制
- Body 大小限制,DELETE body 检查
- 迭代规范化(URL 解码、SQL 注释、JSON unicode 转义)
- mTLS 转发标头:`X-Client-Cert-Fingerprint: sha256:HEX`(叶节点 DER 的 SHA-256)
- 出站 `X-Forwarded-For` 策略:`append`(默认)、`rewrite`(单个受信条目)、`drop`
**安全性**
- HSTS(2 年,includeSubDomains,preload)、X-Content-Type-Options、X-Frame-Options
- Referrer-Policy、Permissions-Policy、按路由的 CSP
- Server 标头已剥离,逐跳标头已剥离 (RFC 7230)
- URI 长度限制(8 KB 路径+查询),方法白名单(7 种方法)
- 按 IP 的速率限制(无锁原子,可配置窗口)
- CORS,带有 FNV O(1) 源查找,不区分大小写 (RFC 6454)
- TLS 握手超时(10 秒),连接超时(H2/WS/SSE 为 1 小时)
- 标头炸弹防护(64 个标头,16 KB 缓冲区)
**可观测性**
- `/healthz`、`/readyz` 内联快速路径(~1us,绕过完整管道)
- `/metrics` Prometheus 文本格式(无锁分片计数器,差分直方图)
- `X-Request-ID`(栈缓冲,零分配)+ W3C `traceparent` 传播
- 结构化日志(文本或 JSON)
**运维**
- 启动时配置验证(快速失败,验证所有配置文件引用)
- 关闭时优雅排空(30 秒超时,信号量跟踪)
- 上游健康检查(30 秒间隔,EWMA 延迟,灰度故障检测)
- 启动引导自动检测(CPU 核心、RAM、L1d 缓存、AES-NI/NEON、内核功能)
- 启动时的性能层级徽章(S/A/B/C 级,带有实时的 AES-GCM 校准)
- 实时 TUI 仪表盘(`zion top`,可选 `--features tui`)
- 交互式引导向导(`zion init`,可选 `--features init`)
- 一次性开发模式(`zion auto --upstream :3000`,可选 `--features init`)
- 环境诊断(`zion doctor`,始终可用)
- 用于 CI/自动化的平台 JSON 导出(`zion bootstrap`)
- WAF 影子模式(`waf_shadow = true`)— 仅记录并计数,永不拦截
- JSON 快照端点(`/_zion/snapshot.json`,仅限内部)
- TCP 调优:TCP_NODELAY, TCP_DEFER_ACCEPT, TCP_FASTOPEN, TCP_QUICKACK, TCP_CORK, SO_BUSY_POLL
- SO_REUSEPORT, sys_membarrier, io_uring multishot accept (Linux)
- `target-cpu=native` 构建优化,包含 PGO 构建脚本
- systemd unit 文件 + Docker HEALTHCHECK
## 快速开始
最快路径 — 仅需一条命令即可在开发后端前启用 TLS 代理:
```
cargo build --release --features init,tui
./target/release/zion auto --upstream :3000 # generates ephemeral cert + config, runs daemon
```
零配置,30 秒完成生产级调优设置:
```
./target/release/zion init # interactive wizard: detects local ports, generates zion.toml + self-signed cert
./target/release/zion doctor # environment check (fd limit, kernel, AES, port-bind perms)
./target/release/zion bootstrap # dump detected platform as JSON (CI / Ansible / Terraform)
ZION_CONFIG=zion.toml ./target/release/zion # run
./target/release/zion top # live dashboard (in another terminal)
```
对于自动化 / CI / 容器初始化,向导可无人值守运行:
```
./zion init -y \
--hostname api.example.com \
--upstream backend=127.0.0.1:8000 \
--upstream frontend=127.0.0.1:3000
```
构建版本:
```
cargo build --release # bare daemon, lean binary
cargo build --release --features init # + zion init wizard with cert generation
cargo build --release --features tui # + zion top live dashboard
cargo build --release --features acme # + Let's Encrypt auto-renewal
cargo build --release --features io-uring-accept # Linux 5.19+: multishot accept
```
## 实时仪表盘 (`zion top`)
Zion 守护进程运行后,`zion top` 将打开一个类似 htop 风格的 TUI,展示流量
计数器、延迟分位数 (p50/p95/p99)、状态码分类分布、缓存命中率、
RPS 走势图以及每个上游的健康状况。
```
# 与守护进程相同的主机(默认 URL 为 http://127.0.0.1:80/_zion/snapshot.json)
zion top
# 自定义端点和轮询间隔
zion top --url http://10.0.0.5:80/_zion/snapshot.json --interval 250
```
该仪表盘会轮询 `/_zion/snapshot.json`,这是一个仅限内部的 JSON 端点,
它通过分位数 + 平台信息来镜像 `/metrics`。它同时服务于 HTTP
和 HTTPS 监听器以供回环使用者访问;非内部 IP 将收到 403。
按键:`q` 退出 · `p` 暂停 · `r` 重绘。
## 配置
```
[server]
listen_http = "0.0.0.0:80"
listen_https = "0.0.0.0:443"
# Outbound X-Forwarded-For 策略:"append"(默认)、"rewrite"、"drop"。
# 当 Zion 处于最前端时使用 "rewrite" —— 它会剥离入站的 XFF 并
# 发出一个单一的可信条目(解析后的客户端 IP)。
xff_mode = "append"
[tls]
cert_path = "/etc/ssl/zion/tls.crt"
key_path = "/etc/ssl/zion/tls.key"
[upstreams]
backend = "http://127.0.0.1:8000"
frontend = "http://127.0.0.1:3000"
# WAF profile(命名,可按路由分配)。模式 "balanced" 是
# 高精度的默认设置;"aggressive" 添加了广泛的子串模式
# 以实现更高的召回率(以及更高的误报率)。
[waf_profile.api]
mode = "balanced"
max_body_mb = 10
entropy_check = true
entropy_threshold = 6.5
[[route]]
path = "/api/{*rest}"
upstream = "backend"
waf_profile = "api"
[[route]]
path = "/_next/static/{*rest}"
upstream = "frontend"
mode = "static_cache"
[[route]]
path = "/{*rest}"
upstream = "frontend"
```
完整配置参考请见 [zion.example.toml](zion.example.toml)。
## 架
```
Client -> TLS 1.3 -> Security Gates -> Radix Router -> WAF Pipeline (5 gates) -> Proxy/Cache -> Upstream
| |
URI limit Aho-Corasick (~120 balanced / ~190 aggressive)
Method whitelist Entropy analysis (JSON-string-only)
Rate limiter simd-json validation
CORS pre-flight Depth/size limits
```
21 个模块,约 15,900 行 Rust 代码。完整模块图和请求生命周期请参见[架构文档](https://fabriziosalmi.github.io/zion/guide/architecture)。
## 基准测试
```
# 原生科学基准测试(8 个端点 x 5 次运行,约 8 分钟)
bash benchmarks/bench-native.sh
# Payload x 并发矩阵(36 个单元,约 15 分钟)
bash benchmarks/bench-matrix.sh
# 快速验证(约 2 分钟)
bash benchmarks/bench-matrix.sh --quick
# Docker 对比 vs nginx(5 次运行,CI95)
bash benchmarks/bench-scientific.sh
# PGO 优化构建(+10-20%)
bash benchmarks/bench-pgo.sh
```
结果保存至 `benchmarks/bench-history.json` 并自动进行增量比较。
## 测试
```
# 单元测试 (300)
cargo test
# 集成测试 (19 -- 需要运行 Zion + 后端)
# 1. cd benchmarks/backend && cargo run --release &
# 2. ZION_CONFIG=tests/zion-test.toml ./target/release/zion &
# 3. 运行:
cargo test --test integration -- --ignored --test-threads=1
```
## 更新日志
完整发布历史请参见 [CHANGELOG.md](CHANGELOG.md)。
## 许可证
MIT
吞吐量矩阵 (Apple M4, Go 后端, TLS 1.3, wrk)
有效载荷 x 并发数网格 -- 测量端到端 TLS 吞吐量。这些数据使用 Go 后端(上限低于上述 Rust 后端)。 | 模式 | 有效载荷 | c=1 | c=10 | c=100 | |---|---|---|---|---| | **动态** (Go 后端) | 1 MB | 2,067 | 3,491 | 3,138 | | | 10 MB | 323 | 406 | 203 | | | 100 MB | 9,334 | 22,758 | 18,865 | | **静态** (未缓存代理) | 1 MB | 14,328 | 35,543 | 46,416 | | | 10 MB | 11,889 | 41,116 | 53,144 | | | 100 MB | 15,669 | 46,118 | 39,295 | | **内存缓存** (L1+L2) | 1 MB | 30,247 | 88,181 | **140,301** | | | 10 MB | 33,781 | 80,246 | 123,936 | | | 100 MB | 36,067 | 90,091 | 96,706 |标签:API网关, AppImage, CISA项目, HTTP代理, Linux服务器, Rust, SQL注入防御, TLS, TLS 1.3, WAF, Web应用防火墙, Web服务器, XSS防御, 反向代理, 可视化界面, 缓存, 网关, 网关安全, 网络安全, 网络安全防护, 网络流量审计, 自定义请求头, 请求拦截, 边缘计算, 通知系统, 防御工具, 隐私保护, 零正则