首先,我们为什么关心一个域名在某个地方的真实解析ip?当我们使用dns 后,域名解析的结果,对于网站方是不可控的,作为cdn 的用户,怎么知道自己网站在某个省的真实质量?如果不知道真实质量,怎么调用新的节点去覆盖?
其次,我们怎么去获取某个域名解析,在某个省或者市的真实质量?当使用融合cdn的时候,域名出现跨运营商,跨省解析,都是很有可能的。
第一点是做域名监控的意义,第二点我们该如何去实现,实现的关键就是edns 协议。
我们怎样做一个域名的全网真是ip查询呢?回顾下,我们上网的一般流程(图片网上搜的)
一般不设置dns server 的话,我们使用的localdns 都是isp dns 。当我们发出请求的时候,所有向baidu.com 所在权威服务器发出的请求,都是isp dns 服务器 所在ip 查对应view 解析的结果。
说到这,关键的点就出来了,我们能够模拟isp dns 发送请求给权威服务器,或者说,我能把ip 信息传导到权威服务器,权威服务器能根据这个ip 匹配出对应view ,将解析结果返回,这个问题就可以解决。这个能做吗?能做,用edns 协议就可以。
edns 网上有很多简介了,原理就是扩充协议,附带ip 信息。可以重新编译bind 附带subnet 去抓包查看协议的每个字段:
dig -t A www.alibaba.com @202.119.160.11
; <<>> DiG 9.10.3-P4-Ubuntu <<>> -t A www.alibaba.com @202.119.160.11
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18762
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.alibaba.com. IN A
;; ANSWER SECTION:zhiwei
www.alibaba.com. 300 IN CNAME www-cn.gds.alibaba.com.
www-cn.gds.alibaba.com. 120 IN A 106.11.62.61
;; AUTHORITY SECTION:
gds.alibaba.com. 6460 IN NS gdsns1.alibaba.com.
gds.alibaba.com. 6460 IN NS gdsns2.alibaba.com.
;; Query time: 34 msec
;; SERVER: 202.119.160.11#53(202.119.160.11)
;; WHEN: Sun Jul 24 22:08:59 CST 2017
;; MSG SIZE rcvd: 127
使用edns 后,就能透传ip信息了,那我们怎么去监测全网域名的质量?权威服务器都支持edns ?如果权威服务器不支持edns ,如何做?如果权威服务器支持edns,我们直接向权威发请求?如果向localdns 发送请求edns 请求,哪些支持,哪些不支持?如果localdns 支持,但是权威不支持,又会是什么情况?然后,目前支持edns 的localdns 有哪些?
总结下,直接向权威发edns 做监控是不合适的,加大了权威的负担。一般会向localdns 发请求,目前,支持比较好的是dnspod 和 谷歌的localdns, 114不稳定,百度的也有点问题。然后,dnspod 和 谷歌的localdns 都会透传 edns 请求,如果权威并不支持,那这个请求就不会获取到解析结果。
说到这,基本就知道该如果实现了,全国每个省每个运营商的网段选出几个ip,分别构造edns 请求,就可以得到真实的解析地址,最后通过 httptrace 或者ping 就可以获取想要的指标。