使用国外 DNS 造成国内网站访问慢的解决方法

你是否是一个使用国外 DNS 的中国网民?你是否发现使用国外 DNS 之后访问某些国内网站奇慢无比?这不是 DNS 慢,而是电信到联通的线路太慢。如果你愿意小小地折腾一下,那么跟随本文,你可以解决这一问题。

一、为什么要用国外 DNS

由于众所周知的问题,国内 DNS 服务器解析国外网站会遭到 DNS 污染和投毒,使之解析到完全虚构的 IP 上,造成「开了 VPN 也没法访问 Twitter 或 Facebook」等问题。以下是一个例子:

wzyboy@vermilion:~$ dig twitter.com @8.8.8.8 +short199.59.148.82199.59.149.230199.59.148.10wzyboy@vermilion:~$ dig twitter.com @221.228.255.1 +short93.46.8.89

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 等「慢」,主要不是查询慢,而是电信到联通之间太慢。

当然了,如果硬要比较查询的话,倒也是会慢很少一点的:

;; 使用 8.8.8.8 解析 耗时 79 毫秒;; Query time: 79 msec;; SERVER: 8.8.8.8#53(8.8.8.8);; WHEN: Thu Sep 6 17:20:37 2012;; MSG SIZE rcvd: 143;; 使用中国电信 221.228.255.1 服务器解析 耗时 6 毫秒;; Query time: 6 msec;; SERVER: 221.228.255.1#53(221.228.255.1);; WHEN: Thu Sep 6 17:20:44 2012;; MSG SIZE rcvd: 284

别看 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-resolvno-pollserver=8.8.8.8server=8.8.4.4server=/cn/114.114.114.114server=/taobao.com/114.114.114.114server=/taobaocdn.com/114.114.114.114server=/tbcache.com/114.114.114.114server=/tdimg.com/114.114.114.114

第一行的no-resolv和第二行的no-pull让 dnsmasq 不要通过/etc/resolv.conf确定上游服务器,也不要检测/etc/resolv.conf的变化(因为我们就是要拿本机当服务器嘛),接下来两行指定 dnsmasq 默认查询的上游服务器,此处以 Google Public DNS 为例,喜欢用 OpenDNS 的也可以改 OpenDNS。接下来就是规定一张名单了,把一些国内网站的域名写在这里即可。比如server=/cn/114.114.114.114便是把所有 .cn 的域名全部通过 114.114.114.114 这台国内 DNS 服务器来解析,你也可以改成其他的国内 DNS 比如你的运营商提供的 DNS。接下来四行是淘宝的几个域名,让它们也通过国内的 DNS 服务器解析。

而只有在充满了艰辛的人生旅途中,

使用国外 DNS 造成国内网站访问慢的解决方法

相关文章:

你感兴趣的文章:

标签云: