Golang中如何实现SOCKS5代理?代码举例讲解

在Golang中,org/x/net/proxy/socks5包来实现SOCKS5代理。代码示例:

go
// SOCKS5代理服务器
func handleSocks5(conn net.Conn) {
    // 读取SOCKS5请求
    buf := make([]byte, 256)
    n, err := conn.Read(buf)
    if err != nil {
        return 
    }

    // 解析SOCKS5请求
    r, host, port, err := socks5.ParseRequest(buf[:n]) 
    if err != nil {
        return
    }

    // 连接远程服务器
    server := socks5.DialSocksProxy(proxyAddr)
    dst, err := server.Dial("tcp", net.JoinHostPort(host, strconv.Itoa(port)))
    if err != nil {
        return
    }

    // 启动转换goroutine
    go func() {
        io.Copy(dst, conn)     // 发送数据到远程服务器
        dst.Close()            // 关闭远程连接
    }()
    io.Copy(conn, dst)        // 将远程服务器响应发送回客户端
    conn.Close()              // 关闭客户端连接
} 

func main() {
    listener, err := net.Listen("tcp", ":1080") 
    if err != nil {
        log.Fatal(err) 
    }

    for {
        conn, err := listener.Accept()
        if err != nil {
            log.Fatal(err)
        }
        go handleSocks5(conn) 
    }
}

SOCKS5代理服务器会监听1080端口接收SOCKS5请求,解析请求的远程主机和端口,然后与远程服务器建立连接并实现请求响应的转发,实现了一个SOCKS5代理服务器。

go
// SOCKS5客户端
dialer, err := proxy.SOCKS5("tcp", "localhost:1080", nil, proxy.Direct)
if err != nil {
    log.Fatal(err)
}
conn, err := dialer.Dial("tcp", "google.com:80")
if err != nil {
    log.Fatal(err) 
}

客户端通过设置SOCKS5代理信息将请求代理到SOCKS5代理服务器。