CuriosityOS/AlturaProt

GitHub: CuriosityOS/AlturaProt

一款用 Rust 编写的 Layer 7 DDoS 防护反向代理,在进程内热路径上提供确定性的速率限制与请求验证,并辅以可选的带外 AI 分析层。

Stars: 0 | Forks: 0

AlturaProt

AlturaProt

一个使用 Rust 编写的 Layer 7 DDoS 防护反向代理。
在热路径中实现确定性缓解 —— AI 作为可选的、带外的精准层。

CI License: MIT Rust 2021 Platform: Linux PRs welcome

安装 · 工作原理 · CLI · 架构 · AI 提供商 · 运维

AlturaProt 是一个用 Rust 编写的 HTTP/1 和原始 TCP 反向代理,它确保每个 可用性决策都是**确定性的且在进程内完成** —— 令牌桶速率 限制、静态和自适应过滤器以及严格的请求验证全部在 热路径上运行,不依赖任何外部服务。一个可选的带外 分析器(**CodexSDGate**)将攻击遥测数据转化为狭窄、经过验证的过滤 规则,仅在实际攻击发生时调用 AI 提供商,否则使用 确定性的生成器。 ## 核心亮点 - **确定性的热路径** — 基于IP、签名、路径形状路由族、可信代理聚合以及全局令牌桶;有界的限制器状态,高基数轮换无法重置它;在扫描过滤器之前进行 `429` 丢弃。 - **严格的请求检查** — HTTP 方法和 Host 白名单,净化伪造的 `X-Forwarded-For`,对 header/body/trailer 的字节+字段+数量+时间限制,slowloris 和慢速读取/上传防护,以及 chunked / `Expect` / `Range` / `Accept-Encoding` 策略。 - **自适应学习过滤器** — 签名和路径形状规则保持休眠状态,在遭遇匹配的泛洪时通过滚动令牌桶激活,在压力下回收空闲窗口,并拒绝容易误操作的、针对全局 `/` 的封禁。 - **AI 是精准层,而非依赖项** — 代理绝不会在请求路径上调用 AI。CodexSDGate 离线学习过滤器,并且仅在攻击超过可调阈值(默认为 `20` 次真实攻击事件)时才调用提供商;低于该阈值时,它使用免费的确定性生成器。[详情 »](docs/AI_PROVIDERS.md) - **原始 TCP 代理** — 针对每个客户端前缀和全局的连接速率与并发限制,连接/空闲超时,可选的按方向最小数据速率防护,以及最大连接持续时间。 - **运维防护机制** — 配置预检会在值不安全时导致启动失败,`RLIMIT_NOFILE` 容量检查,带有轮转机制的有界 JSONL 事件日志,受令牌保护的 Prometheus 指标,以及主机边缘的 nftables/sysctl/systemd 模板。
详尽的控制列表 - HTTP/1 反向代理,具备针对客户端前缀、签名、路径形状路由族、可信代理聚合以及全局令牌桶的限制。 - 有界的速率限制器状态会驱逐过期的桶,但在分片已满时会拒绝新的活跃键,因此高基数轮换无法重置现有的热点 IP、签名或路径形状桶。 - HTTP 方法白名单,Host 标头验证,有界的可信 `X-Forwarded-For` 解析,转发的标头/客户端 IP 伪造净化,标准化的请求签名和路径形状速率限制(可折叠长动态 token 以及高置信度的短 token,同时不会合并诸如 `/api/v1` 和 `/api/v2` 的版本片段),针对单个父路由下短小写 token 轮换的有界兄弟节点流失限制,可信代理聚合速率与并发上限,默认禁用下游 keep-alive,针对慢速读取器的下游写入超时,原始的初始 HTTP/1 标头/分帧验证(带有增量分隔符扫描以及严格的字节、字段和数量上限),请求分帧验证,请求内容编码策略,默认拒绝 chunked 请求体但可选择开启,默认拒绝 `Expect` 但可选择开启 `100-continue`,有界的 `Range` 请求策略,默认剥离来源的 `Accept-Encoding` 但可选择透传,连接打开速率限制,活跃连接限制,分片化的 `SO_REUSEPORT` 接受套接字,上游并发请求数量上限,上游连接超时,基于路径形状的被动上游故障断路器,单连接请求数量上限,请求和上游响应标头的字节/字段/数量上限,分帧验证和超时,默认剥离 HTTP trailer 但可选择开启有界转发,请求/上游基于近期窗口的 body 最小数据速率防护,请求 body 防护机制,以及上游响应 body 防护机制。 - 速率受限的管理员健康检查和受令牌保护的 Prometheus 指标。 - 原始 TCP 代理,具备客户端前缀和全局连接速率限制、全局/客户端前缀并发连接上限、分片化的 `SO_REUSEPORT` 接受套接字、出站连接超时、空闲超时、可选的按方向最小数据速率防护以及最大连接持续时间。 - 运行时 `RLIMIT_NOFILE` 预检和容量验证,确保已配置的连接上限有明确的文件描述符下限支撑。 - 配置预检机制,拒绝过大/不规则/格式错误的配置输入以及超出范围的 DDoS 关键参数(速率限制、资源上限、标头/body/trailer/元数据上限、超时、连接生命周期、事件日志、自适应窗口、过滤器 TTL 边界、断路器设置、方法/Host 白名单、可信代理和管理员控制面设置),从而让不安全的值在启动时就失败,而不是静默地使保护失效;`0` 仍然是每个速率桶明确的禁用值。 - SIGINT/SIGTERM 关机处理,使得服务管理器的停止流程进入与 Ctrl-C 相同的监听器排空路径。 - 用于已知恶意 HTTP 模式的静态 JSON 过滤器,以及带有响应标头安全规则 ID、经过编译的标头/用户代理匹配数据、在请求路径上基于快照进行规则评估的有界且经过验证的静态/运行时过滤规则。 - 自适应学习过滤器保持休眠状态,通过滚动令牌桶计数器在匹配的泛洪期间激活,在容量压力下回收空闲的签名/路径形状窗口,保留最近的证据,并在分片的最近窗口已满时停止接收新的检测器键。 - 用于离线/近线分析的 JSONL 攻击事件日志,包含有界的用户可控字段,一个上限为 `8192` 个自有事件的有界非阻塞队列,工作端 JSON 序列化,有界的刷新频率,以及受字节数/备份数量上限限制的轮转。 - 可选的 CodexSDGate 分析器,使用您已经登录的订阅代理 CLI(Codex、Claude、OpenCode、Cursor、Grok —— 采用 T3 Code 的封装方式)或 API 密钥(OpenAI、Anthropic、Gemini、OpenRouter),将攻击日志转换为受限的自适应过滤规则。 - 主机边缘的 nftables/sysctl/systemd 模板,以及用于 L3/L4 和服务管理器兜底的验证预检,包括对动态 nftables SYN 速率和连接限制集的明确大小限制,以及对核心 ICMPv4/ICMPv6 控制流量的豁免。 - 仅限本地运行的基准测试/泛洪脚本,默认拒绝非回环(non-loopback)目标。
## 工作原理 ``` flowchart LR C(["Clients"]) -->|HTTP / TCP| AP subgraph AP ["AlturaProt · deterministic hot path"] direction TB RL["Rate limits
IP · signature · path-shape · global"] --> FW["Static + adaptive filters"] FW --> VAL["Request validation
+ connection guards"] end AP -->|allowed| ORIGIN(["Your origin"]) AP -.->|attack events| LOG[("JSONL event log")] LOG -.->|"out-of-band, threshold-gated"| CX["CodexSDGate analyzer
AI provider or deterministic"] CX -.->|learned filters| FW ``` 可用性首先由确定性控制来保护:令牌桶、静态 过滤器和学习到的自适应签名/路径形状 —— 全部在代理中运行, 能够立即丢弃匹配的流量。CodexSDGate 是精准 层:它从遥测数据中学习狭窄的过滤器,以便通过更少的 误报快速阻止重复攻击。对于在代理 检查流量之前就使链路饱和的容量型泛洪,请将其与上游/提供商的黑洞、 清洗、CDN/任播或路由器 ACL 结合使用 —— AlturaProt 为较小的 L3/L4 泛洪提供了主机边缘模板,但当管道本身 已满时,仍然需要提供商端的缓解措施。 ## 安装说明 只需一条命令即可安装所有内容 —— 它会为您的平台下载预编译的二进制文件(如果没有发布预编译版本或从代码库检出的情况下则从源码构建), 写入配置,并且(在 system 模式下)创建服务用户和 systemd unit。在 终端中,它还提供一个可选的 **AI Power Detection**(AI 强力检测)步骤,用于连接 AI 提供商以进行自适应过滤。 ``` # 系统安装,然后启用 + 启动服务 curl -fsSL https://raw.githubusercontent.com/CuriosityOS/AlturaProt/main/install.sh | sudo bash -s -- --start # 用户安装(无 root) curl -fsSL https://raw.githubusercontent.com/CuriosityOS/AlturaProt/main/install.sh | bash -s -- --user ```
使用代理安装(完全非交互式) 每个提示都有对应的标志,因此 AI 代理或 CI 任务只需一条命令即可完成安装并连接 AI。`--ai auto` 会选择您已有的任何工具 —— 第一个安装的代理 CLI(Codex、Claude、OpenCode、Cursor、Grok),如果没有,则选择第一个设置了 API 密钥环境变量的提供商: ``` # “安装 AlturaProt 并使用我已经配置好的任何 AI” curl -fsSL https://raw.githubusercontent.com/CuriosityOS/AlturaProt/main/install.sh \ | bash -s -- --user --ai auto --non-interactive # 显式选择 provider;从标准 env var 读取 key GEMINI_API_KEY=sk-... curl -fsSL .../install.sh \ | bash -s -- --user --ai gemini --non-interactive ``` 当没有终端时,也会自动隐含 `--non-interactive` 参数,因此 单行命令永远不会挂起。在订阅 CLI 和 API 密钥之间**没有功能差异** —— 两者都提供给同一个分析器。
或者从代码库检出安装: ``` git clone https://github.com/CuriosityOS/AlturaProt cd AlturaProt sudo ./install.sh --start # system mode: /usr/local/bin, /etc/altura-prot, systemd unit ./install.sh --user # user mode: ~/.local/bin, ~/.config/altura-prot ``` system 模式会创建 `altura-prot` 服务用户/组,并将配置写入 `/etc/altura-prot`。默认不设置 `admin_token`,因此受令牌保护的 metrics endpoint 将保持关闭,直到您设置它: ``` sudo altura-prot config set http.upstream http://127.0.0.1:9000 sudo altura-prot config set http.admin_token sudo systemctl restart altura-prot ``` ## CLI `altura-prot` 二进制文件也是一个管理 CLI: ``` altura-prot init # create config dir + default config (--system for /etc) altura-prot validate # validate the active config file altura-prot config show # print the resolved config as JSON altura-prot config get http.limits.per_ip_rps # read one value by dot path altura-prot config set http.admin_token # set one value (validated before write) altura-prot run # start the proxy altura-prot status # systemd or process status ``` `config set` 是原子操作:它会写入一个临时文件,对其进行验证,并且只有在成功时才将其重命名 到位,因此被拒绝的值永远不会替换掉正常的配置。当前 配置的解析顺序为 `--config`,然后是 `$ALTURA_PROT_CONFIG`、 `/etc/altura-prot/config.json`、`~/.config/altura-prot/config.json`,最后是 `configs/example.json`。 ## 快速开始(从源码) ``` cargo test cargo run --release -- --config configs/example.json ``` 在另一个终端中,运行一个源站并通过代理发送流量: ``` python3 -m http.server 9000 --bind 127.0.0.1 curl http://127.0.0.1:8080/ python3 tools/run_local_bench.py --duration 10 --workers 64 ``` ## AI 驱动的自适应过滤器 CodexSDGate 读取代理的攻击事件日志并写入 `runtime/filters.json`。 它仅在一个批次中包含至少 `--min-attack-events` 次 **真实攻击**事件(默认为 `20`)时才调用 AI 提供商 —— 这样 token 只会在真实攻击期间被消耗, 而不是在噪音上 —— 否则它会回退到确定性的生成器。 ``` python3 tools/ai_provider_cli.py login claude # or codex / opencode / cursor / grok / an API key python3 tools/codexsdgate.py --provider claude \ --events runtime/attack_events.jsonl --filters runtime/filters.json --once ``` 有关订阅 CLI 系列、OpenAI/Anthropic/Gemini/OpenRouter API 设置、触发阈值和可选的 systemd 定时器,请参阅 **[docs/AI_PROVIDERS.md](docs/AI_PROVIDERS.md)**。 ## 文档 | 文档 | 内容 | | --- | --- | | [架构](docs/ARCHITECTURE.md) | 热路径设计、限制器、过滤器、事件流水线 | | [运维](docs/OPERATIONS.md) | 安装、CLI、AI 步骤、systemd 定时器、强化 | | [AI 提供商](docs/AI_PROVIDERS.md) | 提供商系列、成本控制阈值、运行时契约 | | [基准测试](docs/BENCHMARKS.md) | 本地负载 + 边缘模板冒烟测试结果 | | [边缘防护](docs/EDGE_PROTECTION.md) | 主机边缘 nftables/sysctl/systemd 模板 | ## 安全说明 这是用于保护您所运营服务的防御性软件。请按照 **[SECURITY.md](SECURITY.md)** 私下报告 漏洞 —— 而不是作为公开的 issue。出于设计考虑,内置的泛洪工具会拒绝针对公共目标的测试。 ## 许可证 基于 [MIT License](LICENSE) 发布。

使用 Rust 构建 · 防御性安全工具 · 天生确定性

标签:DDoS防护, Docker 部署, Rust, 反向代理, 可视化界面, 时序数据库, 网络安全, 网络流量审计, 网络运维, 自定义请求头, 隐私保护