2 回答
TA贡献1779条经验 获得超6个赞
您必须首先创建一个代理拨号器,拨打代理以创建 net.Conn,然后在握手之前创建 uTLS 客户端时使用该 net.Conn。为了简洁起见,您的自定义 dialTLS 函数将类似于:
import (
"crypto/tls"
"net"
"net/url"
"github.com/magisterquis/connectproxy"
"golang.org/x/net/proxy"
utls "github.com/refraction-networking/utls"
)
var proxyString = "http://127.0.0.1:8080"
dialTLS := func(network, addr string, _ *tls.Config) (net.Conn, error) {
proxyURI, _ := url.Parse(proxyString)
switch proxyURI.Scheme {
case "socks5":
proxyDialer, err = proxy.SOCKS5("tcp", proxyString, nil, proxy.Direct)
case "http":
proxyDialer, err = connectproxy.New(proxyURI, proxy.Direct)
}
conn, err := proxyDialer.Dial("tcp", addr)
uconn := utls.UClient(conn, cfg, &utls.HelloRandomizedALPN)
...
}
TA贡献1880条经验 获得超4个赞
HTTP 代理和 SOCKS 代理的工作原理是在 TCP 连接后进行一些初始代理特定握手。握手完成后,它们会提供一个普通的 TCP 套接字,然后可用于进行 TLS 握手等。因此,您所需要做的就是替换您的
tcpConn, err := net.DialTimeout("tcp", addr, dialTimeout)
使用代理特定方法来设置 TCP 连接。这可以通过使用SOCKS5创建适当的拨号器或使用 HTTP CONNECT 方法在connectproxyx/net/proxy
中完成类似的操作来完成。
- 2 回答
- 0 关注
- 252 浏览
添加回答
举报