biandratti/huginn-proxy

GitHub: biandratti/huginn-proxy

基于 Rust 的高性能反向代理,通过被动采集 TLS/HTTP2/TCP 多维指纹并注入 Header,实现细粒度的机器人检测与流量分析。

Stars: 21 | Forks: 0

Huginn Proxy Logo # Huginn 代理 [![License](https://img.shields.io/badge/license-MIT%2FApache--2.0-blue.svg)](https://github.com/biandratti/huginn-proxy#license) [![Release](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/59b6c2f38f223606.svg)](https://github.com/biandratti/huginn-proxy/actions/workflows/release.yml) [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/ecac72c57e223608.svg)](https://github.com/biandratti/huginn-proxy/actions/workflows/ci.yml) [![Security](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/b6f55775ca223610.svg)](https://github.com/biandratti/huginn-proxy/actions/workflows/security.yml) [![Audit](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/a2472bfd9a223612.svg)](https://github.com/biandratti/huginn-proxy/actions/workflows/audit.yml) [![Pure Rust](https://img.shields.io/badge/pure-Rust-brightgreen.svg)](https://deps.rs/repo/github/biandratti/huginn-proxy) [![codecov](https://codecov.io/gh/biandratti/huginn-proxy/graph/badge.svg)](https://codecov.io/gh/biandratti/huginn-proxy) [![GitHub Release](https://img.shields.io/github/v/release/biandratti/huginn-proxy)](https://github.com/biandratti/huginn-proxy/releases) [![Docker](https://img.shields.io/badge/ghcr.io-huginn--proxy-blue?logo=docker)](https://github.com/biandratti/huginn-proxy/pkgs/container/huginn-proxy) **由 Huginn Net 驱动的高性能反向代理,具备被动指纹识别能力。**
## 概述 **Huginn Proxy** 是一个基于 [Tokio](https://tokio.rs)、[Hyper](https://hyper.rs) 和 [Rustls](https://github.com/rustls/rustls) 构建的反向代理。它将传入的连接路由到后端服务,同时被动提取 TLS (JA4)、HTTP/2 (Akamai) 和 TCP SYN (p0f 风格) 指纹并将其作为 Header 注入。TCP SYN 指纹识别通过使用 [Aya](https://aya-rs.dev) 的 XDP eBPF 程序实现。指纹识别库由 [Huginn Net](https://github.com/biandratti/huginn-net) 提供。 受生产级代理启发, 如 [Pingora](https://github.com/cloudflare/pingora)、[Sozu](https://github.com/sozu-proxy/sozu) 和 [rust-rpxy](https://github.com/junkurihara/rust-rpxy)。 ## 快速开始 请参阅 [`examples/`](examples/) 获取完整的设置指南,包括: - 从源码构建(标准模式以及带有 eBPF/TCP SYN 指纹识别) - 生成 TLS 证书 - 使用 Docker Compose 运行 - 配置示例(限速、路由等) ## 功能特性 - **HTTP/1.x & HTTP/2** - 完整支持两种协议版本 - **负载均衡** - 跨多个后端的轮询负载均衡 - **连接池** - 自动重用到后端的连接以减少延迟(为了指纹识别,按路由绕过池化) - **基于路径的路由** - 支持前缀匹配、路径剥离和路径重写的路由匹配 - **限速** - 采用令牌桶算法,支持多种策略(IP、Header、路由、组合),支持全局和 单路由限制 - **Header 操作** - 全局或按路由添加/删除请求/响应 Header,以实现安全和自定义 - **安全 Headers** - HSTS、CSP、X-Frame-Options 和自定义 Headers - **IP 过滤 (ACL)** - 支持 CIDR 表示法的白名单/黑名单 - **TLS 终结** - 服务端 TLS 支持 ALPN、证书热重载(每个配置单张证书) - **TLS 会话恢复** - 支持 TLS 1.2 会话 ID 和 TLS 1.3 会话票证 - **mTLS (双向 TLS)** - 客户端证书认证,用于安全的服务间通信 - **细粒度超时** - TLS 握手和连接处理超时,用于资源保护 - **Host Header 保留** - 可配置转发原始 Host Header 以支持虚拟主机 - **被动指纹识别** - 自动提取 TLS (JA4)、HTTP/2 (Akamai) 和 TCP SYN (通过 eBPF 的 p0f 风格) 指纹 - **X-Forwarded-* Headers** - 自动注入代理转发 Headers - **[全面遥测](TELEMETRY.md)** - Prometheus 指标覆盖请求、吞吐量、限速、TLS、 后端和安全功能 - **高性能** - 基于 Tokio 和 Hyper 构建 - **易于部署** - 单一二进制文件,Docker 就绪 有关每个功能的详细描述和限制,请参阅 [FEATURES.md](FEATURES.md)。 有关部署说明,请参阅 [DEPLOYMENT.md](DEPLOYMENT.md)。 ## 指纹识别 指纹会被自动提取并作为 Headers 注入: - **TLS (JA4)**: `x-huginn-net-ja4`: 排序后的密码套件和扩展,SHA-256 哈希。标准 FoxIO JA4。 使用 [huginn-net-tls](https://crates.io/crates/huginn-net-tls) - **TLS (JA4_r)**: `x-huginn-net-ja4_r`: 原始 ClientHello 顺序,SHA-256 哈希 (FoxIO JA4_r) - **TLS (JA4_o)**: `x-huginn-net-ja4_o`: 排序后,未经哈希的原始十六进制值 (FoxIO JA4_o,用于调试) - **TLS (JA4_or)**: `x-huginn-net-ja4_or`: 原始顺序,未经哈希的原始十六进制值 (FoxIO JA4_or) - **HTTP/2 (Akamai)**: `x-huginn-net-akamai`: 仅从 HTTP/2 连接中提取,使用 [huginn-net-http](https://crates.io/crates/huginn-net-http) - **TCP SYN (p0f 风格)**: `x-huginn-net-tcp` - 通过 eBPF/XDP 提取的原始 TCP SYN 签名 使用 [huginn-net-tcp](https://crates.io/crates/huginn-net-tcp)。需要 `tcp_enabled = true` 和 `ebpf-tcp` 功能。出现在连接的所有请求中(指纹在 TCP 接受时 捕获一次并重用)。**仅限 IPv4**,不会为直接的 IPv6 连接捕获(当负载均衡器通过 IPv4 内部转发时是透明的)。 有关设置、内核要求和部署选项,请参阅 [EBPF-SETUP.md](EBPF-SETUP.md)。 - 代理自动注入标准的 `X-Forwarded-*` Headers 以通知后端原始客户端请求: **示例:** ``` x-huginn-net-ja4: t13d3112h2_e8f1e7e78f70_b26ce05bbdd6, x-huginn-net-ja4_r: t13d3112h2_002f,0033,0035,0039,003c,003d,0067,006b,009c,009d,009e,009f,00ff,1301,1302,1303,c009,c00a,c013,c014,c023,c024,c027,c028,c02b,c02c,c02f,c030,cca8,cca9,ccaa_000a,000b,000d,0015,0016,0017,002b,002d,0031,0033_0403,0503,0603,0807,0808,0809,080a,080b,0804,0805,0806,0401,0501,0601,0303,0301,0302,0402,0502,0602, x-huginn-net-ja4_o: t13d3112h2_d7c3e2abb617_cad92ccb4254, x-huginn-net-ja4_or: t13d3112h2_1302,1303,1301,c02c,c030,009f,cca9,cca8,ccaa,c02b,c02f,009e,c024,c028,006b,c023,c027,0067,c00a,c014,0039,c009,c013,0033,009d,009c,003d,003c,0035,002f,00ff_0000,000b,000a,0010,0016,0017,0031,000d,002b,002d,0033,0015_0403,0503,0603,0807,0808,0809,080a,080b,0804,0805,0806,0401,0501,0601,0303,0301,0302,0402,0502,0602, x-huginn-net-ja4_r: t13d3112h2_d7c3e2abb617_cad92ccb4254, x-huginn-net-akamai: 3:100;4:10485760;2:0|1048510465|0|m,s,a,p, x-huginn-net-tcp: 4:64+0:0:1460:mss*44,10:mss,sok,ts,nop,ws:df,id+:0, x-forwarded-for: 172.18.0.1, x-forwarded-port: 50908, x-forwarded-proto: https, x-forwarded-host: localhost ``` 这些 Headers 始终覆盖任何客户端提供的值以防止欺骗。 ## 高级配置选项 ### 按路由设置 - **`fingerprinting`** (bool, 默认值: `true`) - 启用/禁用 TLS (JA4) 和 HTTP/2 (Akamai) 指纹提取和 Header 注入 - TLS 指纹在每个 TLS 会话中仅捕获 **一次**,并在该连接的所有 HTTP 请求中重用,这是设计使然。要观察每次连接的变化(例如 Chrome 的扩展顺序随机化),请设置 `alpn = ["http/1.1"]` 和 `keep_alive.enabled = false`;这仅用于调试,属于协议降级,不适合生产环境。 ## 健康检查端点 当配置了 `telemetry.metrics_port` 时,Huginn Proxy 会在可观测性服务器上暴露健康检查端点( 独立于主代理端口): - **`/health`** - 一般健康检查(如果进程正在运行则返回 `200 OK`) - **`/ready`** - 就绪检查(如果配置了后端则返回 `200 OK`,否则返回 `503`) - 用于 Kubernetes 就绪探针 - **`/live`** - 存活检查(如果进程正在运行则返回 `200 OK`) - 用于 Kubernetes 存活探针 - **`/metrics`** - Prometheus 指标端点 所有端点均返回 JSON 响应(返回 Prometheus 格式的 `/metrics` 除外),并遵循 Kubernetes 健康检查规范。 ## 性能 - **指纹识别开销**: ~2.2% (影响极小) - **并发连接**: 处理数千个并发连接 - **延迟**: 指纹提取的延迟为亚毫秒级 有关开发环境中的详细基准测试结果,请参阅 [`benches/README.md`](benches/README.md)。 ## 路线图 有关计划功能和即将推出阶段的详细列表,请参阅 [ROADMAP.md](ROADMAP.md)。 ## 容器和二进制文件矩阵
Docker 镜像 镜像发布到 `ghcr.io/biandratti/huginn-proxy` (`linux/amd64`, `linux/arm64`)。 | 镜像标签 | 基础镜像 | 用户 | eBPF | 能力 | |---|---|---|---|---| | `:latest` / `:v0.0.1-beta.1` | `debian:bookworm-slim` | `10001` | ✅ 读取固定映射 | `CAP_BPF` | | `:latest-plain` / `:v0.0.1-beta.1-plain` | `debian:bookworm-slim` | `10001` | ❌ | 无 | | `:latest-ebpf-agent` / `:v0.0.1-beta.1-ebpf-agent` | `debian:bookworm-slim` | `root` | ✅ 加载 XDP, 固定映射 | `CAP_BPF` + `CAP_NET_ADMIN` + `CAP_PERFMON` | 有关 Docker 和 Kubernetes 设置,请参阅 [DEPLOYMENT.md](DEPLOYMENT.md);有关 eBPF 运行时要求,请参阅 [EBPF-SETUP.md](EBPF-SETUP.md)。
发布二进制文件 | 产物 | 后缀 | OS | 架构 | libc | eBPF | |---|---|---|---|---|---| | `huginn-proxy` | `x86_64-unknown-linux-musl` | Linux | amd64 | musl (静态) | ❌ | | `huginn-proxy` | `aarch64-unknown-linux-musl` | Linux | arm64 | musl (静态) | ❌ | | `huginn-proxy` | `x86_64-unknown-linux-gnu-ebpf` | Linux | amd64 | glibc | ✅ (读取器) | | `huginn-proxy` | `aarch64-unknown-linux-gnu-ebpf` | Linux | arm64 | glibc | ✅ (读取器) | | `huginn-proxy` | `x86_64-apple-darwin` | macOS | amd64 | - | ❌ | | `huginn-proxy` | `aarch64-apple-darwin` | macOS | arm64 | - | ❌ | | `huginn-ebpf-agent` | `x86_64-unknown-linux-gnu-ebpf-agent` | Linux | amd64 | glibc | ✅ (加载器) | | `huginn-ebpf-agent` | `aarch64-unknown-linux-gnu-ebpf-agent` | Linux | arm64 | glibc | ✅ (加载器) | - musl (静态): 零运行时依赖,可在任何 Linux 内核和发行版上运行。 - glibc (eBPF): 从 Docker 镜像中提取,需要 glibc 和 Linux 内核 ≥ 5.11。
## 架构 有关模块结构和设计决策,请参阅 [ARCHITECTURE.md](ARCHITECTURE.md)。 | 指纹 | Header | 需要 eBPF 代理 | |---|---|---| | TLS (JA4) | `x-huginn-net-ja4` | 否 | | HTTP/2 (Akamai) | `x-huginn-net-akamai` | 否 | | TCP SYN (p0f) | `x-huginn-net-tcp` | **是** — 仅限 Linux, 内核 ≥ 5.11 |
TCP SYN 指纹识别 — 部署架构 ``` ┌─────────────────────────────────────────────────────────┐ │ Node │ │ │ │ ┌─────────────────────────┐ │ │ │ huginn-ebpf-agent │ CAP_BPF + CAP_NET_ADMIN │ │ │ │ + CAP_PERFMON │ │ │ XDP program (kernel) │ + seccomp:unconfined │ │ │ ┌─────────────────┐ │ + apparmor:unconfined │ │ │ │ tcp_syn_map │ │ (no open ports) │ │ │ │ syn_counter │ │ │ │ │ └────────┬────────┘ │ │ │ │ │ pin_maps() │ │ │ └───────────┼─────────────┘ │ │ │ /sys/fs/bpf/huginn/ │ │ ┌───────────┼─────────────┐ │ │ │ huginn-proxy (×N) │ CAP_BPF only │ │ │ │ │ seccomp: default │ │ │ ┌────────┴────────┐ │ USER 10001 │ │ │ │ from_pinned() │ │ │ │ │ │ map lookup │ │ │ │ │ └─────────────────┘ │ │ │ │ │ │ │ │ HTTP/TLS → backends │ │ │ │ x-huginn-net-tcp ──► │ │ │ └─────────────────────────┘ │ └─────────────────────────────────────────────────────────┘ ``` 代理每个节点加载一次 XDP 程序,并将 BPF 映射固定在 `/sys/fs/bpf/huginn/` 下。 多个代理副本以只读模式读取共享映射。
## 许可证 双重许可:[MIT](LICENSE-MIT) 或 [Apache 2.0](LICENSE-APACHE)。 ### 致谢 Huginn Proxy 使用 [Huginn Net](https://github.com/biandratti/huginn-net) 指纹识别库: - **JA4**: TLS 指纹识别遵循 [FoxIO, LLC 的 JA4 规范](https://github.com/FoxIO-LLC/ja4) - **Akamai HTTP/2**: HTTP/2 指纹识别遵循 [Blackhat EU 2017 规范](https://www.blackhat.com/docs/eu-17/materials/eu-17-Shuster-Passive-Fingerprinting-Of-HTTP2-Clients-wp.pdf) - **p0f v3**: TCP SYN 指纹识别遵循 [Michal Zalewski 的 p0f v3 规范](https://lcamtuf.coredump.cx/p0f3/README) ## 贡 欢迎贡献!请参阅我们的贡献指南了解详情。
标签:Akamai 指纹, C2日志可视化, DDoS 防护, Docker, Docker镜像, HTTP/2 指纹, Hyper, IP 地址批量处理, JA4, p0f, Rust, Rustls, TCP SYN 指纹, TLS 指纹, Tokio, XDP, 协议分析, 反向代理, 可视化界面, 后端转发, 域名收集, 安全防御评估, 指纹识别, 机器人检测, 权限提升, 网络安全, 网络流量审计, 被动探测, 请求拦截, 通知系统, 隐私保护, 零拷贝