使用Pdnsd缓存域名解析结果加快上网速度

  • 频繁的域名解析容易导致超时出错

    在执行 opkg-cl updateyaourt -Syua 命令更新系统软件信息时,容易因为频繁的域名解析而导致更新速度奇慢甚至是超时出错,通过将要访问的域名添加到 /etc/hosts 中,可以立即解决这个问题。考虑到服务器IP可能会换,使用 /etc/hosts 非长久之计。

  • 缓存域名解析结果

    更好的办法是缓存域名解析结果,一般来说后台服务程序可以通过缓存域名解析结果加快后继请求的处理,但是对于像 opkg-clyaourt 之类的工具程序,由于运行一次就退出了,要实现缓存域名解析结果就显得有点小题大作了,最好是在系统底层来实现,而不是每个应用程序都实现这个功能。

    Pdnsd 就是这样一款开源DNS代理服务程序,它安装在客户机上,对于客户端应用程序来说,它是DNS服务程序,对于真正的DNS服务来说它是DNS客户端程序。

  • Pdnsd 安装
    yaourt -S pdnsd
    
  • Pdnsd 运行
    sudo systemctl enable pdnsd
    sudo systemctl start pdnsd
    
  • 客户机DNS设置

    修改 /etc/resolv.conf 为如下内容:

    nameserver 127.0.0.1
    

    对于 Archlinux /etc/resolv.conf 是由 resolvconf 工具生成,直接修改后随时可能被覆盖,可以修改 /etc/resolvconf.conf 将以下配置行取消注释:

    # name_servers=127.0.0.1
    

    然后重新生成 /etc/resolv.conf 配置文件:

    sudo resolvconf -u
    
  • 看看效果

    多次执行下面的命令,可以感觉到后几次明显比第一次快,这就是DNS缓存在起作用。

    nslookup www.google.com
    
  • 适合国内环境的配置(仅供参考)

    /etc/pdnsd.conf 配置文件修改为以下内容:

    global {
        perm_cache=1024;
        cache_dir="/var/cache/pdnsd";
        pid_file = /var/run/pdnsd.pid;
        run_as="pdnsd";
        server_ip = 127.0.0.1;
        status_ctl = on;
        query_method=udp_tcp;
        min_ttl=15m;
        max_ttl=1d;
        timeout=10;
        neg_domain_pol=on;
        udpbufsize=1024;
    }
    
    server {
        label = "root-servers";
        root_server = discover;
        randomize_servers = on;
        ip = 114.114.114.114,
             223.5.5.5,
             114.114.115.115,
             223.6.6.6;
        timeout = 5;
        uptest = query;
        interval = 30m;
        ping_timeout = 50;
        purge_cache = off;
        exclude = .localdomain;
        policy = included;
        preset = off;
    }
    
    source {
        owner=localhost;
        serve_aliases=on;
        file="/etc/hosts";
    }
    
    rr {
        name=localhost;
        reverse=on;
        a=127.0.0.1;
        owner=localhost;
        soa=localhost,root.localhost,42,86400,900,86400,86400;
    }
    

    重启 Pdnsd 生效配置:

    sudo systemctl restart pdnsd
    
  • 配置pdnsd使用dhcp分配的dns服务器

    往往dhcp提供的dns服务器是最快的(它可能也做了缓存),用到了本地域名的情况下必须使用dhcp提供的dns服务器, 如果将dns服务器写死在pdnsd.conf,切换网络(如从公司回到家里)就上不了网了,其实 resolvconfpdnsd 提供了支持。

    参考 man resolvconf/etc/resolvconf.conf 改为

    name_servers=127.0.0.1
    pdnsd_conf=/etc/pdnsd.conf
    

    删掉 /etc/pdnsd.conf 中的所有 server 配置块。

    重启 NetworkManager 生效配置

    sudo systemctl restart NetworkManager
    

    现在 /etc/pdnsd.conf 中的 server 配置块将由 resolvconf 来提供。

  • 参考

    用Pdnsd快速打造无污染高速缓存DNS服务器