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 關注
- 351 瀏覽
添加回答
舉報