注:新版dnsmasq已经可以手动设置min-ttl和cache-size,使用pdnsd替代dnsmasq已经无太大意义;dnsmasq设置方法,在 /etc/dnsmasq.conf 中加入:
1 2 |
cache-size=10000 min-cache-ttl=1800 |
此篇文章说明使用缓存功能更加强大的pdnsd来代替openwrt自带的dnsmasq完成dns解析功能,从而改善解析速度的方法。本篇内容和科学上网没有关系!
OpenWRT默认使用dnsmasq提供DHCP/DNS服务,通常情况下够用。但在某些特殊情况下,DNS查询延迟较大,dnsmasq对于DNS记录的缓存时间、还有缓存文件大小都比较受限,一条记录可能没多久就被清除出缓冲区,失效了。这时我们就希望有一个缓存功能更强的DNS软件,可以手动改大TTL、增大缓存文件大小。这时就可以用pdnsd。你可以配置它,让TTL超期的记录也不被自动清除、可以提高TTL的最小值等等。同时也有完整的可用性检查,你可以配置对DNS服务器的可用性检查,如果一组DNS服务器不可用,可以做故障切换,切至你添加的另一组DNS(比如说你用你的VPS做解析,VPS挂掉了,这时自动切到114DNS或者Google DNS等)。
一、安装
可以直接在Luci界面中,切至软件包配置页面,刷新列表后,键入pdnsd点击安装即可。
也可以使用SSH安装。CC15.05开始,官方源中不再包含pdnsd,请自行到官网的BB14.07版本下对应packages\oldpackages目录下下载对应的pdnsd包手动安装。
1 2 |
opkg update opkg install pdnsd |
二、配置
配置/etc/pdnsd.conf,文件配置分为数个区域,主要修改global区域和server区域,其他区域保留默认值即可。具体的配置文件详情请查阅官方文档:pdnsd Documents
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# 这里是全局设置区域,酌情修改 global { perm_cache=2048; # 缓存文件大小,单位KB cache_dir="/var/pdnsd"; # 缓存文件位置,保留默认 # pid_file = /var/run/pdnsd.pid; # pid文件,不用管 run_as="nobody"; # runas,保留默认 server_ip = 0.0.0.0; # 监听所有 status_ctl = on; # 保留on # paranoid=on; # This option reduces the chance of cache poisoning # but may make pdnsd less efficient, unfortunately. query_method=udp_only; # 只使用UDP,保留默认 min_ttl=1h; # 最小TTL时间,自己酌情往上加,默认是15分钟 max_ttl=1w; # 最长TTL时间,默认一周 timeout=10; # 全局超时时间,默认10秒,酌情修改 neg_domain_pol=on; # 用到neg domain的话可以试试,不用就不用管 udpbufsize=1024; # 默认 } # 这个是server区域,可以定义多组,定义pdnsd的上游dns server { label= "chinadns"; # 为这组server起一个名字 ip = 3.4.5.6; # 填写DNS的IP地址,多个地址逗号分隔,可以换行,分号结尾 port = 5353; # 填写DNS的端口,我这里上一级是3.4.5.6,监听的5353 # 如果使用114DNS等公共 DNS 这里端口号应该是53,或者删除该行也行 # proxy_only=on; # Do not query any name servers beside your ISP's. # This may be necessary if you are behind some # kind of firewall and cannot receive replies # from outside name servers. timeout=4; # 超时值,酌情修改 uptest=none; # 是否进行可用性检查,none=不检查,具体方法看官方文档 interface=eth0; # 可用性检查所用的interface名 interval=10m; # 检查频率 purge_cache=off; # 如果off,pdnsd不会主动清除缓存中过期的项目 除非缓存满了 edns_query=on; # 是否使用edns } |
如果不用到其他的server,请确保文件其他的server{}被删除掉或者注释掉
最后,把dnsmasq的dns服务端口改成别的,把53留给pdnsd,反正不是53而且不和其他程序冲突就行了,可以在Luci里面修改(你也可以改/etc/dnsmasq.conf):
为了避免改了dnsmasq的dns服务端口后,连接路由器设备无法正常从dhcp服务获取dns服务器地址,还要一步额外的配置,在luci中点击“接口”,然后点击LAN口右边的修改,下方的DHCP服务器中,切至高级设置,在
三、启动
给pdnsd设置开机启动:
1 |
/etc/init.d/pdnsd enable |
也可以在Luci的启动项配置页面找到pdnsd,将开机自动从禁用改成启用
最后,重启一下路由,应该就好了。
PS:如果出现问题,排查DNS问题推荐使用DIG工具:为Windows添加DIG等DNS工具
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
dig www.youtube.com ; <<>> DiG 9.10-P1 <<>> www.youtube.com ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4971 ;; flags: qr rd ra; QUERY: 1, ANSWER: 12, AUTHORITY: 0, ADDITION ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;www.youtube.com. IN A ;; ANSWER SECTION: www.youtube.com. 61398 IN CNAME youtube-ui.l.google.com youtube-ui.l.google.com. 98 IN A 173.194.117.233 youtube-ui.l.google.com. 98 IN A 173.194.117.238 youtube-ui.l.google.com. 98 IN A 173.194.117.230 youtube-ui.l.google.com. 98 IN A 173.194.117.232 youtube-ui.l.google.com. 98 IN A 173.194.117.224 youtube-ui.l.google.com. 98 IN A 173.194.117.226 youtube-ui.l.google.com. 98 IN A 173.194.117.229 youtube-ui.l.google.com. 98 IN A 173.194.117.225 youtube-ui.l.google.com. 98 IN A 173.194.117.227 youtube-ui.l.google.com. 98 IN A 173.194.117.231 youtube-ui.l.google.com. 98 IN A 173.194.117.228 ;; Query time: 161 msec ;; SERVER: 192.168.1.1#53(192.168.1.1) ;; WHEN: Sun Nov 16 00:37:18 UTC 2014 ;; MSG SIZE rcvd: 254 |
引用: 玩转 Shadowsocks | Archnotes
引用: Homepage