SOCKS5 本地与远程 DNS 路由示意图

两个代理地址即使指向同一台 SOCKS5 服务器,也可能得到不同结果,关键往往是 DNS。使用本地解析时,客户端先解析目标域名,再把 IP 交给代理;使用远程 DNS 时,客户端把域名通过 SOCKS 连接交给代理,由代理出口附近的解析器完成解析。

这会影响隐私、地区内容、企业内部域名、受限域名以及测试是否真正代表代理出口位置。

实际区别

在 curl 中,socks5 使用本地 DNS,socks5h 要求代理端解析域名。一个字母就决定 DNS 请求发生在哪里。

# 本地 DNS
curl --proxy "socks5://$PROXY_HOST:$PROXY_PORT" https://www.98ip.com/

# 代理端远程 DNS
curl --proxy "socks5h://$PROXY_HOST:$PROXY_PORT" https://www.98ip.com/

凭证应通过受保护变量或专门的代理认证选项提供,不要写入脚本、Shell 历史、截图或工单。

何时使用本地 DNS

客户端必须访问内部 DNS 区域、本地 hosts 规则或企业解析器时,本地解析更合适,也便于在连接代理前看到解析结果。

但本地 DNS 可能向客户端所用解析器暴露目标域名,还可能根据客户端地区返回地址,而不是根据代理出口地区返回。这样会导致地区内容错误、目标不可达,甚至把正常代理误判为故障。

何时使用远程 DNS

地区敏感测试通常更适合远程 DNS。域名在代理网络环境中解析,减少本地 DNS 暴露,也更接近真实出口地区的内容路由。

远程 DNS 并不等于完全匿名。目标服务、代理提供商、浏览器功能、加密 DNS 设置和应用遥测仍可能暴露信息。它只是路由控制的一部分。

DNS 路径错误的常见表现

  • 直接使用 IP 成功,使用域名失败。
  • 本地与 CI 解析到不同目标地址。
  • 代理出口在海外,但内容仍属于客户端地区。
  • 域名被本地解析为私有或不可达地址。
  • 不同工作节点因 DNS 配置不同而表现不一致。
  • 浏览器成功、命令行失败,或相反。

安全排错步骤

  1. 建立不使用代理的基线,记录状态、延迟与地区结果。
  2. 使用一个 SOCKS5 端点、一个域名、无轮换方式测试本地 DNS。
  3. 只把 socks5 改成 socks5h,其他条件不变。
  4. 比较解析出的地址族、私网地址和地区差异,不公开内部域名。
  5. 核对实际客户端版本的官方文档,因为不同库的代理配置接口并不完全一致。

IPv4 与 IPv6

本地和远程解析器可能返回不同地址族。客户端 IPv6 正常,不代表代理出口也具备同样路由。应记录最终选择的是 IPv4 还是 IPv6,并在应用允许时分别测试。

不要把解析错误当成认证错误。认证、DNS、连接拒绝、TLS 和目标 HTTP 状态属于不同层级,处理方法完全不同。

自动化检查清单

  • 明确选择本地或远程 DNS,不依赖未记录的默认值。
  • 代理凭证不进入源代码。
  • 开发、CI 与生产使用一致的代理协议。
  • 日志记录 DNS 模式,但不记录凭证。
  • 先验证单一域名,再启用轮换与并发。
  • 分别确认代理出口地区与内容地区。
  • 检查 IPv4 和 IPv6 行为。
  • 浏览器场景还需检查加密 DNS、WebRTC 与 Service Worker。
  • 使用过程符合适用法律、目标服务条款和数据要求。

常见问题

socks5h 是否会加密 DNS?

它把域名交给代理解析,而不是在客户端本地解析。后续安全性取决于代理连接和提供商基础设施,不能视为通用的加密 DNS 保证。

为什么 IP 成功而域名失败?

直接使用 IP 绕过了解析。DNS 可能返回不可达地址、私网地址、错误地址族或不合适的地区节点。

所有测试都应使用远程 DNS 吗?

不一定。需要出口地区真实性和减少本地暴露时使用远程 DNS;需要内部域名或本地覆盖规则时使用本地 DNS。关键是明确记录选择。

进行可控的地区代理测试时,可查看 98IP 的配置与支持信息。比较速度、成功率和地区准确性前,应先固定 DNS 模式。

内部研究依据:curl 代理选项文档、Requests SOCKS 代理文档、Playwright 网络代理文档。仅列资料名称,不提供外部链接。