使用dnscrypt-proxy v2.x和Unbound搭建更好用的 DNS 服务器


需要的程序:

dnscrypt-proxy v2.x

unbound


DNSCrypt-proxy的配置

修改文件/usr/local/etc/dnscrypt-proxy.toml,

127.0.0.1:5353 就是下面 unbound 的配置里 DNSCrypt 的监听地址。


Unbound的配置

修改文件/usr/local/etc/unbound/unbound.conf。没有这个文件的话,一般需要找一下。


软件包里提供的配置 example 文件复制过去。这里列出的仅包含需要修改的部分,


其他的按照默认配置一般没有问题。

 

num-threads: 2 # 线程数可以修改为物理核心数

interface: 0.0.0.0 # 侦听所有 IPv4 地址

interface: ::0 # 侦听所有 IPv6 地址

# 如果只需要本机使用,则一个 interface: 127.0.0.1 即可

so-rcvbuf: 4m

so-sndbuf: 4m # 本机使用的话,这俩 buf 可以取消注释

so-reuseport: yes # 如果开了多线程,就写 yes

msg-cache-size: 64m # 本机可以设置 4m 或者更小

rrset-cache-size: 128m # 本机可以设置 4m 或者更小

cache-max-ttl: 3600 # 建议设置一个不太大的值...专治各种运营商 DNS 缓存不服

outgoing-num-tcp: 256 # 限制每个线程向上级查询的 TCP 并发数

incoming-num-tcp: 1024 # 限制每个线程接受查询的 TCP 并发数

# 下面这四个不需要解释了吧,不想用那个就写 no

do-ip4: yes

do-ip6: yes

do-udp: yes

do-tcp: yes

tcp-upstream: no # 默认是 no,隧道状态比较稳的话也不需要写 yes。一些情况下强制使用 tcp 连上游的话写 yes

access-control: 0.0.0.0/0 allow # 本机用的话建议设置 127.0.0.0/8 allow,局域网用适当调整

root-hints: "/etc/unbound/root.hints" # 没有的话在 ftp://FTP.INTERNIC.NET/domain/named.cache 下载一份

hide-identity: yes # 不返回对 id.server 和 hostname.bind 的查询。

hide-version: yes # 不返回对 version.server 和 version.bind 的查询。

# 不过下面有 identity 和 version 的自定义选项,不隐藏这些的话,修改下选项还可以卖个萌(´・ω・`)

harden-glue: yes # 建议打开

module-config: "iterator" # 禁用 DNSSEC 检查,如果上游不支持 DNSSEC 就关掉。注意这个选项有可能在其他 include 的文件里

unwanted-reply-threshold: 10000000 # 针对各种网络不服,数值为建议值,具体可以自己修改看看效果

do-not-query-localhost: no # 一般是为了防止扯皮丢包开着,不过等下要用 DNSCrypt 所以关掉

prefetch: yes # 蛮好用的,开着吧

minimal-responses: yes # 省带宽,开着吧。本机用可以关掉

# 关键部分来了,把默认查询全部丢给 DNSCrypt。使用 [地址]@[端口] 指定查询地址和端口,默认端口 53。

# 然后把国内的地址丢给国内的缓存服务器。这两个选项的顺序不能错哟。

# 如果使用隧道查询,把这个地址改为隧道对端的地址,或者一个国外的 DNS 服务器都可以,例如 8.8.8.8。

# 具体看是在对端开 DNS 还是直接用国外的服务器。后者的话,前面 outgoing-interface 可以直接设置隧道本地端的地址,

不过要配合 dnsmasq-china-list 的话,还是写路由表比较合适,否则不够灵活。

include: "/etc/unbound/accelerated-domains.china.unbound.conf"

forward-zone:

    name: "."

    forward-addr: 127.0.0.1@5353

如果需要 edns-client-subnet 支持的话,需要手动编译源码安装。命令:

# 克隆源码

svn co http://unbound.nlnetlabs.nl/svn/branches/edns-subnet/

# 编译安装

./configure --enable-subnet --with-libevent && make && sudo make install

配置文件的格式:

# 默认向所有服务器发送 edns-client-subnet

send-client-subnet: 0.0.0.0/0

如果只对特定权威 DNS 发送 edns-client-subnet 请求,则按照此格式写多行 IP.

----------------------------------------------------

 

brew install dnscrypt-proxy ,安装完成后,可执行文件为

/usr/local/bin/dnscrypt-proxy


配置文件为/usr/local/etc/dnscrypt-proxy.toml

(如果/usr/local/etc/里面没有dnscrypt-proxy.toml,那么

cp /usr/local/Cellar/dnscrypt-proxy/2.0.19/.bottle/etc/dnscrypt-proxy.toml /usr/local/etc/


nano /usr/local/etc/dnscrypt-proxy.toml

修改后的一些地方:

ipv4_servers = true

 

ipv6_servers = false

 

dnscrypt_servers = true

 

doh_servers = true

 

require_dnssec = false

 

require_nolog = true

 

require_nofilter = true

force_tcp = true

 

proxy = "socks5://127.0.0.1:1080"

 

ignore_system_dns = true

 

修改完成后,你需运行一个本地的socks5代理服务器程序,比如ssh tunnel.

sudo dnscrypt-proxy -config /usr/local/etc/dnscrypt-proxy.toml