通过身份验证连接并保持与 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 代理服务器的连接的主要内容,如果未能解决你的问题,请参考以下文章