Home  >  Article  >  Backend Development  >  Using go's socks5 proxy

Using go's socks5 proxy

WBOY
WBOYforward
2024-02-09 09:45:10804browse

Using gos socks5 proxy

What php editor Youzi will introduce to you today is the socks5 proxy implemented in Go language. During network access, we often encounter situations where we need to hide our real IP address or bypass network blocks. Using socks5 proxy can help us achieve these goals easily. As an efficient and concise programming language, Go language has rich network libraries and concurrency features, and is very suitable for developing network proxy tools. Next, we will introduce in detail how to write a simple and practical socks5 proxy server using Go language.

Question content

I want to know if it is possible to listen on a local port, for example: 1080ocks5, and have all connections on that port proxy to use the external host: portsocks5

func main() {
    l, err := net.Listen("tcp", "127.0.0.1:1080")
    if err != nil {
        fmt.Print(err)
    }
    defer l.Close()

    for {
        conn, err := l.Accept()
        if err != nil {
            fmt.Print(err)
        }

        go handle(conn)
    }
}

func handle(conn net.Conn) {
    defer conn.Close()

    dialect, err := proxy.SOCKS5("tcp", "externalhost:externalport", nil, proxy.Direct)

    newConn, err := dialect.Dial("tcp", "targethost:targetport")
    if err != nil {
        log.Printf("Connection error: %s", err.Error())
    }

    go func() {
        _, err = io.Copy(newConn, conn)
        if err != nil {
            log.Printf("Connection error: %s", err.Error())
        }
    }()

    _, err = io.Copy(conn, newConn)
    if err != nil {
        log.Printf("Connection error: %s", err.Error())
    }
}
func handle(conn net.Conn) {
    defer conn.Close()
}

I need to get the destination address and verify the connection is socks5, then do a proxy using the external ip and pass it to dialect.dial

Workaround

Sounds like you want this:

  1. A tool that listens on the local computer on a specific port using TCP
  2. You can make ocks5 protocol requests to this port and it should forward them all to other socks5 servers on another remote machine.
  3. The socks5 server is responsible for establishing a connection with the target in the socks5 protocol request

In this case, you just need a basic TCP proxy. Your tool does not need to look inside the socks5 request, nor does it need proxy.SOCKS5 to connect to the remote machine. You only want to forward all connections to the local endpoint to the remote endpoint.

Your current code will work for the most part, with the exception that you should use net.Dial (instead of dialect.Dial) to connect to "externalhost :externalport", and there is no need to create a proxy.SOCKS5 dialer.

The above is the detailed content of Using go's socks5 proxy. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete