正向代理 (Forward Proxy) 是一种网络代理技术,通过它,客户端的请求首先被发送到代理服务器,再由代理服务器转发给目标服务器。使用正向代理的主要目的是突破局域网或防火墙的限制、隐藏真实 IP 地址、缓存访问资源等。正向代理主要支持两种协议:HTTP 和 HTTPS。
一、HTTP正向代理
1. 原理
HTTP 正向代理的工作流程如下:
- 客户端发送请求到代理服务器。
- 代理服务器根据请求内容将其转发到目标服务器。
- 目标服务器返回数据给代理服务器。
- 代理服务器将数据返回给客户端。
在 HTTP 代理中,数据传输是明文的,客户端和代理服务器之间、代理服务器和目标服务器之间的通讯都没有加密。这种代理适合于访问公开的数据资源,但不适用于敏感数据的传输。
2. 图示
Client --> HTTP Proxy Server --> Target Server
3. 示例代码
以下是一个使用 Golang 实现的简单 HTTP 正向代理的示例:
package main
import (
"fmt"
"io"
"net/http"
)
func handleRequestAndRedirect(res http.ResponseWriter, req *http.Request) {
// 复制客户端请求,设置目标 URL
request, err := http.NewRequest(req.Method, req.RequestURI, req.Body)
if err != nil {
http.Error(res, err.Error(), http.StatusInternalServerError)
return
}
request.Header = req.Header
// 发送请求到目标服务器
client := &http.Client{}
resp, err := client.Do(request)
if err != nil {
http.Error(res, err.Error(), http.StatusInternalServerError)
return
}
defer resp.Body.Close()
// 将目标服务器的响应返回给客户端
for k, v := range resp.Header {
res.Header()[k] = v
}
res.WriteHeader(resp.StatusCode)
io.Copy(res, resp.Body)
}
func main() {
fmt.Println("Starting HTTP Proxy server on :8080")
http.HandleFunc("/", handleRequestAndRedirect)
http.ListenAndServe(":8080", nil)
}
二、HTTPS正向代理
1. 原理
HTTPS 正向代理使用的是 CONNECT
方法来处理加密流量:
- 客户端发送
CONNECT
请求到代理服务器,请求建立一个到目标服务器的 TCP 连接。 - 代理服务器创建到目标服务器的连接并返回连接成功消息。
- 客户端和目标服务器之间通过代理服务器传输加密的数据。
这种方式让代理服务器无法读取实际内容,只充当中转站。
2. 图示
Client --(CONNECT Tunnel)-- HTTPS Proxy Server --(SSL/TLS Encrypted)-- Target Server
3. 示例代码
以下是一个支持 HTTPS 的 Golang 正向代理示例:
package main
import (
"crypto/tls"
"fmt"
"io"
"log"
"net"
"net/http"
)
// HTTPS 代理实现的函数
func handleHTTPS(res http.ResponseWriter, req *http.Request) {
// 代理接收到客户端的 CONNECT 请求
destConn, err := net.Dial("tcp", req.Host)
if err != nil {
http.Error(res, "连接目标服务器失败", http.StatusServiceUnavailable)
return
}
res.WriteHeader(http.StatusOK)
// 获取客户端连接的 TCP 套接字
clientConn, _, err := res.(http.Hijacker).Hijack()
if err != nil {
http.Error(res, "无法劫持连接", http.StatusInternalServerError)
return
}
go transfer(clientConn, destConn)
go transfer(destConn, clientConn)
}
func transfer(destination io.WriteCloser, source io.ReadCloser) {
defer destination.Close()
defer source.Close()
io.Copy(destination, source)
}
func main() {
fmt.Println("Starting HTTPS Proxy server on :8080")
// 设置代理的 HTTPS 处理函数
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
if r.Method == http.MethodConnect {
handleHTTPS(w, r)
} else {
http.Error(w, "仅支持 CONNECT 请求", http.StatusMethodNotAllowed)
}
})
// 开始监听并启动代理服务器
err := http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal("代理启动失败:", err)
}
}
三、HTTP 与 HTTPS 正向代理的区别
特性 | HTTP 正向代理 | HTTPS 正向代理 |
---|---|---|
通信协议 | HTTP | HTTPS |
安全性 | 明文传输,数据不加密 | 数据加密传输 |
数据隐私 | 代理服务器能看到请求内容 | 代理服务器无法看到加密内容 |
使用场景 | 用于一般网络访问,内容不涉及敏感数据 | 用于敏感信息的访问,如在线支付和机密数据传输 |
操作方法 | 直接转发请求并处理响应 | 使用 CONNECT 方法建立安全隧道 |
在使用正向代理时,特别是涉及敏感信息时,建议优先使用 HTTPS 代理,以确保数据的安全性和隐私性。