通过身份验证连接并保持与 socks5 代理服务器的连接

Posted

技术标签:

【中文标题】通过身份验证连接并保持与 socks5 代理服务器的连接【英文标题】:Connect and maintain connection to socks5 proxy server with authentication 【发布时间】:2021-11-30 10:07:20 【问题描述】:

我正在尝试使用凭据拨号并与 Go 中的 socks5 代理服务器保持连接。

如果我使用代理提供商设置了 IP 授权,这会很好地工作,但是没有办法使用 Go 中的 net.Dial 函数传递任何身份验证凭据:

package main

import (
    "io"
    "net"
)

func main() 

    dst, err := net.Dial("tcp", "11.22.33.44:1111")
    if err != nil 
        panic("Dial Error:" + err.Error())
    

    dst.Close()

Go 有一个有用的代理库,并允许使用以下代理通过代理进行经过身份验证的转发请求:

package main

import (
    "io"
    "net"
)

func main() 

    var proxyAuth *proxy.Auth
    if conf.Username != "" 
        proxyAuth = new(proxy.Auth)
        proxyAuth.User = conf.Username
        proxyAuth.Password = conf.Password
    

    proxyconn, _ := proxy.SOCKS5("tcp", "11.11.11.11:1111", proxyAuth, nil) //returns a Dialer with proxy that can be invoked to connect to another address

    dst := proxyconn.Dial("tcp", "22.33.44.55:6666") //connects to an address via proxy

    dst.Close()

但是,它返回一个拨号器,然后要求通过此经过身份验证的代理而不是代理服务器本身连接目标/最终地址:

我的目标是返回一个带有经过凭据验证的代理服务器的 net.conn 连接 - 如下所示:

package main

import (
    "io"
    "net"
)

func main() 

    //net.Dial does not have a way to pass Auth creds
    dst := net.Dial("tcp", "22.33.44.55:6666", proxyAuth)

    dst.Close()

【问题讨论】:

为什么要连接到代理? 构建一个原生 Go 代理类 Squid 应用。服务器端将侦听 localhost 并通过经过身份验证的代理重新路由客户端发出的请求。如果我按照第一个示例使用代理提供商设置 IP 授权,则工作正常。 【参考方案1】:

net.Dial() 方法不涉及代理身份验证。但是,如果您想要代理身份验证,您可以在调用前在请求的标头中设置它。请参考这个link

dst := net.Dial("tcp", "22.33.44.55:6666")

【讨论】:

这似乎只适用于 HTTP 转发而不是 SOCK5。这是一个巧妙的解决方法,但不幸的是并不完全符合我的需求。

以上是关于通过身份验证连接并保持与 socks5 代理服务器的连接的主要内容,如果未能解决你的问题,请参考以下文章

使用 SSLSocket 的 SOCKS5 代理

具有身份验证的 Apache HttpClient Socks5 代理

通过 SOCKS5 代理的 SSL 连接

任何用户的 socks5 身份验证状态

HTTPS over Socks5 服务器实现

Qt WebEngine设置socks5代理