用了好久的 DNSMasq 方案终于在大半年前彻底炸掉了。
原因不光是 DNSMasq 性能和安全性完全不足以撑起公网缓存/递归 DNS 的任务,也有想要做反污染和加速的时候确实太蛋疼的问题。
现在使用的方案是 Unbound+DNSCrypt,外带一份加速列表。这段时间看来,不管在我本机还是在公网服务的两台,效果和反馈都很不错。
准备工作
需要的程序:
- unbound
- dnscrypt-proxy
- makefile
- git
makefile
和 git
用于处理 dnsmasq-china-list。
Unbound 配置
修改文件 /etc/unbound/unbound.conf
。没有这个文件的话,一般需要找一下软件包里提供的配置 example 文件复制过去。这里列出的仅包含需要修改的部分,其他的按照默认配置一般没有问题。
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 36 37
| num-threads: 2 interface: 0.0.0.0 interface: ::0
so-rcvbuf: 4m so-sndbuf: 4m so-reuseport: yes msg-cache-size: 64m rrset-cache-size: 128m cache-max-ttl: 3600 outgoing-num-tcp: 256 incoming-num-tcp: 1024
do-ip4: yes do-ip6: yes do-udp: yes do-tcp: yes tcp-upstream: no access-control: 0.0.0.0/0 allow root-hints: "/etc/unbound/root.hints" hide-identity: yes hide-version: yes
harden-glue: yes module-config: "iterator" unwanted-reply-threshold: 10000000 do-not-query-localhost: no prefetch: yes minimal-responses: yes
include: "/etc/unbound/accelerated-domains.china.unbound.conf" forward-zone: name: "." forward-addr: 127.0.0.1@5353
|
DNSCrypt 配置
修改文件 /etc/default/dnscrypt-proxy
。
1 2
| DNSCRYPT_PROXY_LOCAL_ADDRESS=127.0.0.1:5353 # 设置侦听在 127.0.0.1 端口 5353。 DNSCRYPT_PROXY_RESOLVER_NAME=cisco # cisco 其实蛮快的,但是慢的话就去用个别的吧。d0wn 的那堆服务器真的不稳定,和名字一个样...
|
如果使用 systemd 的话这个文件就没用辣,看这里看这里
修改文件 /usr/lib/systemd/system/dnscrypt-proxy.socket
。
要修改的部分:
1 2
| ListenStream=127.0.0.1:5353 ListenDatagram=127.0.0.1:5353
|
127.0.0.1:5353
就是上面 unbound 配置里 DNSCrypt 的监听地址。
dnsmasq-china-list 来加速
首先 clone 这个仓库到本地。
执行 make unbound
来生成一份 unbound 配置,然后放在上面 unbound 配置里写的地址,也就是 /etc/unbound/accelerated-domains.china.unbound.conf
。默认的 DNS 是 114DNS,最不太近的一段时间都挺残的所以不建议用。如果要改为其他的,例如 DNSPod PublicDNS 的话使用 make SERVER=119.29.29.29 unbound
即可。
如果还需要一些特定的缓存上游设置,要放在 include: "/etc/unbound/accelerated-domains.china.unbound.conf"
这句前面。来举一只栗子。
举一只果子的栗子。
AppStore 的加载和下载速度一直在国内饱受一些极客们的诟病,然而同时饱受诟病的运营商 DNS 解析 AppStore 的下载地址反而是国内的 CDN 地址,速度会非常快。
需要使用 dig
工具,并且要在国内的网络环境下测试。Linux 发行版里都有包可以装,OS X 则自带。
第一条命令:dig +trace a100.phobos.apple.com.
递归追踪解析结果,这个记录被 CNAME 到了 a100.phobos-apple.com.akadns.net.
。
第二条命令:dig +trace a100.phobos-apple.com.akadns.net.
,得到这条记录被 CNAME 到了 a1-a200.itunes-apple.com.akadns.net.
。
第三条命令:dig +trace a1-a200.itunes-apple.com.akadns.net.
,看到了 CDN 的地址,a1-a200.phobos.apple.chinacache.net.
。
所以如果有国内的地址直接去跟踪解析 akadns.net
的 DNS 的话,一般是可以正确解析到国内 CDN 的。先找一个 akadns.net
的权威 NS 地址,比如 a1-128.akadns.net
对应的 IP 是 193.108.88.128
。同时还得有国内的 CDN 地址也从国内地址去解析,那么配置里这样写:
1 2 3 4 5 6
| forward-zone: name: "akadns.net." forward-addr: 193.108.88.128 forward-zone: name: "chinacache.net." forward-addr: 119.29.29.29
|
多次尝试之后,发现还有一个 CDN 地址 0gq2p7eckbs26f.mwcname.com
,那么也把这个地址交给 unbound 通过国内网络解析。
1 2 3
| forward-zone: name: "mwcname.com." forward-addr: 119.29.29.29
|
一并加到上面的配置里,然后来测试下。
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
| Phoenix-X1-Carbon :: ~ » dig @127.0.0.1 a100.phobos.apple.com
; <<>> DiG 9.10.3-P4 <<>> @127.0.0.1 a100.phobos.apple.com ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24454 ;; flags: qr rd ra; QUERY: 1, ANSWER: 14, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;a100.phobos.apple.com. IN A
;; ANSWER SECTION: a100.phobos.apple.com. 3596 IN CNAME a100.phobos-apple.com.akadns.net. a100.phobos-apple.com.akadns.net. 117 IN CNAME a1-a200.itunes-apple.com.akadns.net. a1-a200.itunes-apple.com.akadns.net. 297 IN CNAME a1-a200.phobos.apple.chinacache.net. a1-a200.phobos.apple.chinacache.net. 1799 IN CNAME a1-a200.phobos.apple.cncssr.chinacache.net. a1-a200.phobos.apple.cncssr.chinacache.net. 1799 IN CNAME cc00109.h.cncssr.chinacache.net. cc00109.h.cncssr.chinacache.net. 120 IN A 223.99.228.87 cc00109.h.cncssr.chinacache.net. 120 IN A 113.207.33.15 cc00109.h.cncssr.chinacache.net. 120 IN A 113.207.33.12 cc00109.h.cncssr.chinacache.net. 120 IN A 202.110.80.14 cc00109.h.cncssr.chinacache.net. 120 IN A 61.179.105.154 cc00109.h.cncssr.chinacache.net. 120 IN A 61.179.105.7 cc00109.h.cncssr.chinacache.net. 120 IN A 119.188.138.172 cc00109.h.cncssr.chinacache.net. 120 IN A 120.192.248.195 cc00109.h.cncssr.chinacache.net. 120 IN A 221.181.39.76
;; Query time: 233 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Thu Apr 28 00:34:02 CST 2016 ;; MSG SIZE rcvd: 387
|
走国内 CDN 了吧~
重启相关服务,更改自己所用的 DNS 地址,完事儿收工(「・ω・)「
=== 2016-04-30 14:00 更新 ===
如果需要 edns-client-subnet
支持的话,需要手动编译源码安装。命令
1 2 3 4
| svn co http://unbound.nlnetlabs.nl/svn/branches/edns-subnet/
./configure --enable-subnet --with-libevent && make && sudo make install
|
配置文件的格式
1 2
| send-client-subnet: 0.0.0.0/0
|
如果只对特定权威 DNS 发送 edns-client-subnet 请求,则按照此格式写多行 IP。