fangpsh's blog

获取Local DNS 地址信息

在网页中获取local dns 不太方便,看看大家是怎么做的。

阿里云CDN 诊断工具

阿里云CDN提供的阿里昆仑用户诊断工具
alicdn_local_dns

获取到local dns 的这个请求:

https://123-66-35-57-122894414.dns-detect.alicdn.com/api/cdnDetectHttps?method=commitDetectHttps&detectId=122894414&cb=jQuery110102821084573750223_1503489263656&_=1503489263658

一个奇怪的域名,每次访问都不一样:
123-66-35-57-122894414.dns-detect.alicdn.com
设备ID :
detectId=122894414

用户访问一个域名,浏览器给按照分配的local dns 发起dns 迭代查询,最后向域名的权威服务器名查询,最后这一步的时候可以得到local dns 的地址。

如下图:

microsoft-offical-course-20410c07-18-638
图片来源:Microsoft Offical Course 20410C_07

要怎么把local dns 地址和用户对应起来呢?这就是前面那个奇怪的域名的作用,每次的域名都不同,当浏览器访问的时候,我们就可以根据这个唯一域名再结合域名服务器的信息,把对应的local dns 返回给用户。

腾讯华佗

腾讯的华佗分析系统utp.qq.comping.huatuo.qq.com
qq_ldns_1

腾讯这服务现在好像挂了。。不过不妨碍我们分析它的原理。

http://utp.qq.com/getldns.php?d=
1503491352464.1724.sngdia.imtmp.net

这个imtmp.net 的域名看下whois 信息,属于腾讯:
imtmp.net

前面这个数字看着像时间戳,做法应该和阿里的做法一样,那用户对这个域名的查询在哪里呢。

翻下代码:
qq_ldns_2

function getDNS() {

    $.get("/getldns.php?d=" + dns_domain, function(ldndsip) {

          if (typeof saveDns == "function") {

              saveDns(ldndsip);
          }
    });

    return true;
}

    function ldnsIMG() {
        var img = document.createElement("IMG");
        if (img) {
            img.style.display = "none";
            document.body.appendChild(img);
            dns_domain = new Date().getTime() + Math.random() * 1000000 + ".sngdia.imtmp.net";

           img.src = "http://" + dns_domain + '/s';
       }
    }

果然和时间戳有关。翻下前面,也找到了这个图片的请求:
qq_ldns_3

多此一举?

网易DNS 检测工具

网易也有一个DNS检测工具

netease_ldns

>GET https://only-425945-183-240-25-249.nstool.netease.com/
>Response: 您好,尊敬的网易用户<br>您的IP地址信息: 183.240.25.249 广东省广州市移动<br>您的DNS地址信息: 211.136.209.212 广东省广州市移动<br>您的DNS设置正确

也是类似的做法。

豆瓣用户检测工具

发现豆瓣也有一个检测工具:
douban_ldns

居然直接用阿里的接口。

whoami.akamai.net

akamai 提供了一个域名,直接ping 或者dig 就可以获取local dns地址,这个很酷,直接把local dns 当作查询结果返回:

akamai_ldns

Anycast

使用以上工具多次检测,如果会发现检测到的地址不同,可能是由于local dns 做了Anycast,或者有出口IP 有多个造成。