SOCKS5 与 SOCKS5h:DNS 到底在哪里解析
比较 curl 的本地与代理端 DNS 解析,排查域名解析失败,并了解 socks5h 能保护什么、不能保护什么。
在 curl 中,如果希望代理解析目标域名,就选 socks5h://。如果希望 curl 在本地解析,再把地址交给代理,就选 socks5://。两者都使用 SOCKS5;末尾的 h 是客户端 URL 的一种约定。
用你的 SOCKS5 端点替换本地监听地址,再比较这两种模式:
curl --noproxy '' --proxy socks5://127.0.0.1:1080 --connect-timeout 5 --max-time 15 --verbose https://example.com/
curl --noproxy '' --proxy socks5h://127.0.0.1:1080 --connect-timeout 5 --max-time 15 --verbose https://example.com/这里仅改变解析模式。--noproxy '' 会清除这两次调用的绕过规则,超时设置则为比较限定时间。对应的专用选项是 --socks5 和 --socks5-hostname。目标要使用主机名:直接写 IP 地址不需要解析目标域名,也就无法展示这种区别。
一个域名可能只有一端认识
假设代理运行在开发网络中,那里的 DNS 知道某个内部服务名。你的笔记本在 socks5 模式下可能解析不了它,而 socks5h 可以让代理来解析。反过来,如果某个名字只定义在笔记本的 hosts 文件里,失败的就可能是远程解析。
公共 DNS 在不同网络中也可能返回不同地址。结果不同时,应比较实际选中的地址及其可达性,而不是马上更换代理。
- 无法解析代理主机名:两种模式都无法开始。客户端仍然要解析
proxy.example,使用socks5h://proxy.example:1080时也不例外。 - 目标域名的本地解析失败:检查客户端解析器,或对比由代理解析主机名的模式。
- SOCKS 服务器拒绝目标:查看其回复和策略。本地解析成功,并不表示远端一定可达。
- 隧道正常,但证书验证失败:排查目标端 TLS;更换 DNS 模式并不是通用的信任问题修复办法。
对于自己管理的代理,可以用受控测试域名和服务端日志确认代理收到的是哪种地址类型。出口 IP 查询网页做不到这一点:它显示的是向外发起连接的信息,不是 DNS 在哪里解析的。
隐私收益有明确的范围
由代理解析可以避免这次请求在本地解析目标域名。它不会加密 SOCKS,不能证明代理使用了加密 DNS,也不会把其他应用或浏览器预取流量一并送入代理。启用 SOCKS 支持的 Requests 也采用同样的本地与代理端解析区别;其他客户端可能通过设置项控制,而不是使用 curl 的 URL 写法。从SOCKS5 代理列表复制端点之前,先选择应用支持的协议。