A lightweight HTTP fetch proxy designed to accelerate overseas downloads from a UNTOUCHABLE server.
Find a file
2026-01-10 20:53:32 +08:00
crossfetch feat: add SSRF protection, domain whitelist, and health check endpoint 2026-01-10 20:53:32 +08:00
Caddyfile add Caddyfile 2026-01-10 00:10:00 +08:00
README.md feat: add SSRF protection, domain whitelist, and health check endpoint 2026-01-10 20:53:32 +08:00

CrossFetch

A lightweight HTTP fetch proxy designed to accelerate overseas downloads from a UNTOUCHABLE server.

注意本项目由openai codex加工优化 注意辨别

服务部署后,用户只需将原始 URL 按以下格式重写即可:

https://你的域名/https://目标域名/路径

Rust 服务会从境外拉取资源并流式回传,方便 wgetcurl 等工具使用。

功能特性

  • 支持 GETHEAD,并自动跟随最多 10 次 3xx 跳转(由 reqwest 完成)。
  • 透传常见请求/响应头(含 Range),允许断点续传与大文件分块下载。
  • 可通过环境变量自定义监听地址、上游 User-Agent,便于与现有网络策略兼容。
  • 提供 Caddy 反向代理示例,快速接入 HTTPS 与自动证书。
  • 对 3xx 重定向自动重写 Location 头,确保客户端继续通过自定义域名访问后续链接。
  • SSRF 防护:自动阻止访问私网 IP10.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
    }
}

部署步骤:

  1. 保证 Rust 服务运行在 127.0.0.1:3000
  2. 将域名 xxx.com 解析到服务器公网 IP。
  3. 启动 Caddy
    sudo caddy run --config Caddyfile
    
  4. 通过 https://xxx.com/https://github.com/... 发起下载。

Caddy 会自动申请/续期证书,并提供访问日志,方便后续分析与审计。

安全与生产建议

  • SSRF 防护(已内置):服务已内置 SSRF 保护机制,自动阻止访问:
    • 私网 IPv4 地址:10.0.0.0/8172.16.0.0/12192.168.0.0/16127.0.0.0/8
    • 链路本地地址:169.254.0.0/16
    • 私网 IPv6 地址:::1fe80::/10fc00::/7
    • 私有域名:localhost*.local*.internal
    • 组播和广播地址
  • 限制可访问的目标域名:通过 ALLOWED_DOMAINS 环境变量配置域名白名单,生产环境强烈建议启用。
  • 控制带宽与并发:结合 Caddy rate_limitrequest_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

  • 初始版本发布