应用接入代理后,如何检查 DNS 请求走了哪条解析路径
用抓包、代理日志和权威 DNS 三证据判断解析发生在客户端本地还是代理端;目标服务收到的是已解析后的连接目标,socks5 与 socks5h 的域名传递方式是最容易漏掉的泄漏点。
DNS 测试的重点是确认查询由客户端还是代理端发起。本地解析使用设备上的 DNS 解析器;代理端解析则由代理侧查询目标域名。目标服务通常收到的是已经解析后的连接请求,不是这次 DNS 查询的发起方。
区分客户端本地 DNS 解析和代理端 DNS 解析
客户端本地解析由设备上的 DNS 解析器发起,查询经过本地网络;代理端解析则由代理侧解析器查询域名。目标侧内部服务发现属于另一类测试,不应与客户端或代理端解析混为一谈。先确认解析由谁发起,再判断出口地区是否符合预期。
结合抓包、代理日志和权威 DNS 判断解析路径
抓到本机发出的 53 端口 DNS 查询,可以证明该查询走了本地路径;没有抓到时,还需检查 DoH、DoT、系统缓存和容器网络。代理日志中出现目标域名,只能说明“域名被交给代理端”,属于线索而不是证据——要确认代理端真的做了查询,得看代理解析器的实际查询记录或缓存命中。常用做法是给每次测试分配唯一的自有测试子域,附上用例 ID 和时间窗,把本地解析记录、代理解析记录和权威 DNS 日志按同一查询名串起来;日志里还要标注递归查询与转发关系,映射关系拿不到时把结论标为待确认。另外要分清两件事:解析“代理接入地址”和解析“目标域名”不是同一条路径,前者发生在建立隧道之前,不能拿来证明后者。
检查 HTTP CONNECT 和 SOCKS5 如何传递目标地址
HTTP CONNECT 通常将目标域名交给代理处理。使用 SOCKS5 时,解析位置取决于客户端和它的实现:以 curl 为例,socks5:// 会在本地解析后向代理发 IP,socks5h:// 则把域名交给代理解析;确认时看实际发往代理的请求里是域名还是 IP,并结合权威日志核对。其他库的等价开关和默认值并不统一,按各自 API 和版本文档确认,不要把字符串约定当成 SOCKS5 的通用行为。
配置代理协议时,可对照代理设置帮助核查客户端设置。
识别本地 DNS、DoH、DoT 和缓存导致的解析泄漏
本地 DNS 查询、DoH/DoT 请求、系统缓存和应用自带解析库,都可能让实际结果与预期不同。排查时先确认查询由哪个组件发起,再核对解析结果和权威 DNS 日志;不要在定位解析路径前就更换 DNS 服务器。
用自有测试域名验证 DNS 请求来源并记录结果
用自有域名较可靠的做法是权威 DNS 日志能看到查询名和来源 IP,这是重要证据。
记录查询发起方、查询名称、解析结果、出口归属和证据来源,并结合抓包、代理日志与权威 DNS 日志判断解析路径。
抓包、代理日志和权威 DNS 日志应能共同支持同一判断;证据不一致时,将结论标记为待确认。若解析结果指向非预期内网或地区,应停止测试并检查配置。
发现 DNS 与预期不符时,可从全球代理帮助中心查找客户端接入文档。
如果需要核对主机、端口或协议参数,可参考代理设置帮助。
- curl 手册中的
--socks5与--socks5-hostname参数说明 - RFC 9499《DNS Terminology》(递归查询与转发术语)
常见问题
怎么判断 DNS 请求有没有走代理?
看解析发起方和权威日志来源。抓到本机发出的明文 DNS 查询,说明这次解析在本地;没抓到还要同时查 DoH/DoT、缓存和容器网络。
socks5 和 socks5h 有什么区别?
socks5h 由代理解析域名,socks5 可能本地解析后传 IP;以 curl 为例就是 socks5h:// 与 socks5:// 的区别,其他客户端按各自文档确认。
