golang实现多协议代理与流量转发的全能工具插件fullproxy的使用
Golang实现多协议代理与流量转发的全能工具插件fullproxy的使用
安装
预编译二进制文件
您可以在发布页面找到预编译的二进制文件。
Go安装
可以通过以下命令从源代码编译安装:
go install github.com/shoriwe/fullproxy/v4@latest
克隆仓库
- 克隆仓库
git clone https://github.com/shoriwe/fullproxy
- 构建
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编写的多功能代理工具,支持多种协议和灵活的流量转发功能。下面我将介绍其核心功能、架构设计以及示例代码实现。
核心功能
- 支持多种代理协议:HTTP/HTTPS、SOCKS4/SOCKS5、Shadowsocks等
- 流量转发与端口映射功能
- 协议转换(如将SOCKS转为HTTP)
- 流量统计与日志记录
- 灵活的规则配置
架构设计
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 {}
}
高级功能扩展
- 流量统计:可以在copyData函数中添加字节计数
- 访问控制:在连接处理函数中添加IP白名单/黑名单检查
- TLS支持:使用crypto/tls包实现HTTPS代理
- 多路复用:使用golang.org/x/net/http2支持HTTP/2
使用建议
- 生产环境使用时添加认证功能
- 考虑添加配置文件支持(YAML/JSON)
- 实现日志分级和日志文件轮转
- 添加性能监控接口
FullProxy的这种设计既保持了简单性,又具备良好的扩展性,可以根据需要添加更多协议支持或高级功能。
要构建完整的生产级工具,还需要考虑错误处理、性能优化、安全加固等方面,但以上代码已经展示了核心功能的实现思路。