Posted in Technology 进行吐槽

之前的文章介绍过在Openwrt配合Shadowsocks运行时,搭配使用chinadns清洗DNS的经验。chinadns构思精妙,确实是上佳之选,其原作者及openwrt分支的作者为自由做出的贡献不可磨灭。但是,chinadns也存在以下缺陷:

 

缓存有限,需要重复刷新

不支持0.0.0.0

一旦某台服务器(不论国内外)宕机,不可容错

 

其实解决这个问题早有完整的解法,包括dnsmasq引入常用的中国域名,或是写死在hosts文件里。这些方法不错,但是在大容量应用(如小企业环境中) 存在维护困难,性能吃紧等问题。另外5353端口不稳定,缓存不够的情况下解析仍然容易中断。最后,list文件需要手工更新,每次要向linux系统传文件,不符合路由器的应用性质。

 

我总结前人经验的基础上,使用常见的明月openwrt固件自带的pdnsd\dnscrypt-proxy解决此问题,可以轻量化维护工作,并减少机器的负担,降低维护成本。

 

步骤:

固件选用明月最新固件(或是自行安装pdnsd、dnscrypt-proxy openwrt分支),建议安装luci界面,方便维护。 由于ss依赖于chinadns/pdnsd中的一个,所以也许需要先打开chinadns,但是不使用它。

 

首先配置dnscrypt-proxy,难点在于解析器(reslover)的选择。由于支国特色,解析器不一定能用,选择opendns试试,不行再换。

Capture

 

DNScrypt-proxy运行后,请去系统日志中看其是否连接到了解析服务器,方法是“状态,系统日志” ,如果报错 dnscrypt-proxy : Unable to retrieve server certificates 说明解析器有问题。 此时请从路由器下载解析器列表  /usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv  自己寻找代替品,里面通常有几十个,记住解析器名称,填在最后一栏重启。直到成功连接 ,可在系统日志中看到成功的提示。

 

测试方法是: 下载dig, dig www.icann.org @127.0.0.1 -p 2053 ,看是否能返回显示。对于普通用户不知道什么叫dig的,就看系统日志中出现以下类似内容:

 

Apr 13 20:09:16 router daemon.info dnscrypt-proxy[779]: Refetching server certificates
Apr 13 20:09:17 router daemon.info dnscrypt-proxy[779]: Server certificate #1358460951 received
Apr 13 20:09:17 router daemon.info dnscrypt-proxy[779]: This certificate looks valid
Apr 13 20:09:17 router daemon.info dnscrypt-proxy[779]: Server key fingerprint is F0DA:9278:CC0F:CDF9:BAED:8A18:B9FD:E61C:6596:6D4A:432F:FCA3:390B:5A3A:6FA7:642F
Apr 13 20:09:17 router daemon.info dnscrypt-proxy[779]: Proxying from 127.0.0.1:40 to 208.67.220.220:443

 

即为成功连接。记住其端口为127.0.0.1:2053(如果你没改的话)

 

接下来打开pdnsd,直接给出配置文件:

#全局配置区域(请勿乱动)
global {
perm_cache = 4096;
cache_dir = “/var/pdnsd”;
run_as = “nobody”;
debug = off;
server_port = 8965; # 使用 8965 作为 dns 端口, 默认是 53
server_ip = 0.0.0.0; #配置到LAN
status_ctl = on;
query_method=udp_only; #  只使用UDP查询
neg_domain_pol = off;
paranoid = on;
par_queries = 1;
min_ttl = 6h;
max_ttl = 12h;
timeout = 10;
}

server {
label = “dnscrypt-local”; # 接入127.0.0.1 2053的DNSCRYPT-PXY
ip = 127.0.0.1; # 这里为上级 dns 的 ip 地址
port = 2053;
timeout = 5;
exclude = “.cn”, #排除国内DNS解析 最后一行后面加分号
.360buy.com”,
.alipay.com”,
.alicdn.com”,
.qiyi.com”,
.iqiyi.com”,
.sohu.com”,
.taobao.com”,
.tmall.com”,
.126.net”,
.126.com”,
.163.net”,
.163.com”,
.amap.com”,
.baidu.com”,
.bdimg.com”,
.bdstatic.com”,
.cnbeta.com”,
.cnzz.com”,
.douban.com”,
.gtimg.com”,
.hao123.com”,
.haosou.com”,
.ifeng.com”,
.iqiyi.com”,
.jd.com”,
.netease.com”,
.qhimg.com”,
.qq.com”,
.sogou.com”,
.sohu.com”,
.soso.com”,
.suning.com”,
.tudou.com”,
.weibo.com”,
.xunlei.com”,
.youku.com”,
.zhihu.com”,
.zhimg.com”,
.hdslb.net”,
.bilibili.tv”,
.bilibili.com”,
.ngacn.cc”,
.ngacn.com”,
.xueqiu.com”,
.imedao.com”,
.ip138.com”;

}

server {
# 被excluded的域名转入这里处理
label = “chinalocal”; # 这个随便写
ip = 223.5.5.5,223.6.6.6; # 这里为上级 dns 的 ip 地址
port = 53;
proxy_only = on;
timeout = 5;
}

source {
owner = localhost;
file = “/etc/hosts”;
}

rr {
name = localhost;
reverse = on;
a = 127.0.0.1;
owner = localhost;
soa = localhost,root.localhost,42,86400,900,86400,86400;
}

 

该配置文件策略为:

1, 端口在0.0.0.0:8965接受请求(方便内网外部客户访问,不需要可以改成127.0.0.1)

2,向刚才的dnscrypt-proxy 127.0.0.0:2053 请求DNS

3,缓存4096KB(路由器好的可以更大,缓存时间也可以更大)

4,排除全部CN域名以及40个常见中国域名

5,这些中国域名全部去223.5.5.5 解析 (可以自己改成自己ISP的)

 

执行后,PDNSD就在0.0.0.0:8965  监听DNS请求了。此时,将openwrt 的系统DNS调到这里,完毕。

Capture

 

简单维护:

遇到中国某些站不能用时,维护十分简单,打开openwrt的网页控制台,选择pdnsd,在列表中添加新域名即可。

 

 

 

 

 

 

 

打赏
2016年04月21日