Go语言实现HTTP正向代理

文章目录

前言

正向代理(Forward Proxy)是一种代理服务器的部署方式,它位于客户端和目标服务器之间,代表客户端向目标服务器发送请求。正向代理可以用来隐藏客户端的真实身份,以及在不同网络环境下实现访问控制、负载均衡、缓存、访问优化等功能

实现思路

使用Go启动一个HTTP服务器,接收到客户端的请求后,使用服务器发送客户端的请求,然后将响应结果返回给客户端

代码实现

go 复制代码
package main

import (
	"context"
	"io"
	"log"
	"net"
	"net/http"
	"strings"
)

type ForwardProxy struct {}

func (p *ForwardProxy)ServeHTTP(w http.ResponseWriter, r *http.Request){
	transport := http.DefaultTransport

	// 拷贝一个request 对象,避免后续修影响了源对象
	req := r.Clone(context.Background())
	
	// 设置X-Forward-For 头部
	// X-Forward-For 字段的值是一个逗号分隔的 IP 地址列表
	// 列表中的第一个 IP 地址通常是客户端的真实 IP 地址,后续的 IP 地址则是代理服务器或负载均衡器的地址
	if clientIp , _ , err := net.SplitHostPort(r.RemoteAddr); err == nil{
		if prior, ok := req.Header["X-Forward-For"]; ok {
			clientIp = strings.Join(prior, ", ") + ", " + clientIp
		}
		req.Header.Set("X-Forward-For", clientIp)
	}

	// 构造新请求
	response,err:=transport.RoundTrip(req)
	if err != nil {
		w.WriteHeader(http.StatusInternalServerError)
		return
	}

	// 获取响应数据并返回
	for k,v := range response.Header{
		for _,v1 := range v{
			w.Header().Add(k,v1)
		}
	}
	w.WriteHeader(response.StatusCode)
	io.Copy(w,response.Body)
	response.Body.Close()
}

var serverAddr = ":8888"

func main() {
	server := &http.Server{
		Addr: serverAddr,
		Handler: &ForwardProxy{},
	}

	if err := server.ListenAndServe(); err != nil{
		log.Fatal("HTTP forward proxy failed to start.")
	}
}
相关推荐
会编程的土豆3 小时前
洛谷题单入门1 顺序结构
数据结构·算法·golang
合天网安实验室6 小时前
记录一个免杀的php webshell demo
渗透测试·php·webshell·免杀
AnalogElectronic6 小时前
linux 测试网络和端口是否连通的命令详解
linux·网络·php
Rust研习社7 小时前
使用 Axum 构建高性能异步 Web 服务
开发语言·前端·网络·后端·http·rust
灰子学技术7 小时前
Envoy HTTP 流量层面的 Metric 指标分析
网络·网络协议·http
跨境数据猎手8 小时前
跨境独立站系统技术拆解(附带源码)
服务器·前端·php
TimeAground8 小时前
HTTP 协议全解:从报文到 HTTP/3,Android 开发者需要知道的一切
http
淘矿人9 小时前
从0到1:用Claude启动你的第一个项目
开发语言·人工智能·git·python·github·php·pygame
lifewange9 小时前
如何设计一个 RESTful API
后端·http·restful