阿里云云解析、腾讯DNSPod、AWS Route53 等均支持GEO线路解析,可以看阿里这个文档:
实现原理
云解析是通过识别LocalDNS的出口IP,来判断访问者来源。
如果LocalDNS支持EDNS
因为云解析DNS支持 edns-client-subnet,所以在获取访问者来源IP时,优先获取 edns-client-subnet 扩展里携带的IP,如果edns-client-subnet 扩展里存在IP,云解析DNS会以该IP来判断访问者的地理位置 ;如果不存在,则以LocalDNS出口IP来判断访问者的地理位置。
如果LocalDNS不支持EDNS
LocalDNS会迭代请求至云解析DNS,云解析DNS根据访问者LocalDNS出口IP来判断访问者的地址位置,实现智能解析。
如果LocalDNS变相支持EDNS
用户发起DNS请求,递归到LocalDNS,则LocalDNS将本次请求发送到二级节点,通过二级节点向云解析DNS发起请求,此时云解析DNS会根据LocalDNS二级节点的地域位置返回具体 的细分线路解析结果。
这上面调度靠的就是IP库,调度的准确性完全依赖这个库。 能不能准确的将你想要的用户调度到对应的节点,这里面会有2个问题:
- 厂商的IP库准不准;
- 厂商的研发怎么处理IP库字段和GEO 匹配逻辑;
IPIP.NET创始人高春晖写过一个系列:DNS智能解析功能评测,读完这个系列文档,我们就能发现,除了使用了IPIP 的的DNSPod和DNS.COM,其他厂商都一塌糊涂。
如果你认为高春晖是自卖自夸,那大可实际测试一下。从我的体验来看,他说的没错。
这里的本质问题就是IPIP的数据和准确性好了一大截。印象阿里是有采购IPIP,但是似乎是只给了CDN 业务用,阿里云解析还自己搞了一个IP库,和IPIP.NET 闹了一段官司后道歉下线了。
你可能会问AWS 是不是好一点,头部大厂,做国外业务的,对国外分国家地区解析用Route53更好一点? 实际的情况是Route53 用的是Maxmind,而Maxmind 的数据从我过往的经验来看,及时性和准确比IPIP 差很多,有时候甚至比IP2Location 还差。(至于Route53 权威节点的网络性能,暂不讨论,只讨论线路的准确性的。对了,Route53 按解析次数收费,也太贵了。。别上贼船)
总之,我个人感觉如果IPIP.NET 打90分,那Maxmind 和IP2Location 就大概60~70分,基于他们做出来的产品也就差不多。
回到DNS解析这个兜底线路问题,如果DNS 的IP库不准,特别是对一些localdns 的出口ip(回看下上面阿里云的的原理)识别不准,
例1
例如一个广东 联通的出口IP,IP库识别出来可能是 中国 联通
,或者只有联通
,这个时候如果你的线路是这么配置的:
- 默认 -> x.y.z.0
- 华北 电信 -> x.y.z.1
- 华南 联通 -> x.y.z.2
- 华北 移动 -> x.y.z.3
- ...
那么就会匹配到 默认 x.y.z.0
,如果这个IP 不是BGP 线路,就跨网绕了一圈。
加一个联通 -> x.y.z.4
可以防止这种情况。
例2
如果你的解析线路是:
- 电信 -> x.y.z.0
- 联通 -> x.y.z.1
- 移动 -> x.y.z.2
- 广电 -> x.y.z.3
- ...
- 境外 -> x.y.z.101
是的,你是把厂商支持的分运营商线路都加上了,但是就没加默认
线路,但是也会有少数国内用户的IP,IP库读出来不带ISP 信息,那这部分用户这个时候会拿不到解析结果。
例3
按洲配置了解析线路:
- 默认-> 腾讯北京IP
- 亚洲-> 阿里香港IP
- 欧洲-> AWS 德国IP
- 大洋洲..
- 北美洲..
- ..洲
如果一个境外IP 识别出来是空,会直接走到默认 腾讯北京
,这个时候保险一点加上境外线路
。我们并不知道DNS的研发会如何处理这种情况,
- 境外线路,是匹配明确了境外地区国家的?对于无国家的,走默认线路;
- 境外线路,是匹配所有除了中国大陆意外的IP?对于无国家的,如果有境外线路,走境外线路
BTW. 如果上面这种情况,你怕自己一不小心没有把洲
线路加全,那更应该加一个境外
线路兜底。
BTW2. Route53 没有境外线路,他的默认是全球,你需要单独添加中国线路,逻辑和国内厂商相反。
例4
你写了一堆脚本,按每个国家分线路配置了,但是哪天脚本出错,少添加了一个国家或者运维误删了一个国家,这个国家直接走到默认线路,默认线路指向的可能是北京。 (如果没有默认线路,就更惨了)
你写了一堆脚本,按每个国家分线路配置了,但是IP库的对于一些小国家和争议地区的代码和DNS调度系统不一致,DNS 研发没处理或者不想处理这个问题,这个国家也会走到默认线路。
总结
这是小概率事件,出错影响的势必是小部分用户,又极难发现。
啰唆了这么多,很简单的一件事,时刻牢记配上默认线路兜底。
当添加了按国家,按地区+运营商分线路解析,记得按情况配置大洲线路,运营商线路,境外线路兜底。
IP 库厂商在做IP 定位时,理想的也应该是准确度优先,而不是覆盖度优先。 什么是准确度优先呢? 即如果你吃不准一个IP是不是广东的,就不要瞎标,只标到中国就好了。我记得IPIP.NET 是这么做,很早之前跑过一个测试,当时看到对于教育网的IP,IPIP.NET标的都是准确度优先,不会瞎标。
但是国内有一些IP库厂商,选择覆盖度优先,他一定要标到城市或者一级行政区,即使他吃不准后面是不是对的。标上再说,然后吹嘘自己覆盖度99.999%。
假设DNS 厂商用的是准确度优先的,那我们就更应该设置兜底策略。
如果是覆盖度优先的的呢?只能说少用,能用尽量只加默认线路、大运营线路,业务上少依赖DNS 调度的准确性。
🐴后🧨
现在公司部分业务部门使用了大量分线路解析的情况,分国家、地区,将用户引导到不同节点上。去年提醒了业务部门和总监,添加和检查加洲线路、默认线路兜底被无视,今年就漏了个国家线路被客户投诉 🤦♂️。