DNS 解析中的搜索引擎线路那些事儿

本文不会贴出任何搜索引擎蜘蛛实际的测试数据,仅作理论分析,感兴趣的同学可以根据一些公开的第三方工具和文章中提到的一些技术方案自行分析。

首先简单介绍下 DNS 解析中搜索引擎线路的作用,当代权威 DNS 的基本功能都包括分线路解析(也有智能解析、view、geo 等等名字) ,其中很多权威 DNS 服务商会提供针对搜索引擎蜘蛛抓取的线路(包括搜索引擎线路、SEO 优化、搜索引擎回源等等名字),主要目的是对普通用户返回 CDN 或其他通用的地址,而准对搜索引擎蜘蛛的抓取则直接返回源站的地址,可以提高权重、收录等目的。

搜索引擎蜘蛛在抓取网页前,首先要进行域名解析,获取目标域名的 IP 地址之后再进行抓取,此处需要涉及到蜘蛛使用的 LocalDNS 和目标域名使用的权威 DNS 两个部分的解析过程,首先介绍权威 DNS 解析过程。

权威 DNS 解析过程

权威 DNS 主要是依靠 LocalDNS 发送的 DNS 请求中的 IP 地址来进行分线路的解析的,而携带 IP 地址主要有两个位置,分别进行说明。

DNS 请求源地址

一个标准的 DNS 请求不管是 UDP 还是 TCP 协议,都必然要有其源 IP 地址,权威 DNS 服务器可以通过获取该地址来查询 IP 库和线路设置情况来进行分线路解析。

edns_client_subnet(ECS) 选项中携带 IP 地址

DNS 扩展协议中的 ECS 段可以在 DNS 请求包额外携带 IP 地址来供权威 DNS 获取并依此进行分线路解析,主要用于提升节点分布于全球的公共 DNS 来提升解析准确度,但是 ECS 的现状是大量权威 DNS 已经实现了对 ECS 的支持,但是 LocalDNS 对 ECS 的支持情况则很不乐观,除了 Google Public DNS 和 OpenDNS 有相对比较完整的支持外,其他包括运营商 DNS 和大部分其他公共 DNS 并没有很完整的支持 ECS 协议(ECS 协议支持情况可以参考之前的一篇文章《国内主要公共 DNS 支持 ECS 情况测试 – 20210315》)。

当然可知目前绝大部分的搜索引擎蜘蛛使用的 LocalDNS 也都是不支持 ECS 协议的,而权威 DNS 要正确解析蜘蛛访问的域名的线路主要就依赖蜘蛛使用的 LocalDNS 本身的外网出口 IP 来判断。下面再讨论蜘蛛使用的 LocalDNS 几种不同的场景。

蜘蛛使用的 LocalDNS

蜘蛛使用的 DNS 可能分为几种情况:

1. 使用蜘蛛独占的网段搭建 LocalDNS 进行解析

这种情况是对权威 DNS 的搜索引擎线路最友好的方式,该网段为蜘蛛独占,不与其他业务混用,尤其是公共DNS,目标域名的权威 DNS 只需要定期收集更新其蜘蛛使用的 LocalDNS 的外网出口 IP 即可达到很好的优化效果。

如果蜘蛛 IP 和 LocalDNS 的外网出口 IP 地址位于相同网段,通过搜索引擎官网公布或第三方收集的蜘蛛 IP、蜘蛛的 UA、IP 段的反解析结果等收集、验证、更新蜘蛛 IP 段即可。

如果 LocalDNS 的外网出口 IP 地址与蜘蛛 IP 位于不同网段,但是只要该网段依然是蜘蛛独占,可以通过一些技术手段来收集这些 LocalDNS 的外网出口 IP,如向 LocalDNS 请求 whoami.ip.dnspod.net,则返回结果即为该 LocalDNS 的外网出口 IP,如果 LocalDNS 支持 ECS,则会同时返回 LocalDNS 请求的源 IP 和携带的 ECS IP。

类似可以检测 LocalDNS 的外网出口 IP 的域名现网有多家大厂都有提供,仅返回结果的展示方式不一致。

但是想想就知道,蜘蛛全部独占相关的网段的可能性有多低,现网的相关测试数据也完全证明蜘蛛使用的网段大部分是也有其他业务在使用, 其实大部分其他业务复用蜘蛛 IP 段不会对搜索引擎线路优化有什么影响 ,除了公共 DNS。

2. 蜘蛛 LocalDNS 的外网出口 IP 网段和公共 DNS 网段重合

这种场景对同时提供搜索引擎服务和公共 DNS 服务的厂商是非常常见的,此处也不再进行举例说明,仅说明存在的问题。

目前从各种渠道获取到的蜘蛛 IP(包括其使用的 LocalDNS 外网出口 IP)在 IPv4(IPv6 本文不额外讨论) 中一般精度可达到 C 段 IP(/24),非常难达到非常准确的 /32 精度,这就导致权威 DNS 无法区分来访问的 IP 到底是蜘蛛来访问的还是普通用户使用公共 DNS 来访问的,从而无法给双方都解析到准确的结果,只能折衷选取一种策略。

举例说明,目前腾讯云 DNSPod 的解析策略是对此类 IP 不添加到蜘蛛 IP 库中,结果是蜘蛛很大概率无法获取搜索引擎线路设置的特定结果,但是也不会造成普通用户错误的获取到蜘蛛线路的解析结果,尤其是在其公共 DNS 服务的普通用户体量巨大的时候。

3. 直接使用公共 DNS 进行解析

公开的 LocalDNS 包括运营商 DNS 和其他公共 DNS,因为运营商 DNS 大多有源 IP 段必须为本运营商的限制,对于可能分布于各地的蜘蛛来说不是很好的选择,公共 DNS 则可以作为主要选择。

蜘蛛可以直接使用这些公共 DNS 进行解析或者自建的缓存 LocalDNS 本身不进行递归查询,只是将解析请求转发至公共 DNS 并缓存解析结果。

此类场景在蜘蛛中也是比较常见的,因为可以节省大量的 LocalDNS 的部署维护成本,导致的结果和策略选择也与第二种场景一致。

解决方案

如果想让权威 DNS 的搜索引擎线路更有效,解决目前存在的问题,可以考虑 2 种方案,但是都存在相同的问题,虽然理论上是有一定的可操作性的,但是实际中确较难达成,主要维护成本或资源成本,且依赖搜索引擎的部署策略,与权威 DNS 不是一家的^_^。

  1. 蜘蛛及其 LocalDNS 使用 IP 段不要与公共 DNS 复用
  2. 蜘蛛使用支持完整 ECS 的递归 DNS

方案 1 主要针对蜘蛛自建 LocalDNS ,实施难度本身不大,主要是在部署自己的 LocalDNS 时能够和公共 DNS 隔离即可,需要更多的IP段资源,且在后续变更时需要注意一直维护该策略不变才可。

方案 2 主要针对直接使用或者转发到公共 DNS 的蜘蛛,因为完整的 ECS 在 LocalDNS 中对域名的解析结果会按照网段进行缓存,即使蜘蛛与普通用户复用相同 DNS 也不会造成很大的影响,仅对蜘蛛 IP 同网段的其他业务可能产生一定的影响,范围非常有限,不会影响到大量的普通用户的访问。

此方案存在的问题主要是公共 DNS 支持完整 ECS 的少之又少,尤其是在国内短期内不一定会有长期持续而稳定支持完整 ECS 的公共 DNS,而 Google Public DNS 和 OpenDNS 则对国内使用者非常不友好,可操作性不如方案 1。