#http-proxy #https-proxy #proxy-server

app rust-proxy

A simple HTTP/HTTPS proxy server written in Rust

1 unstable release

Uses new Rust 2024

new 0.1.0 Mar 13, 2026

#9 in #https-proxy

MIT/Apache

28KB
420 lines

Rust HTTP/HTTPS 代理服务器

一个用Rust实现的简单HTTP/HTTPS代理服务器。

功能特性

  • 支持HTTP/1.1代理
  • 支持HTTPS代理(通过CONNECT隧道)
  • 支持请求转发和响应返回
  • 简单的TCP层代理实现
  • 命令行参数配置
  • 自动解析目标地址
  • 支持HTTP和HTTPS协议自动检测

三种实现方式

项目包含三种代理实现:

  1. 主代理服务器 (src/main.rs): 支持HTTP和HTTPS的完整代理实现
  2. 简单代理服务器 (src/simple_proxy.rs): 更简单的TCP层代理实现
  3. HTTPS代理服务器 (src/https_proxy.rs): 专注于HTTPS支持的代理实现

使用方法

1. 构建项目

cargo build --release

2. 启动主代理服务器(支持HTTP和HTTPS)

默认监听 127.0.0.1:8080

cargo run --release

或指定监听地址:

cargo run --release -- --listen 0.0.0.0:8080

3. 启动简单代理服务器

cargo run --bin simple_proxy --release

4. 启动HTTPS代理服务器

cargo run --bin https_proxy --release

5. 启动高级HTTPS代理服务器

cargo run --bin https_proxy --release -- --https

6. 配置客户端使用代理

使用 curl 测试HTTP:

curl -x http://127.0.0.1:8080 http://httpbin.org/get

使用 curl 测试HTTPS:

curl -x http://127.0.0.1:8080 https://httpbin.org/get

使用环境变量:

# Linux/macOS
export http_proxy=http://127.0.0.1:8080
export https_proxy=http://127.0.0.1:8080

# Windows
set http_proxy=http://127.0.0.1:8080
set https_proxy=http://127.0.0.1:8080

然后使用curl测试:

# 测试HTTP
curl http://httpbin.org/get

# 测试HTTPS
curl https://httpbin.org/get

7. 运行测试脚本

Linux/macOS:

chmod +x test_proxy.sh
./test_proxy.sh

Windows:

test_proxy.bat

命令行参数

主代理服务器支持以下参数:

--listen <LISTEN>    代理服务器监听的地址 [默认值: 127.0.0.1:8080]
-h, --help          显示帮助信息
-V, --version       显示版本信息

项目结构

src/
  main.rs          主代理服务器实现
  simple_proxy.rs  简单代理服务器实现
examples/
  test_client.rs   测试客户端示例
Cargo.toml         项目配置和依赖
README.md          项目说明
config.example.toml 配置文件示例
test_proxy.sh      Linux/macOS测试脚本
test_proxy.bat     Windows测试脚本

依赖库

  • tokio: 异步运行时
  • clap: 命令行参数解析
  • rustls: TLS加密库
  • tokio-rustls: 异步TLS支持
  • webpki: 证书验证
  • webpki-roots: 根证书库

工作原理

HTTP代理工作原理:

  1. 代理服务器监听指定端口
  2. 收到客户端HTTP请求后,解析请求头和目标URL
  3. 建立到目标服务器的TCP连接
  4. 转发客户端请求到目标服务器
  5. 将目标服务器的响应返回给客户端
  6. 在客户端和目标服务器之间双向转发数据

HTTPS代理工作原理:

  1. 客户端发送CONNECT请求到代理服务器(如 CONNECT example.com:443 HTTP/1.1
  2. 代理服务器解析CONNECT请求中的目标地址
  3. 代理服务器建立到目标服务器的TCP连接
  4. 代理服务器返回 200 Connection Established 响应给客户端
  5. 客户端开始TLS握手,与目标服务器建立加密连接
  6. 代理服务器在客户端和目标服务器之间透明转发加密数据

支持的请求类型

  • HTTP请求: GET, POST, HEAD, 其他HTTP方法
  • HTTPS请求: 通过CONNECT隧道建立加密连接

目标地址解析

代理服务器会自动从以下位置解析目标地址:

  1. HTTP请求的 Host
  2. 请求行中的URL(如 GET http://example.com/pathGET https://example.com/path
  3. CONNECT请求中的目标地址(如 CONNECT example.com:443

HTTPS支持说明

CONNECT隧道方法

这是标准的HTTPS代理工作方式:

  1. 客户端发送 CONNECT 请求到代理
  2. 代理建立到目标服务器的TCP连接
  3. 代理返回成功响应
  4. 客户端与目标服务器直接进行TLS握手
  5. 代理透明转发加密数据

优点:

  • 代理不需要处理TLS加密/解密
  • 客户端和目标服务器的通信保持端到端加密
  • 符合HTTP代理标准

注意事项:

  • HTTPS代理使用CONNECT隧道,代理只看到加密数据
  • 需要客户端支持HTTP代理协议
  • 默认HTTPS端口是443
  • 建议在测试环境中使用
  • 生产环境需要添加更多安全性和性能优化

测试网站

可以使用以下网站测试代理功能:

Dependencies

~19–33MB
~473K SLoC