追梦人博客Dream.ren

追梦人 Dream.ren

使用Overture搭建更好的智能递归DNS

何为智能解析?问题来了:何为智能?这还要从负载均衡和CDN说起,你有没有想过BAT首页为什么能支撑全国那么多服务请求?是因为他们的首页所在的服务器很屌吗?不不,当然不是,那是因为这些网站都是由许多服务器群组成的,不可能一台服务器去扛所有的请求,他们的服务器在全国多地各网络都有分布,我们按就近原则使用相应的服务器,BAT这样才为我们提供了快速的服务,这里,就近原则就是所谓的智能解析。

如何实现智能解析?问题又来了,谁来负责智能解析呢?相信聪明的你已经知道答案了,当然是权威DNS啊,也就是域名ns记录所指向的DNS服务器,权威DNS负责按照规则授权解析域名。假设有一个网站edns.dream.ren,在电信网络下有一个IP为1.1.1.1的服务器,在联通网络里有一个IP为2.2.2.2的服务器,在移动网络里有一个IP为3.3.3.3的服务器,让不同网络的用户使用不同的服务器,网站所有者就可以在权威DNS里面配置,根据用户IP判断用户所在的运营商,然后返回不同的结果,也就实现了智能解析。

运营商有自己的DNS缓存服务器,当你使用默认DNS的时候,运营商会分配给你运营商自己的DNS缓存服务器,缓存服务器再去权威DNS那里获取解析结果,比如你是移动网络,运营商缓存DNS服务器自然也是移动的IP,获取到的结果就是合理的3.3.3.3,但是运营商会在DNS上做一些手脚,用户体验一般,于是就有了公共DNS。那么再做一个假设,你在电信机房有一台公共DNS服务器,使用用户有电信用户,也有联通和移动用户,对于edns.dream.ren,你的公共DNS去权威DNS那里成功地获取到了edns.dream.ren的解析结果1.1.1.1,你的用户从你那里也拿到了同样的结果1.1.1.1,电信用户表示非常舒爽,但是联通和移动访问起来就可能非常吃力,毕竟运营商与运营商之间的网络线路很少,跨运营商访问有时会让你感到绝望,就像网通用户在电信区打撸啊撸一样。

如何避免这种公共DNS造成的不适呢?
假设你需要搭建一台支持智能解析的公共DNS,那么有以下三种方案供你选择:
1、土豪专用方法:分别在电信、移动、联通、铁通、教育网、长城宽带等网络上按地域部署N多节点,然后再搞个主服务器,用户向主服务发起查询,主服务器再从离用户最近的同运营商节点去取结果并返回给用户,目前国内主流的公共DNS基本上都是采用这种方案;
2、方案一屌丝版:用Bind配置多个view,不同view转发给不同的运营商DNS,原理同第一个方法,省去了部署多节点;
3、大牛版:根据谷歌的EDNS草案,自己编写程序,在DNS查询的附加字段中添加用户IP后进行递归,如果权威DNS也支持该草案,那么权威DNS会按照EDNS中附加的用户IP返回结果,而不是根据公共DNS的IP返回结果,从而实现智能解析。
目前好多现成的DNS服务器软件都提供EDNS-CLIENT-SUBNET支持,比如DNS界的老大Bind,但是你越深入,感受就越深刻,那就是Bind适合用来做权威DNS,而不是公共递归DNS!Unbound、pdns-recursor相较于Bind更适合做支持智能解析的公共DNS,但是你会无奈的发现当用户量较多时他们的解析结果会乱飘,比如移动用户的结果有可能被解析成电信用户的结果,后果就是移动用户打开某些网站要几分钟甚至直接打不开!本来为了加快访问而搭建的CDN反而拖慢了访问速度。这锅公共DNS得背着,我就问你伤不伤?当然也有可能是鄙人使用的方法不对,错怪了这些软件。
说了这么多,是时候把大牛写的神器分享出来了。
https://github.com/shawn1m/overture
项目主页上已经把使用方法和配置说得很详细了,这里就不多做介绍了。DNSPod解析为国外IP的域名及部分特殊域名会使用TCP协议向OpenDNS的443端口请求结果以返回无污染结果。
在这里可以下载编译好的程序:
https://github.com/shawn1m/overture/releases
解压后修改配置文件config.json,把119.29.29.29中的Policy字段值改为auto;
Windows系统直接双击运行,Linux系统直接利用nohup命令在后台运行即可。

评论回复

  1. 回复 匿名

    有固定IP和自已的服务器
    Overture加什么后或怎么配置也像Pure DNS能用来自动扶墙呢?

  2. 回复 匿名

    厉害了,只能看懂第一与第二种方案 :eek: (懒得打名字了)

  3. 回复 匿名

    可以写一份详细的DNS搭建教程吗?

  4. 回复 owen

    解析出来正确的 IP,但 IP 还是被封不能用

    • 回复 Dreamer

      @owengoogle、youtube的IP封锁严重,其他如facebook、tumblr等IP可正常使用。

  5. 回复 码农BTS

    诶嘿难得,封面图被你吃了?

  6. 回复 匿名

    :roll: 0计算机基础,所以根本看不懂overture写的啥。希望博主能直接提供配置文件,说好按什么命令,我照做就可以的这样的教程。在没看到你的dnsmasq教程前我根本就没想过我一个非计算机学生也能做dns :grin: 。所以在此无耻的伸个手,请博主尽快发布overture教程

    • 回复 Dreamer

      会考虑的,不过就是Overture还有好多问题,我本来是想等它足够完善再发教程的~~~

      • 回复 匿名

        @Dreamer
        能否分享一下Overture怎么设置SNI的呢?

  7. 回复 匿名

    :grin: 写的不错!

  8. 回复 阿道夫

    啊打发

  9. 回复 Xinger

    config.json的bindaddress怎么设置? 我想开放多个端口 比如53.443.5353

  10. 回复 3444

    运行窗口是不是要一直打开着??

  11. 回复 flash.cn是耻辱

    it is support sni?支持吗?

    • 回复 Dreamer

      这是讲DNS的,和sni没关系啊,非要关联的话也是可以用Overture将域名解析指向SNI代理服务器的IP上

  12. 回复 aaa

    有没有反代name server顺便修改ttl的方案

  13. 回复 Dreamer

    @aaa反代?这个做不到吧?只能在网关上去劫持,操作起来是比较麻烦的,正向代理就比较容易了,像dnsmasq等工具都有ttl相关配置。

4 + 2 =

回到顶部