Skip to content

基于Rust的正向代理、反向代理和静态资源托管。 forward proxy、reverse proxy and static file serving

License

Unknown, Unknown licenses found

Licenses found

Unknown
LICENSE
Unknown
LICENSE.BSD-2-Clause
Notifications You must be signed in to change notification settings

arloor/rust_http_proxy

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1,677 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Rust HTTP Proxy

Open in GitHub Codespaces Ask DeepWiki

一个基于 Rust 构建的高性能、多功能 HTTP 代理服务器,使用 hyperaxumrustls 实现。

✨ 核心特性

🚀 代理功能

  • 正向代理:支持 HTTP/HTTPS 代理,可通过用户名密码认证
  • 反向代理:支持灵活配置反向代理路由规则
  • 链式代理:通过 --forward-bypass-url 指定上游代理服务器
  • websocket: 正向代理和反向代理均支持websocket

📁 静态文件服务

  • 类 Nginx 托管:完整的静态资源托管能力
  • 压缩支持:自动 gzip 压缩,减少传输流量
  • 断点续传:支持 Accept-Ranges 和断点续传(单 range)
  • 防盗链:基于 Referer 请求头的图片防盗链功能

🔒 安全与加密

  • TLS 加密代理:支持 --over-tls 参数,对正向代理流量进行 TLS 加密
  • 自动证书加载:每天自动重新加载 TLS 证书,支持 ACME 证书自动续期,无需重启服务
  • 高匿代理:完整实现高匿代理,去除代理特征(详见高匿实现

📊 可观测性

  • Prometheus 集成:提供完整的 Prometheus metrics 导出
  • 网速监控:Linux 平台支持实时网卡流量监控(/net 路径)
  • eBPF 支持:可选 eBPF socket filter 进行高性能流量统计
  • Grafana 大盘:提供开箱即用的 Grafana 模板

🔧 其他特性

  • 多端口、多用户:支持同时监听多个端口,配置多个用户认证
  • 连接管理:10 分钟空闲自动关闭连接,节省资源
  • 跨平台:支持 Linux、macOS、Windows,提供 Windows 服务模式

安装使用

方式一:Linux AMD64 可执行文件

curl -SLf https://us.arloor.dev/https://github.com/arloor/rust_http_proxy/releases/download/latest/rust_http_proxy -o /tmp/rust_http_proxy
install /tmp/rust_http_proxy /usr/bin/rust_http_proxy
/usr/bin/rust_http_proxy -p 7788

方式二:Docker 运行(推荐)

# 标准版本
docker run --rm -it --net host --pid host quay.io/arloor/rust_http_proxy -p 7788

# eBPF 增强版本
docker run --rm -it --privileged --net host --pid host quay.io/arloor/rust_http_proxy:bpf_static -p 7788

💡 Docker 镜像通过 GitHub Actions 自动构建,始终保持最新版本

方式三:从源码编译

# 克隆仓库
git clone https://github.com/arloor/rust_http_proxy.git
cd rust_http_proxy

# 标准编译
cargo build --release

# eBPF 增强版本(需要额外依赖)
cargo build --release --features bpf_vendored

快速测试

启动服务后,使用 curl 测试:

# 测试正向代理(HTTP)
curl http://ip.im/info -x http://localhost:7788

# 测试正向代理(HTTPS + 认证)
curl https://ip.im/info -U "username:password" -x https://localhost:7788 --proxy-insecure

⚙️ 配置说明

命令行参数

$ rust_http_proxy --help
A HTTP proxy server based on Hyper and Rustls, which features TLS proxy and static file serving

Usage: rust_http_proxy [OPTIONS]

Options:
      --log-dir <LOG_DIR>
          [default: /tmp]
      --log-file <LOG_FILE>
          [default: proxy.log]
  -p, --port <PORT>
          可以多次指定来实现多端口
           [default: 3128]
  -c, --cert <CERT>
          [default: cert.pem]
  -k, --key <KEY>
          [default: privkey.pem]
  -u, --users <USER>
          默认为空,表示不鉴权。
          格式为 'username:password'
          可以多次指定来实现多用户
  -w, --web-content-path <WEB_CONTENT_PATH>
          静态文件托管的根目录
  -r, --referer-keywords-to-self <REFERER>
          Http Referer请求头处理
          1. 图片资源的防盗链:针对png/jpeg/jpg等文件的请求,要求Request的Referer header要么为空,要么包含配置的值
          2. 外链访问监控:如果Referer不包含配置的值,并且访问html资源时,Prometheus counter req_from_out++,用于外链访问监控
          可以多次指定,也可以不指定
      --never-ask-for-auth
          if enable, never send '407 Proxy Authentication Required' to client。
          当作为正向代理使用时建议开启,否则有被嗅探的风险。
      --allow-serving-network <CIDR>
          允许访问静态文件托管的网段白名单,格式为CIDR,例如: 192.168.1.0/24, 10.0.0.0/8
          可以多次指定来允许多个网段
          如未设置任何网段,则允许所有IP访问静态文件
  -o, --over-tls
          if enable, proxy server will listen on https
      --location-config-file <FILE_PATH>
          静态文件托管和反向代理的配置文件
      --enable-github-proxy
          是否开启github proxy
      --append-upstream-url <https://example.com>
          便捷反向代理配置
          例如:--append-upstream-url=https://cdnjs.cloudflare.com
          则访问 https://your_domain/https://cdnjs.cloudflare.com 会被代理到 https://cdnjs.cloudflare.com
      --forward-bypass-url <https://username:password@example.com:123>
          指定上游代理服务器
      --ipv6-first <IPV6_FIRST>
          优先使用 IPv6 进行连接。true表示IPv6优先,false表示IPv4优先,不设置则保持DNS原始顺序 [possible values: true, false]
  -h, --help
          Print help

🔐 TLS/SSL 配置

生成自签名证书(测试用)

openssl req -x509 -newkey rsa:4096 -sha256 -nodes \
  -keyout /usr/share/rust_http_proxy/privkey.pem \
  -out /usr/share/rust_http_proxy/cert.pem \
  -days 3650 \
  -subj "/C=cn/ST=hl/L=sd/O=op/OU=as/CN=example.com"

使用正式证书

生产环境建议使用以下方式获取正式证书:

  • 购买商业 TLS 证书
  • 使用 acme.sh 等工具申请 Let's Encrypt 免费证书

📂 静态文件托管配置

全局配置

通过 --web-content-path 参数指定默认静态资源目录:

rust_http_proxy -p 7788 --web-content-path /var/www/html

高级配置(基于域名和路径)

使用 --location-config-file 指定 YAML 配置文件,支持按域名、路径分别配置:

# 针对特定域名的配置
example.com:
  - location: / # URL 路径前缀,默认 /
    static_dir: /usr/share/nginx/html # 静态资源目录

# 对所有域名生效的配置
default_host:
  - location: /static
    static_dir: /var/www/static
  - location: /downloads
    static_dir: /var/www/downloads

🔄 反向代理配置

使用 --location-config-file 配置反向代理规则:

# 针对特定域名
api.example.com:
  - location: /api
    upstream:
      url_base: "https://backend.internal.com" # 上游服务器 URL
      version: "AUTO" # HTTP 版本: H1/H2/AUTO
      headers: # 可选:修改发送给上游的请求头
        Host: "#{host}" # #{host} 变量代表原始请求的 Host
        X-Custom-Header: "custom_value"

反向代理到上游的请求url构建方式如下:

let upstream_url = upstream.url_base.clone() + &path_and_query[location.len()..]; // upstream.url_base + 原始url_path去除location的部分

upstream 配置项说明

参数 说明 可选值
url_base 上游服务器的基础 URL 任意有效 URL
version HTTP 协议版本 H1H2AUTO(默认)
headers 覆盖/添加发送给上游的请求头 键值对,支持 #{host} 变量

🌐 内置反向代理功能

GitHub 资源代理

在国内无法访问 GitHub 时,可启用 GitHub 代理功能。通过在原始 URL 前添加 https://YOUR_DOMAIN 访问:

# 启动时添加参数
rust_http_proxy -p 7788 --enable-github-proxy

支持代理的 GitHub 域名:

  • raw.githubusercontent.com
  • github.com
  • gist.githubusercontent.com
  • gist.github.com
  • release-assets.githubusercontent.com
  • objects.githubusercontent.com

使用示例:

# 原始地址
https://raw.githubusercontent.com/user/repo/main/file.txt

# 代理后地址
https://YOUR_DOMAIN/https://raw.githubusercontent.com/user/repo/main/file.txt

快捷反向代理

通过 --append-upstream-url 快速配置反向代理:

rust_http_proxy -p 7788 --append-upstream-url=https://cdnjs.cloudflare.com

访问方式:

https://YOUR_DOMAIN/https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js

等价于以下 YAML 配置:

```yaml
default_host:
  - location: /https://cdnjs.cloudflare.com
    upstream:
      url_base: https://cdnjs.cloudflare.com
      version: AUTO

📊 可观测性与监控

Prometheus Metrics

本项目内置 Prometheus Exporter,通过 /metrics 端点暴露指标。

⚠️ 注意:如果设置了 --users 参数,访问 /metrics 时需要在 HTTP Header 中提供 Authorization,否则返回 401 UNAUTHORIZED

示例指标

# HELP req_from_out Number of HTTP requests received.
# TYPE req_from_out counter
req_from_out_total{referer="all",path="all"} 4

# HELP proxy_traffic num proxy_traffic.
# TYPE proxy_traffic counter
proxy_traffic_total 1048576
# EOF

Grafana 可视化

推荐使用官方提供的 Grafana Dashboard 模板,快速搭建监控大盘。

效果预览

Grafana Dashboard 1 Grafana Dashboard 2

实时网速监控(Linux)

在 Linux 平台运行时,访问 /net 路径可查看实时网卡流量监控。

效果预览

网速监控

🖥️ 客户端推荐

Clash 系列

作者自研客户端

🛠️ 高级功能

Cargo Features

本项目支持多种编译特性,可根据需求选择:

🔥 eBPF 增强(推荐)

使用 eBPF 技术统计网卡流量,提供更高性能和更详细的网络监控。

编译方式

cargo build --release --features bpf_vendored

系统依赖

Ubuntu 22.04:

apt-get install -y libbpf-dev bpftool cmake zlib1g-dev libelf-dev \
  pkg-config clang autoconf autopoint flex bison gawk make

CentOS Stream 9:

yum install -y libbpf zlib-devel elfutils-libelf-devel pkgconf-pkg-config \
  clang bpftool cmake autoconf gettext flex bison gawk make

⚠️ 注意:仅在 x86_64-unknown-linux-gnu 平台测试通过

🧠 Jemalloc 内存分配器

使用 jemalloc 替代系统默认内存分配器,提供更好的并发性能和减少内存碎片。

编译方式

cargo build --release --features jemalloc

特点

  • ✅ 更高的并发分配能力
  • ✅ 减少内存碎片
  • ⚠️ 会缓存更多内存,top 命令中 RES 值可能较高

🔐 AWS-LC-RS 加密后端

替换默认的 ring 加密库为 AWS 的 aws-lc-rs,提供更好的性能和 FIPS 合规性。

编译方式

cargo build --release --no-default-features --features aws_lc_rs

优势

  1. ⚡ 性能更优(Benchmark 测试
  2. 🏛️ 支持 FIPS 140-2 合规要求

额外依赖

apt-get install cmake  # Ubuntu/Debian
yum install cmake      # CentOS/RHEL

高匿代理实现

高匿代理(Elite Proxy)是指能够完全隐藏自身代理身份的代理服务器。本项目完整实现了高匿代理特性。

代理特征清除

普通代理服务器收到的 HTTP 请求具有以下特征,本项目已全部处理:

  1. 完整 URL 格式

    • ❌ 普通代理:Request Line 包含完整 URL(schema + host + path)
    • ✅ 高匿处理:转换为仅包含路径的标准格式
  2. Proxy-Connection 请求头

    • ❌ 普通代理:保留 Proxy-Connection
    • ✅ 高匿处理:自动删除
  3. Proxy-Authorization 请求头

    • ❌ 普通代理:保留 Proxy-Authorization
    • ✅ 高匿处理:自动删除

验证测试

使用 tcpdump 抓包验证,对比代理服务器和上游服务器收到的请求:

代理服务器收到的原始请求

代理服务器流量

上游 Nginx 服务器收到的处理后请求

Nginx 服务器流量

验证结论:Request URL 已转换为标准路径格式,Proxy-Connection 等代理特征头已被移除。

🐳 容器化开发

本地测试

# 清理构建缓存
cargo clean

# 编译 eBPF 增强版本
cargo build -r --features bpf_vendored

# 构建测试镜像
podman build . -f Dockerfile.test -t test --net host

# 运行测试容器
podman run --rm -it --privileged --net host --pid host test

🪟 Windows 服务模式

编译 Windows 服务版本

cargo build --bin rust_http_proxy_service --features winservice --release

安装与管理

使用 sc.exe

# 创建服务
sc.exe create rust_http_proxy binPath= "C:\path\to\rust_http_proxy_service.exe -p 7777 -u username:password"

# 启动服务
sc.exe start rust_http_proxy

# 设置自动启动
sc.exe config rust_http_proxy start= auto

# 停止服务
sc.exe stop rust_http_proxy

# 删除服务
sc.exe delete rust_http_proxy

使用 PowerShell Cmdlet

# 创建并配置服务
New-Service -Name "rust_http_proxy" `
  -BinaryPathName "C:\path\to\rust_http_proxy_service.exe -p 7777 -u username:password" `
  -StartupType Automatic `
  -Description "A HTTP proxy server based on Hyper and Rustls"

# 启动服务
Start-Service -Name "rust_http_proxy"

# 停止服务
Stop-Service -Name "rust_http_proxy"

# 删除服务
(Get-WmiObject -Class Win32_Service -Filter "Name='rust_http_proxy'").Delete()

# PowerShell 6.0+ 可使用
# Remove-Service -Name "rust_http_proxy"

📄 许可证

本项目采用双许可证:

🤝 贡献

欢迎提交 Issue 和 Pull Request!

📮 联系方式


⭐ 如果这个项目对你有帮助,请给一个 Star!

About

基于Rust的正向代理、反向代理和静态资源托管。 forward proxy、reverse proxy and static file serving

Topics

Resources

License

Unknown, Unknown licenses found

Licenses found

Unknown
LICENSE
Unknown
LICENSE.BSD-2-Clause

Stars

Watchers

Forks

Contributors 2

  •  
  •