fabriziosalmi/zion

GitHub: fabriziosalmi/zion

基于 Rust 的高性能 TLS 反向代理与内置零正则 WAF 安全网关,兼顾极致吞吐与开箱即用的 Web 攻击防护。

Stars: 7 | Forks: 0

# Zion Edge Gateway [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/c8db8ec5a1111002.svg)](https://github.com/fabriziosalmi/zion/actions/workflows/ci.yml) [![版本](https://img.shields.io/github/v/release/fabriziosalmi/zion?include_prereleases&color=blue&label=release)](https://github.com/fabriziosalmi/zion/releases) [![许可证](https://img.shields.io/github/license/fabriziosalmi/zion)](https://github.com/fabriziosalmi/zion/blob/master/LICENSE) [![性能](https://img.shields.io/badge/Performance-233k%20req%2Fs-success?style=flat&color=brightgreen)](https://github.com/fabriziosalmi/zion/tree/master/benchmarks) [![WAF](https://img.shields.io/badge/WAF-Zero%20Regex-orange)](https://github.com/fabriziosalmi/zion/blob/master/src/waf.rs)

Zion boot output: live AES-GCM calibration, performance tier badge, routes table, and ready banner

用 Rust 编写的内置 WAF 的高性能 TLS 反向代理。 ## 性能 ### 原生基准测试 (Apple M4, Rust 后端, 5 次运行 x 10 秒, c=100) | 端点 | 中位数 req/s | 最佳运行 | CV% | 错误 | |----------|-------------|----------|-----|--------| | HTML SSR 5KB | **233,170** | 235,370 | 1.1% | 0 | | CSS 3KB (已缓存) | **209,573** | 215,408 | 3.4% | 0 | | 缓存命中 JS 4KB (RAM) | **195,318** | 207,521 | 7.1% | 0 | | TLS Proxy API GET 1KB | **106,505** | 107,189 | 2.1% | 0 | | WAF POST JSON | **103,206** | 103,547 | 0.5% | 0 | | JS 4KB (无缓存) | **102,892** | 104,135 | 1.3% | 0 | | PNG 8KB (无缓存) | **99,496** | 101,290 | 1.7% | 0 | | WOFF2 16KB (无缓存) | **83,870** | 86,242 | 2.5% | 0 | | SQLi 已拦截 | 是 (400) | -- | -- | -- | | XSS 已拦截 | 是 (400) | -- | -- | -- | **峰值**: 233K req/s HTML (TLS 1.3 e2e) -- 210K 缓存命中 -- 107K API 代理 -- 103K WAF POST (CV 0.5%) 复现命令:`bash benchmarks/bench-native.sh` ### 与 nginx 的公平对比 (Docker, 1 CPU, 256 MB) | 端点 | nginx 1.27 | Zion TLS | Zion WAF | Zion 完整模式 | 最佳差距 | 错误 | |---|---|---|---|---|---|---| | API GET (1KB) | 29,404 | 27,517 | 27,438 | 27,537 | -6.3% | 0 | | HTML (5KB) | 25,657 | 52,581 | 53,016 | 53,368 | **+108.0%** | 0 | | JS (4KB) | 23,152 | 18,165 | 18,037 | 32,366 | **+39.8%** | 0 | | PNG (8KB) | 17,409 | 13,411 | 14,345 | 24,770 | **+42.3%** | 0 | | WAF POST | 27,772 | 26,173 | 25,653 | 26,909 | -3.1% | 0 | | CSS 已缓存 | 27,436 | 16,800 | 14,949 | 25,111 | -8.5% | 0 | 完整测试方法:`bash benchmarks/bench-scientific.sh` (5 次运行, CI95)。
吞吐量矩阵 (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 |
## 功能特性 **核心代理** - 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
标签:API网关, AppImage, CISA项目, HTTP代理, Linux服务器, Rust, SQL注入防御, TLS, TLS 1.3, WAF, Web应用防火墙, Web服务器, XSS防御, 反向代理, 可视化界面, 缓存, 网关, 网关安全, 网络安全, 网络安全防护, 网络流量审计, 自定义请求头, 请求拦截, 边缘计算, 通知系统, 防御工具, 隐私保护, 零正则