Pdnsd 是用来缓存本地DNS信息的 DNS 服务器。和 BIND 和 dnsmasq 相比,Pdnsd 在重启之后依然可以保存 DNS 缓存,名字中的 p 表示 persistent。

Installation

Ubuntu/Debian 系下使用如下命名安装:

sudo apt install pdnsd

Ubuntu 18.04 中 pdnsd 似乎并没有在仓库中。

Configuration

默认配置地址 /etc/pdnsd.conf

下面配置示例,后面的分号不可缺少。

配置示例:

global {                                                                        
        perm_cache=1024;        # 要缓存多少DNS信息                                                
        cache_dir="/var/pdnsd";                                                 
#       pid_file = /var/run/pdnsd.pid;                                          
        run_as="nobody";                                                        
        server_port = 1053;                                                      
        server_ip = 127.0.0.1;  # Use eth0 here if you want to allow other       
                                # machines on your network to query pdnsd.       
        status_ctl = on;                                                         
#       paranoid=on;       # This option reduces the chance of cache poisoning   
                           # but may make pdnsd less efficient, unfortunately.   
#       query_method=udp_tcp;                                                    
        query_method=tcp_only;  # 使用 TCP 方式去查询 DNS 服务器                                                 
        min_ttl=15m;       # Retain cached entries at least 15 minutes. 缓存 DNS 最短有效期         
        max_ttl=1w;        # One week. 缓存 DNS 信息最长有效期                                           
        timeout=10;        # Global timeout option (10 seconds).                 
        neg_domain_pol=on;                                                       
        udpbufsize=1024;   # Upper limit on the size of UDP messages.            
}                                                                                

server {                                                                         
    label= "googledns";                                                          
    ip = 8.8.8.8, 8.8.4.4;                                                       
    timeout=30;                                                                  
    interval=30;                                                                 
    root_server = on;                                                            
    uptest = ping;                                                               
    ping_timeout=50;                                                             
    purge_cache=off;                                                             
    exclude=.cn, .douban.com, .taobao.com                                         
}             

Pdnsd 读取配置时,优先级从上到下,上面的 DNS 服务器配置优先于下一层。

DNS servers

pdnsd 需要至少知道一个上游 DNS 服务器用来收集信息

  • label,用来标示服务器,随意,但最好写上服务器名字
  • ip,DNS 服务器地址,可以分多行,也可以使用逗号分割

/etc/resolve.conf 中指定了一些DNS服务器地址,在配置 pdnsd 的时候,修改为

nameserver 127.0.0.1

测试

启动 pdnsd 服务

/etc/init.d/pdnsd start 
nslookup www.douban.com 127.0.0.1

或者

dig @localhost -p port www.douban.com

如果返回正常,和 webdnstools 比照,则说明配置成功

清空本地缓存

sudo pdnsd-ctl dump   # Print information stored in the cache about name.
sudo pdnsd-ctl empty-cache

查看端口占用

sudo netstat -anp | more

pdnsd 只能优化 DNS 解析,并不能避免 DNS 污染

reference