
# Huginn 代理
[](https://github.com/biandratti/huginn-proxy#license)
[](https://github.com/biandratti/huginn-proxy/actions/workflows/release.yml)
[](https://github.com/biandratti/huginn-proxy/actions/workflows/ci.yml)
[](https://github.com/biandratti/huginn-proxy/actions/workflows/security.yml)
[](https://github.com/biandratti/huginn-proxy/actions/workflows/audit.yml)
[](https://deps.rs/repo/github/biandratti/huginn-proxy)
[](https://codecov.io/gh/biandratti/huginn-proxy)
[](https://github.com/biandratti/huginn-proxy/releases)
[](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)
## 贡
欢迎贡献!请参阅我们的贡献指南了解详情。