簡體   English   中英

socks5 代理使用 go

[英]socks5 proxy using go

我想知道是否可以監聽本地端口 ex:1080 socks5,並且該端口上的所有連接都可以作為代理使用外部主機:port socks5

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()
}

我需要獲取目標地址並驗證連接是否為 socks5,然后使用外部 ip 執行代理並將其傳遞到 dialect.dial

聽起來你想要這個:

  1. 在特定端口使用 TCP 在本地計算機上偵聽的工具
  2. 您可以向該端口發出 socks5 協議請求,它應該將這些請求全部轉發到另一台遠程計算機上的另一個 socks5 服務器。
  3. 該 socks5 服務器負責與 socks5-protocol 請求中的目標建立連接

在這種情況下,您只需要一個基本的 TCP 代理。 您的工具不需要查看 socks5 請求,也不需要proxy.SOCKS5來連接到遠程機器。 您只希望將與本地端點的所有連接轉發到遠程端點。

您當前的代碼基本上可以工作,除了您應該只使用net.Dial (而不是dialect.Dial )連接到"externalhost:externalport" ,並且您不需要創建proxy.SOCKS5撥號器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM