golang实现多协议代理与流量转发的全能工具插件fullproxy的使用

Golang实现多协议代理与流量转发的全能工具插件fullproxy的使用

安装

预编译二进制文件

您可以在发布页面找到预编译的二进制文件。

Go安装

可以通过以下命令从源代码编译安装:

go install github.com/shoriwe/fullproxy/v4@latest

克隆仓库

  1. 克隆仓库
git clone https://github.com/shoriwe/fullproxy
  1. 构建
cd fullproxy && go build .

预览

组合配置

关于组合配置的更多信息,请参考Compose文档。

fullproxy compose ./fullproxy-compose.yaml

文档

文件 描述
Circuits 关于电路工作原理的文档
CLI CLI工具的文档
Compose 关于组合规范的文档
Continuous integration CI的文档

覆盖率

[覆盖率图表]

示例代码

下面是一个使用fullproxy创建简单HTTP代理的示例:

package main

import (
	"fmt"
	"github.com/shoriwe/fullproxy/pkg/proxy"
	"net"
	"net/http"
)

func main() {
	// 创建HTTP代理服务器
	proxyServer := &http.Server{
		Addr: ":8080",
		Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
			// 处理代理请求
			proxy.HTTPProxyHandler(w, r)
		}),
	}

	// 启动代理服务器
	fmt.Println("HTTP代理服务器正在8080端口运行...")
	if err := proxyServer.ListenAndServe(); err != nil {
		fmt.Printf("代理服务器错误: %v\n", err)
	}
}

另一个示例,创建TCP流量转发:

package main

import (
	"fmt"
	"github.com/shoriwe/fullproxy/pkg/proxy"
	"net"
)

func main() {
	// 设置源和目标地址
	sourceAddr := ":8888"
	targetAddr := "example.com:80"

	// 创建TCP监听器
	listener, err := net.Listen("tcp", sourceAddr)
	if err != nil {
		fmt.Printf("监听错误: %v\n", err)
		return
	}
	defer listener.Close()

	fmt.Printf("TCP转发正在运行,从 %s 转发到 %s\n", sourceAddr, targetAddr)

	for {
		// 接受客户端连接
		clientConn, err := listener.Accept()
		if err != nil {
			fmt.Printf("接受连接错误: %v\n", err)
			continue
		}

		// 处理连接
		go func() {
			defer clientConn.Close()
			
			// 连接到目标服务器
			targetConn, err := net.Dial("tcp", targetAddr)
			if err != nil {
				fmt.Printf("连接目标错误: %v\n", err)
				return
			}
			defer targetConn.Close()
			
			// 转发流量
			proxy.Proxy(clientConn, targetConn)
		}()
	}
}

更多关于golang实现多协议代理与流量转发的全能工具插件fullproxy的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang实现多协议代理与流量转发的全能工具插件fullproxy的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


FullProxy: Golang实现的多协议代理与流量转发工具

FullProxy是一个用Golang编写的多功能代理工具,支持多种协议和灵活的流量转发功能。下面我将介绍其核心功能、架构设计以及示例代码实现。

核心功能

  1. 支持多种代理协议:HTTP/HTTPS、SOCKS4/SOCKS5、Shadowsocks等
  2. 流量转发与端口映射功能
  3. 协议转换(如将SOCKS转为HTTP)
  4. 流量统计与日志记录
  5. 灵活的规则配置

架构设计

FullProxy采用模块化设计,主要包含以下组件:

+-------------------+
|   配置管理模块     |
+-------------------+
         ↓
+-------------------+    +-------------------+
|   协议适配层      | ←→ |   核心转发引擎    |
+-------------------+    +-------------------+
         ↑                      ↓
+-------------------+    +-------------------+
|   具体协议实现    |    |   流量统计模块    |
+-------------------+    +-------------------+

代码实现示例

1. 基础代理服务器实现

package main

import (
	"log"
	"net"
	"net/http"
	"net/http/httputil"
)

// 基础HTTP代理
func startHTTPProxy(addr string) {
	proxy := &httputil.ReverseProxy{
		Director: func(req *http.Request) {
			// 可以在这里修改请求
			req.URL.Scheme = "http"
			req.URL.Host = req.Host
		},
	}

	server := &http.Server{
		Addr:    addr,
		Handler: proxy,
	}

	log.Printf("HTTP代理服务启动,监听 %s\n", addr)
	log.Fatal(server.ListenAndServe())
}

// 基础SOCKS5代理
func startSOCKS5Proxy(addr string) {
	listener, err := net.Listen("tcp", addr)
	if err != nil {
		log.Fatal(err)
	}
	defer listener.Close()

	log.Printf("SOCKS5代理服务启动,监听 %s\n", addr)

	for {
		conn, err := listener.Accept()
		if err != nil {
			log.Printf("接受连接错误: %v\n", err)
			continue
		}
		go handleSOCKS5Connection(conn)
	}
}

func handleSOCKS5Connection(conn net.Conn) {
	defer conn.Close()
	// 实现SOCKS5协议处理逻辑
	// ...
}

2. 流量转发实现

// 端口转发功能
func startPortForwarding(sourceAddr, targetAddr string) {
	listener, err := net.Listen("tcp", sourceAddr)
	if err != nil {
		log.Fatal(err)
	}
	defer listener.Close()

	log.Printf("端口转发 %s → %s\n", sourceAddr, targetAddr)

	for {
		srcConn, err := listener.Accept()
		if err != nil {
			log.Printf("接受连接错误: %v\n", err)
			continue
		}

		go func() {
			defer srcConn.Close()
			
			dstConn, err := net.Dial("tcp", targetAddr)
			if err != nil {
				log.Printf("连接目标错误: %v\n", err)
				return
			}
			defer dstConn.Close()

			// 双向转发数据
			go copyData(srcConn, dstConn)
			copyData(dstConn, srcConn)
		}()
	}
}

func copyData(dst, src net.Conn) {
	buf := make([]byte, 32*1024)
	_, err := io.CopyBuffer(dst, src, buf)
	if err != nil && err != io.EOF {
		log.Printf("数据转发错误: %v\n", err)
	}
}

3. 协议转换示例

// 将HTTP代理转为SOCKS5代理
func httpToSOCKS5Proxy(httpAddr, socks5Addr string) {
	// 创建HTTP客户端
	httpTransport := &http.Transport{
		Proxy: http.ProxyURL(&url.URL{
			Scheme: "http",
			Host:   httpAddr,
		}),
	}
	httpClient := &http.Client{Transport: httpTransport}

	// 启动SOCKS5服务器
	listener, err := net.Listen("tcp", socks5Addr)
	if err != nil {
		log.Fatal(err)
	}
	defer listener.Close()

	log.Printf("HTTP→SOCKS5转换服务启动,监听 %s\n", socks5Addr)

	for {
		conn, err := listener.Accept()
		if err != nil {
			log.Printf("接受连接错误: %v\n", err)
			continue
		}
		go handleConvertedConnection(conn, httpClient)
	}
}

func handleConvertedConnection(conn net.Conn, client *http.Client) {
	defer conn.Close()
	// 实现协议转换逻辑
	// ...
}

完整工具集成

package main

import (
	"flag"
	"log"
)

func main() {
	httpAddr := flag.String("http", ":8080", "HTTP代理监听地址")
	socks5Addr := flag.String("socks5", ":1080", "SOCKS5代理监听地址")
	forwardRule := flag.String("forward", "", "端口转发规则,格式为 本地端口:目标地址")
	flag.Parse()

	// 启动HTTP代理
	go startHTTPProxy(*httpAddr)

	// 启动SOCKS5代理
	go startSOCKS5Proxy(*socks5Addr)

	// 如果有转发规则,启动端口转发
	if *forwardRule != "" {
		// 解析转发规则,格式为 "本地端口:目标地址"
		// 例如 "8081:example.com:80"
		go startPortForwarding(*forwardRule)
	}

	// 保持主程序运行
	select {}
}

高级功能扩展

  1. 流量统计:可以在copyData函数中添加字节计数
  2. 访问控制:在连接处理函数中添加IP白名单/黑名单检查
  3. TLS支持:使用crypto/tls包实现HTTPS代理
  4. 多路复用使用golang.org/x/net/http2支持HTTP/2

使用建议

  1. 生产环境使用时添加认证功能
  2. 考虑添加配置文件支持(YAML/JSON)
  3. 实现日志分级和日志文件轮转
  4. 添加性能监控接口

FullProxy的这种设计既保持了简单性,又具备良好的扩展性,可以根据需要添加更多协议支持或高级功能。

要构建完整的生产级工具,还需要考虑错误处理、性能优化、安全加固等方面,但以上代码已经展示了核心功能的实现思路。

回到顶部