用PDNSD + Google DNS 获得高速正确的dns解析

2012年4月16日 | 分类: 翻墙相关 | 标签: ,
首先必须要感谢Google 因为伟大的不仅是免费提供了8.8.8.8;8.8.4.4这两个域名服务器,而是同时提供了能够以TCP方式解析的Google DNS服务器。

摘dnsmasq那一篇的一段: 至于DNS在瓷器国被污染的这回事,不用多解释了,正确的DNS解析对于使用squid透明代理进行翻墙极为重要,因为在squid在收到http请求前,域名已经在客户端先解析了

因为TCP方式的查询DNS,不能被GFW污染!
我们来做一个实验:
首先,用 udp方式查询google dns:

再强制用tcp方式查询google dns

看出差别了么, 用tcp方式得到的解析结果完全不同于udp方式的。可悲的是系统默认的dns访问都是用udp进行的。

本文要讲解如何利用pdnsd + google dns 做局域网高速并正确的dns解析。

上一篇讲了利用DnsMasq来搭建正确解析的DNS服务器,但是,你有没有发现,dnsmasq并没有起到加速的作用。。。 没过几分钟,dig一下试试,响应时间又特别长了,刚开始的0ms响应时间不见了,又回到几百个ms了,慢,卡又回来了。

为什么?

答案是DNS服务的TTL,下面举例:

注意到了么 twitter.com 后面跟了个数字30,这个数字的单位是秒,也就是说twitter.com域名的A记录再过30秒就过期了,30秒后你就必须再从twitter.com 的SOA(主域名解析服务器)去重新获得twitter.com的解析,dnsmasq发现过期后,就会向你境外的服务器,再去取一次DNS解析。注意, 这次解析的时间是几百毫秒。这就是为什么慢!!!

甚至国内ISP的CDN,也用了很低的TTL值,这就导致了用dnsmasq访问各种网站都极慢。
你不妨dig一下static.t.126.net,或者网易的 img cache什么的。

问题是ISP为什么要用这么低TTL值呢?
答案是负载均衡,CDN可以动态去调整每个服务器的访问量。

你应该猜到了,根据以上分析, 优化dns响应时间,有两个途径:
1. 降低访问远程DNS服务器的时间。
2. 提高TTL值。

途径一,可以通过访问google dns实现,google dns是目前我这里ping值最低的能正确解析域名的服务器。

途径二,用pdnsd实现。

为什么放弃dnsmasq,因为dnsmasq既不能用tcp方式访问远程dns服务器,又不能修改TTL。
任何一条理由,你都必须放弃dnsmasq.

pdnsd 配置如下

global {
        perm_cache=4096;
        cache_dir=”/var/cache/pdnsd”;
#       pid_file = /var/run/pdnsd.pid;
        run_as=”nobody”;
        server_ip = any;
        status_ctl = on;
        paranoid=on;          
        query_method=tcp_only;  // 仅用TCP查询
        min_ttl=1d;             // 把ttl最小时间提升为一天 (1 day)
        max_ttl=1w;        # One week.
        timeout=10;        # Global timeout option (10 seconds).
        neg_domain_pol=on;
        udpbufsize=1024;   # Upper limit on the size of UDP messages.
}
# The following section is most appropriate if you have a fixed connection to
# the Internet and an ISP which provides good DNS servers.
server {
        label= “google dns”;
        ip = 8.8.8.8, 8.8.4.4;  # Put your ISP’s DNS-server address(es) here.
        timeout=4;         # Server timeout; this may be much shorter
                           # that the global timeout option.
        uptest=ping;         # Test if the network interface is active.
        purge_cache=off;   # Keep stale cache entries in case the ISP’s
                           # DNS servers go offline.
        edns_query=no;    # Use EDNS for outgoing queries to allow UDP messages
                           # larger than 512 bytes. May cause trouble with some
                           # legacy systems.
}

运行pdnsd,我们再试试dig twitter.com

看到了么 twitter.com后面的82504 这个数字,单位是秒,也就意味着一天之内都不用再去google dns查询了, pdnsd已经缓存了。

终于,我们期待的毫秒级的dns解析又回来了。

最后,以策万全,如果你有境外VPS,自己搭建域名解析服务器,以应对不知何时GFW干扰google dns tcp通信,是最佳的方式!


还是用 autossh 这个利器转发DNS数据包: 例如:

/usr/bin/autossh -M 21000 -f -N -C -c blowfish -m hmac-md5-96 -L 53:localhost:53 root@your_vps_ip -p22 -i /root/server_usa

原文http://bullshitlie.blogspot.com/2012/03/pdnsd-google-dns-dns.html

  1. hmw
    2012年4月19日13:29

    原来TTL和负载均衡有关系…..受教了,谢谢