searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

HTTP及HTTPS正向代理

2024-10-31 09:28:44
19
0

正向代理 (Forward Proxy) 是一种网络代理技术,通过它,客户端的请求首先被发送到代理服务器,再由代理服务器转发给目标服务器。使用正向代理的主要目的是突破局域网或防火墙的限制、隐藏真实 IP 地址、缓存访问资源等。正向代理主要支持两种协议:HTTPHTTPS

一、HTTP正向代理

1. 原理

HTTP 正向代理的工作流程如下:

  1. 客户端发送请求到代理服务器。
  2. 代理服务器根据请求内容将其转发到目标服务器。
  3. 目标服务器返回数据给代理服务器。
  4. 代理服务器将数据返回给客户端。

在 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 方法来处理加密流量:

  1. 客户端发送 CONNECT 请求到代理服务器,请求建立一个到目标服务器的 TCP 连接。
  2. 代理服务器创建到目标服务器的连接并返回连接成功消息。
  3. 客户端和目标服务器之间通过代理服务器传输加密的数据。

这种方式让代理服务器无法读取实际内容,只充当中转站。

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 代理,以确保数据的安全性和隐私性。

0条评论
作者已关闭评论
郑****辉
6文章数
0粉丝数
郑****辉
6 文章 | 0 粉丝
郑****辉
6文章数
0粉丝数
郑****辉
6 文章 | 0 粉丝
原创

HTTP及HTTPS正向代理

2024-10-31 09:28:44
19
0

正向代理 (Forward Proxy) 是一种网络代理技术,通过它,客户端的请求首先被发送到代理服务器,再由代理服务器转发给目标服务器。使用正向代理的主要目的是突破局域网或防火墙的限制、隐藏真实 IP 地址、缓存访问资源等。正向代理主要支持两种协议:HTTPHTTPS

一、HTTP正向代理

1. 原理

HTTP 正向代理的工作流程如下:

  1. 客户端发送请求到代理服务器。
  2. 代理服务器根据请求内容将其转发到目标服务器。
  3. 目标服务器返回数据给代理服务器。
  4. 代理服务器将数据返回给客户端。

在 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 方法来处理加密流量:

  1. 客户端发送 CONNECT 请求到代理服务器,请求建立一个到目标服务器的 TCP 连接。
  2. 代理服务器创建到目标服务器的连接并返回连接成功消息。
  3. 客户端和目标服务器之间通过代理服务器传输加密的数据。

这种方式让代理服务器无法读取实际内容,只充当中转站。

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 代理,以确保数据的安全性和隐私性。

文章来自个人专栏
代理
4 文章 | 1 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0