A lightweight HTTP fetch proxy designed to accelerate overseas downloads from a UNTOUCHABLE server.
| crossfetch | ||
| Caddyfile | ||
| README.md | ||
CrossFetch
A lightweight HTTP fetch proxy designed to accelerate overseas downloads from a UNTOUCHABLE server.
注意:本项目由openai codex加工优化 注意辨别
服务部署后,用户只需将原始 URL 按以下格式重写即可:
https://你的域名/https://目标域名/路径
Rust 服务会从境外拉取资源并流式回传,方便 wget、curl 等工具使用。
功能特性
- 支持
GET、HEAD,并自动跟随最多 10 次 3xx 跳转(由reqwest完成)。 - 透传常见请求/响应头(含
Range),允许断点续传与大文件分块下载。 - 可通过环境变量自定义监听地址、上游
User-Agent,便于与现有网络策略兼容。 - 提供 Caddy 反向代理示例,快速接入 HTTPS 与自动证书。
- 对 3xx 重定向自动重写
Location头,确保客户端继续通过自定义域名访问后续链接。 - SSRF 防护:自动阻止访问私网 IP(10.0.0.0/8、172.16.0.0/12、192.168.0.0/16、127.0.0.0/8 等)和私有域名(localhost、.local、.internal),防止服务器端请求伪造攻击。
- 域名白名单:可选配置允许访问的域名列表,增强安全性。
- 健康检查:提供
/health端点,便于容器编排工具监控服务状态。 - 连接池优化:内置连接复用和池化,提升大量并发请求的性能。
仓库结构
crossfetch/ # Rust 代理服务源码
README.md # 使用指南(当前文件)
Caddyfile # Caddy 反向代理示例
快速开始
环境需求
- Rust 1.79+(建议
rustup安装) - Caddy 2.x(可选,用于暴露 TLS 服务)
本地运行
cd crossfetch
cargo run --release
默认监听 0.0.0.0:3000。
环境变量
| 变量名 | 默认值 | 说明 |
|---|---|---|
BIND_ADDR |
0.0.0.0:3000 |
代理服务监听地址 |
UPSTREAM_USER_AGENT |
CrossFetch/0.1 (Rust HTTP Proxy) |
发往上游时使用的 UA |
ALLOWED_DOMAINS |
未设置(允许所有域名) | 域名白名单,多个域名用逗号分隔,例如 github.com,example.com |
使用示例
wget "https://xxx.com/https://github.com/user/project/releases/download/v1.0/app.tar.gz"
包含查询参数的 URL 建议整体加引号,或提前进行百分号编码:
curl -L "https://xxx.com/https://example.com/file%3Ftoken%3D123"
安全配置示例
启用域名白名单
仅允许代理特定域名,提升安全性:
# 设置白名单(仅允许 GitHub 相关域名)
export ALLOWED_DOMAINS="github.com,githubusercontent.com,github.io"
# 启动服务
cd crossfetch
cargo run --release
访问白名单内的域名:
# ✅ 成功 - github.com 在白名单中
wget "https://xxx.com/https://github.com/user/repo/archive/refs/tags/v1.0.tar.gz"
# ❌ 失败 - example.com 不在白名单中
wget "https://xxx.com/https://example.com/file.zip"
# 返回: 403 Forbidden: domain not allowed: example.com
健康检查
服务提供 /health 端点,用于监控和容器编排:
# 检查服务是否正常运行
curl http://localhost:3000/health
# 返回: OK (200)
在 Docker/Kubernetes 中使用:
# Kubernetes liveness probe 示例
livenessProbe:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 5
periodSeconds: 10
借助 Caddy 暴露 HTTPS
根目录提供 Caddyfile 示例,核心配置如下:
xxx.com {
encode gzip zstd
@proxy_methods {
method GET HEAD
}
handle @proxy_methods {
reverse_proxy 127.0.0.1:3000 {
flush_interval -1
transport http {
versions 1.1
keepalive 32
}
}
}
handle {
respond 405 {
body "405: method not allowed\n"
}
}
log {
output file /var/log/caddy/crossfetch.log {
roll_size 10mb
roll_keep 10
}
format single_field common_log
}
}
部署步骤:
- 保证 Rust 服务运行在
127.0.0.1:3000。 - 将域名
xxx.com解析到服务器公网 IP。 - 启动 Caddy:
sudo caddy run --config Caddyfile - 通过
https://xxx.com/https://github.com/...发起下载。
Caddy 会自动申请/续期证书,并提供访问日志,方便后续分析与审计。
安全与生产建议
- SSRF 防护(已内置):服务已内置 SSRF 保护机制,自动阻止访问:
- 私网 IPv4 地址:
10.0.0.0/8、172.16.0.0/12、192.168.0.0/16、127.0.0.0/8 - 链路本地地址:
169.254.0.0/16 - 私网 IPv6 地址:
::1、fe80::/10、fc00::/7等 - 私有域名:
localhost、*.local、*.internal - 组播和广播地址
- 私网 IPv4 地址:
- 限制可访问的目标域名:通过
ALLOWED_DOMAINS环境变量配置域名白名单,生产环境强烈建议启用。 - 控制带宽与并发:结合 Caddy
rate_limit、request_body插件或上游负载控制规则。 - 缓存/预热:对于热门文件,可结合对象存储或 CDN 减少重复拉取的消耗。
- 监控与日志:服务内置 tracing 日志,可通过
RUST_LOG环境变量调整日志级别(如RUST_LOG=info)。
后续路线
在响应阶段重写(已完成)Location头,确保多级跳转保持自定义域名内置 SSRF 防护机制(已完成)域名白名单支持(已完成)- 增强指标采集(Prometheus、OpenTelemetry),便于运维监控。
- 引入磁盘缓存或内存缓存模块,降低重复下载的压力。
欢迎提 Issue 或 PR,一起完善 CrossFetch。
更新日志
v0.1.1 (最新)
- ✅ 新增 SSRF 防护:自动阻止私网 IP 和私有域名访问
- ✅ 新增域名白名单功能(
ALLOWED_DOMAINS环境变量) - ✅ 新增
/health健康检查端点 - ✅ 优化连接池配置,提升并发性能
- ✅ 修复 Cargo.toml edition 配置错误
- ✅ 改进默认 User-Agent
- ✅ 增强错误处理和日志记录
- ✅ 新增安全功能相关测试用例
v0.1.0
- 初始版本发布