# 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. 构建项目
```bash
cargo build --release
```
### 2. 启动主代理服务器(支持HTTP和HTTPS)
默认监听 `127.0.0.1:8080`:
```bash
cargo run --release
```
或指定监听地址:
```bash
cargo run --release -- --listen 0.0.0.0:8080
```
### 3. 启动简单代理服务器
```bash
cargo run --bin simple_proxy --release
```
### 4. 启动HTTPS代理服务器
```bash
cargo run --bin https_proxy --release
```
### 5. 启动高级HTTPS代理服务器
```bash
cargo run --bin https_proxy --release -- --https
```
### 6. 配置客户端使用代理
#### 使用 curl 测试HTTP:
```bash
curl -x http://127.0.0.1:8080 http://httpbin.org/get
```
#### 使用 curl 测试HTTPS:
```bash
curl -x http://127.0.0.1:8080 https://httpbin.org/get
```
#### 使用环境变量:
```bash
# 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测试:
```bash
# 测试HTTP
curl http://httpbin.org/get
# 测试HTTPS
curl https://httpbin.org/get
```
### 7. 运行测试脚本
#### Linux/macOS:
```bash
chmod +x test_proxy.sh
./test_proxy.sh
```
#### Windows:
```bash
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/path` 或 `GET 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
- 建议在测试环境中使用
- 生产环境需要添加更多安全性和性能优化
## 测试网站
可以使用以下网站测试代理功能:
- http://httpbin.org/get - 返回请求信息
- http://example.com - 简单的示例网站
- http://httpbin.org/headers - 返回请求头信息