socks5代理配置需显式传nil跳过认证,http客户端须用dialcontext而非dial,地址格式为host:port不含scheme,dns由客户端本地解析。

SOCKS5 代理配置失败: Dialer 初始化必须指定用户名密码(即使服务端允许匿名)
很多开发者在用 x/net/proxy 时直接传空字符串或忽略认证参数,结果遇到 socks: authentication failed 或连接卡死。SOCKS5 协议要求客户端明确声明支持的认证方式,哪怕服务端配置了 no-auth,Go 的 proxy.SOCKS5 默认仍尝试 USERPASS 认证 —— 如果不提供凭证,它不会自动降级到匿名模式。
正确做法是显式传入 nil 表示跳过认证:
dialer, err := proxy.SOCKS5("tcp", "127.0.0.1:1080", nil, proxy.Direct)
if err != nil {
log.Fatal(err)
}
- 第 3 个参数为
*proxy.Auth,传nil→ 使用 no-auth 方式 - 传
&proxy.Auth{User: "u", Password: "p"}→ 强制 USERPASS 认证 - 不要传
&proxy.Auth{User: "", Password: ""},这会触发协议级认证交换,但空凭据通常被拒绝
HTTP 请求走 SOCKS5:Transport 必须用 dialer.DialContext 而非 Dial
Go 1.19+ 中 http.Transport 的 Dial 字段已弃用,且 x/net/proxy 返回的 proxy.Dialer 实现的是 proxy.ContextDialer 接口,只提供 DialContext 方法。直接赋值给旧版 Dial 会导致编译错误或运行时 panic。
必须通过 DialContext 配置:
在 Golang 中使用 samber/hot 进行内存缓存,支持 LRU、LFU、TinyLFU、W‑TinyLFU、S3FIFO、ARC、TwoQueue、SIEVE、FIFO 等淘汰算法,提供 TTL、缓存加载器及分片功能。
transport := &http.Transport{
DialContext: dialer.DialContext,
}
client := &http.Client{Transport: transport}
resp, err := client.Get("https://httpbin.org/ip")
- 漏掉
Context后缀是常见编译错误来源:cannot use dialer (type proxy.Dialer) as type func(context.Context, string, string) (net.Conn, error) - 如果还需复用连接、设超时,应在同一
http.Transport上叠加IdleConnTimeout等字段,不要另起 dialer
代理链路不通:检查 socks5 地址是否含 scheme 或多余斜杠
传给 proxy.SOCKS5 的地址是纯网络地址("host:port"),不是 URL。若误传 "socks5://127.0.0.1:1080" 或 "127.0.0.1:1080/",会解析失败并返回 lookup socks5://127.0.0.1:1080: invalid domain name 类似错误。
- 正确格式只有两种:
"127.0.0.1:1080"(IP)或"proxy.example.com:1080"(域名) - 端口必须是整数,不能是字符串;DNS 解析由底层 net 包完成,不经过代理
- 本地测试常用
127.0.0.1,但某些 SOCKS5 服务(如 sslocal)默认只监听localhost,IPv4 地址可能被拒绝,此时换用"localhost:1080"
HTTPS 请求失败:SOCKS5 本身不加密,TLS 握手仍由 client 完成
SOCKS5 只负责建立 TCP 连接,不处理 TLS。所以 https:// 请求能通,不代表代理在加密层面“接管”了流量 —— 它只是把 client 和目标服务器之间的原始 TCP 流转过去。这意味着:
- 证书校验、SNI、ALPN 等全部由 Go 的
http.Client自行完成,和直连行为一致 - 如果目标站用了自签名证书,需额外配置
Transport.TLSClientConfig.InsecureSkipVerify = true,和是否走代理无关 - 某些企业代理会拦截 HTTPS 并替换证书,此时需把代理的 CA 加入
TLSClientConfig.RootCAs,否则报x509: certificate signed by unknown authority
真正容易被忽略的是 DNS:SOCKS5 协议本身不支持远程 DNS 解析(即 no-resolve 模式),所有域名都由客户端本地解析。如果本地 DNS 被污染或不可用,Get("https://google.com") 就会因解析失败而卡住 —— 这不是代理问题,但常被误判。










