你是否是一个使用国外 DNS 的中国网民?你是否发现使用国外 DNS 之后访问某些国内网站奇慢无比?这不是 DNS 慢,而是电信到联通的线太慢。如果你愿意小小地一下,那么跟随本文,你可以解决这一问题。
一、为什么要用国外 DNS
由于众所周知的问题,国内 DNS 服务器解析国外网站会遭到 DNS 污染和投毒,使之解析到完全虚构的 IP 上,造成「开了 VPN 也没法访问 Twitter 或 Facebook」等问题。以下是一个例子:
Twitter 正确的 IP 地址应该是 199.59.148.0/24 里的那几个,但是如果用 221.228.255.1 这台中国电信的 DNS 服务器查询,查到的就是不知道什么鬼地址了,地理信息是在意大利,乱七八糟的。正是因为这样的 DNS 解析不正确的情况出现,不少人转而使用了国外的 DNS 服务器,如老牌的 OpenDNS 以及这几年新崛起的好记又好用的 Google Pulic DNS 即 8.8.8.8 和 8.8.4.4。使用它们进行查询,再配合以 VPN 或者浏览器的远程 DNS 解析,便可避免 DNS 污染的情况出现,从而解析出正确的地址。
此外,使用电信的 DNS 服务器,还可以避免烦人的「114 上网」页面
二、为什么使用国外 DNS 会「慢」
我是在「慢」上加了引号的,因为这其实不是国外 DNS 慢,而是你要访问的网站的 CDN 分配错误,慢。由于国内各大运营商之间的主干线带宽太窄,所以导致「最远的距离是从电信到网联通」,电信用户访问联通的服务器非常慢,联通用户访问电信的服务器也非常慢,相信这都是大家有体验的。因此,国内不少网站都用了双线 CDN,在电信的机房里放点服务器,再在联通的机房里放点服务器。运用智能 DNS 技术,当你访问网站的时候,DNS 根据你的来源 IP 判断你是电信用户还是联通用户,然后再返回相应的 IP 地址,这样你会访问到就近的、同运营商的服务器,访问速度就大大提升了。而如果使用国外的 DNS 的话,你的查询来源来自国外,国内网站的 DNS 无法判断你是电信用户还是联通用户,就胡乱分配你一个服务器。比如我是一个江苏电信的用户,但当我访问淘宝网的时候,淘宝的 DNS 把我解析到青岛联通的服务器上,奇慢无比。所以:
很多人认为 Google Public DNS, OpenDNS 等「慢」,主要不是查询慢,而是电信到联通之间太慢。
当然了,如果硬要比较查询的话,倒也是会慢很少一点的:
别看 6 毫秒和 79 毫秒差别很大的样子,但是人类是很难感觉出来的,而且,这只是查询时间,与实际的访问速度无关,就算你一整天都在刷 ,也就每小时慢个几百毫秒的样子,根本感觉不出来。真正慢的原因,还是上文所说的「电信到联通」的问题。
三、问题的解决思
现在问题明确了:使用国外 DNS 之后,查询来源变成国外的 IP,使用了 CDN 加速的国内网站的 DNS 会无法判断你的来源,胡乱给你分配一个地址,如果不是同一个运营商的,访问速度便会很慢。
那解决方案也就出现了:让国内网站的 DNS 服务器知晓你的来源,从而给你分配正确的服务器 IP。于是 Google 起草了一个专有协议,叫 EDNS,在 DNS 查询请求中包含源地址,这样淘宝就知道查询来源不是 Google 服务器,而是电信的某用户,就不会把你扔到联通服务器上了 。听起来很美好是吧?不过这个协议不,目前几乎没有人用,所以,问题丝毫没有解决。
新思是:访问那些会因 CDN 加速解析错误而极其缓慢国内网站的时候,直接向国内的服务器发送请求,让 DNS 知晓你的来源,给你分配个正确的 IP。访问其他网站的时候,再通过国外的 DNS 查询。
听起来很简单的样子,实现起来也不难:用 dnsmasq 在本地搭个 DNS 缓存服务器,哪些域名用哪个服务器查就好了。
四、安装及配置 dnsmasq 安装 dnsmasq
dnsmasq 是一个非常轻量的 DNS 缓存及 DHCP 服务器,在我的 Arch Linux 上只占用了 368 KiB 的磁盘空间,相比功能极其强大的 BIND9 来说小多了(BIND9 的安装体积是 6.23 MiB)。不光是体积小,它的功能也很,配置起来也是十分方便的,五分钟就可以搞定。
Ubuntu 12.04 及之后的版本应该自带了 dnsmasq。如果没有,可以使用 sudo apt-get install dnsmasq 安装。Arch Linux 直接 sudo pacman -S dnsmasq 即可。我的笔记本电脑需要给手机 DHCP 及 IP 转发用,因此早就安装了 dnsmasq,但是直到今天才想起这么用它
配置 dnsmasq
dnsmasq 的各参数可以通过 man dnsmasq 查看,配置文件中也有许多清晰明了的注释。默认的配置文件位于 /etc/dnsmasq.conf,打开它,可以更改这几个地方:
第一行的 no-resolv 和第二行的 no-pull 让 dnsmasq 不要通过 /etc/resolv.conf 确定上游服务器,也不要检测 /etc/resolv.conf 的变化(因为我们就是要拿本机当服务器嘛),接下来两行指定 dnsmasq 默认查询的上游服务器,此处以 Google Public DNS 为例,喜欢用 OpenDNS 的也可以改 OpenDNS。接下来就是一张名单了,把一些国内网站的域名写在这里即可。比如 server=/cn/114.114.114.114 便是把所有 的域名全部通过 114.114.114.114 这台国内 DNS 服务器来解析,你也可以改成其他的国内 DNS 比如你的运营商提供的 DNS。接下来四行是淘宝的几个域名,让它们也通过国内的 DNS 服务器解析。
这样分流操作之后,默认所有域名都通过 8.8.8.8 和 8.8.4.4 解析,但是所有的 .cn 域名以及淘宝的域名通过 114.114.114.114 这台国内 DNS 服务器解析。当然,除了淘宝网,你也可以添加更多的域名,根据自己的喜好,把经常访问,但是使用国外服务器解析到很慢的服务器上的网站域名都可以添加进去,不过:如果这个网站本身就只能一台服务器,没有 CDN 加速,那再怎么添加也是无济于事的,得让网站管理员去买双线机房另外,在写这篇文章的时候,发现 @felixonmars 了一张国内常用的、但是通过国外 DNS 会解析错误的网站域名的列表,据他所说,这是他在公司里部署这一套东西之后,公司里其他人报怨「慢」的网站域名收集来的,应该囊括了绝大多数有此问题的网站,值得依赖,欢迎选用。如果觉得直接把这么多域名加在 /etc/dnsmasq.conf 里不爽的话,可以在 dnsmasq.conf 里把 conf-dir=/etc/dnsmasq.d 这一行取消注释,然后把在 /etc/dnsmasq.d 里弄点列表。比如我就是把 @felixonmars 的列表放在 /etc/dnsmasq.d/china.conf 里。
配置好之后,保存,Ubuntu 可用 sudo service dnsmasq restart,Arch Linux 可用 sudo rc.d restart dnsmasq 重启 dnsmasq。如果没有错误的话,这时本地的 dnsmasq 已经跑起来了。
测试 dnsmasq
测试一下:
即可。Ubuntu 12.04 及以后的用户,可能需要对 resolv.conf 做一些手脚,具体参考这里。如果不愿意改的话,可能每次联网都要手工改一次 resolv.conf,或者在 NetworkManager 中手工指定 127.0.0.1 为 DNS。DHCP 用户的话,可以通过 /etc/resolv.conf.head 之类的文件来 127.0.0.1 在第一行。
这样配置完之后,如果你没有在 dnsmasq 里限定查询 IP,那么你的家人、朋友们也是可以把你的电脑作为 DNS 服务器的。如果你本地是 VPN 全局翻墙的话,需要把你选择的国内 DNS 服务器通过由表加入直连的范围内。当然,已经使用 chnroutes 的就不需要了。
五、我不是 Linux 用户怎么办? 如果你是 Windows 用户
参考这个问题,去配个 BIND9 的 Windows 版本试试吧。或者可以装个 dnsmasq 的 Windows 代替品。
如果你是 Mac OS X 用户
Mac OS X 的 resolver 比较独特,似乎有比较简陋的解决方法,参考这篇文章。另外,OS X 似乎也是自带 named 的,所以
其实还有更通用的方法
听说过 VirtualBox 吗?开源、免费、强大的虚拟机软件。可以装个最配置非常低下的虚拟机,比如 32 MiB 内存甚至 16 MiB 内存的虚拟机(要知道 64M 内存的 Linux 已经可以跑 WordPress 这庞然大物了),装个最简单的小 Linux,比如只有 37M 的 Ubuntu Core,然后装上依赖包几乎没有的 dnsmasq,再把 Windows / OS X 的 DNS 设为虚拟机的 IP 地址,于是便可以用了。在当今内存动辄 4 GiB 的情况下,拿 16MiB 内存出来换个更舒畅的上网体验,还是很不错的。
六、尾声
祝各位读者成功,上网愉悦。
补充:其实这样本地 DNS 缓存服务器,还有这样的好处:
推荐:
娃娃王爷无盐妃,强占契约妻,恶夜活死鸡图解,重生之我是步惊云,抛砖引玉打一生肖,冷面总裁笨蛋妻,天才丑女玩转校园,失婚总裁劫前妻,拉缘天堂,冲喜新娘赔心交易,酿酒皇后,欲色谷,主家教贝尔菲戈尔,晓声长谈在线直播,美人计苗亦有秀,甜妻不撒娇,极品白领后记,江山美人志女主角,掳情一夜成欢,爱妻慈蓝伶,琢本友希,小村春潮,七个相公够不够,烟绕寒天,穿越之蓝月皇后,村上里沙和金毛,王锡玄快乐大本营,倩女幽魂修为模拟器,刑警使命第二部,张良的表字,喜上加喜片尾曲,神雕之萧峰后人,部长夫人请息怒,魅惑暴王别宠我,垂悬腹,村上里沙帝王浴,魂断楼兰好看吗,豪门绝恋赎罪新娘,蓬松乳,痒孟楠,柴胡疏肝散 同仁堂,驯服坏坏太子,黑道冷枭的陪心交易,赤道和北极原唱,圣魔网,狼王宠奴,挽红楼之玉亦狂,茅道临是茅于轼儿子,素手华筝,徐其耀玩过的女人,新矿吧,kayden kross第八日,打飞机专用网,红楼旁观的平淡生活,首席执行官的合约情人,焰王的极品新娘,穿越人鱼之我要的幸福,冰山王妃邪魅爷,超幸福鞋垫三部曲,勒组词,一级片武则天,鸿钧现代生活录,现代豪侠传插曲,欲海逍遥,花间浪子,牛娃闯都市,诀别诗卓文君,悍马h10报价,高官前夫别来无恙,江陵肃是谁的孙子,落梅沁雪,恶少的毒爱,色五月 干什么,美少女被虐饲育记,隔世离空的红颜原唱,女总统音译歌词,女人你敢甩我,我的泪珠儿演员表,恶魔军官放我走,木已成舟下一句,暴露狂楠楠,365式性姿势,不想骗自己英文版,花开在古代,9a撸霸,残虐女犯人刑务所,血泣五胡,乔榛近况,综漫之逐艳曲,终极一班苏教官,吾组词,www.169mm.cc,恶女绿萍,盲目的救赎,徐其耀玩过的女人,村上真依,痒孟楠,天字号大纨绔,庞青云原型,风尘女教师,刘瑞龙简历,玩火娇妻,安住凉子,王爷的倔宠儿,169mm.cc,清穿之永日清茶,绝色倾权,青春出动吻戏,李富春简历,左葳葳,色少林,妓中技,punisher全cg存档,华能吧,东风东路小学班级网站,橘黄刺杯菌,冰峰魔恋mp3,武则天传位于谁,夏耕是谁的女婿,屎球吧,热吻野男人,曹征平简历,大铁人17号,翻身弃妇太撩人,网王之恋猫物语