创建你自己的 DNS 缓存服务器

好长时间没写文章了,琢磨着写些啥。正好今天有个一个需求,需要自建 DNS 来避免污染。于是今天花了些时间,研究了下自建 DNS。也正好将一些过程与心得写下来,期间在两个发型版 ( CentOS 7、Gentoo ) 上尝试了下,正常使用。

自建 DNS 的方案可以多种搭配,不过如果项目团队内部使用的话,个人还是推荐 Dnsmasq + DNSCrypt-proxy 方案,小巧,部署方便。

工具清楚了,那么开始动手

DNSCrypt-proxy

在 Gentoo 下,已经有了现成的包,可以直接安装。

emerge -av net-dns/dnscrypt-proxy

在 Centos 下,没有现成的包,搜了一圈都没有,而我又是个洁癖症患者,非常不习惯直接 shell 脚本去编译安装,于是自己写了打包脚本 dnscrypt-proxy.spec,方便部署。如何通过 SPEC 来打包,可以查阅这篇文章的第二部分: CentOS 下打包 shadowsocks-libev,这里不再累述。

配置部分,比较简单,我打包的 CentOS 的配置文件地址在 /etc/sysconfig/dnscrypt-proxy,而 Gentoo 的配置文件地址在 /etc/conf.d/dnscrypt-proxy,打开后一目了然。两种配置方法,一种配置 resolver name,一种配置 resolver ip,将你选中的那种方案取消注释,再去 /usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv 文件中找一个 ping 值低的公开的认证服务器即可。

譬如我的:

$ cat /etc/conf.d/dnscrypt-proxy
DNSCRYPT_LOCALIP=127.0.0.1
DNSCRYPT_LOCALPORT=5355
DNSCRYPT_USER=dnscrypt
DNSCRYPT_OPTIONS="--ephemeral-keys"

DNSCRYPT_RESOLVERIP=178.216.201.222
DNSCRYPT_RESOLVERPORT=2053
DNSCRYPT_PROVIDER_NAME=2.dnscrypt-cert.soltysiak.com
DNSCRYPT_PROVIDER_KEY=25C4:E188:2915:4697:8F9C:2BBD:B6A7:AFA4:01ED:A051:0508:5D53:03E7:1928:C066:8F21

可以看到,配置中前面两行,监听 127.0.0.1:5355 的请求,你可以更改,只不过,后面 dnsmasq 的配置中你也要做相应的修改。

最后就是启动了

systemctl start dnscrypt-proxy.service
systemctl enable dnscrypt-proxy.service

Dnsmasq

Gentoo 与 CentOS 都提供现成的,可以直接安装:

Gentoo

USE="dnssec auth-dns" emerge -av net-dns/dnsmasq

CentOS

yum install dnsmasq

关于配置比较简单,1个目录,3个配置文件

没有的话则创建之,依次说明

dnssec
conf-file=/usr/share/dnsmasq/trust-anchors.conf
no-resolv
resolv-file=/etc/dnsmasq.reslolv.conf
no-poll
server=127.0.0.1#5355           # 上文中,dnscrypt-proxy 监听的 ip:port
listen-address=127.0.0.1        # 如果允许外网,则填写公网 ip,对内网提供,则填写内网 ip 地址,中间用逗号隔开
no-hosts                        # 不启用 /etc/hosts
addn-hosts=/etc/dnsmasq.hosts   # 启用自己的 hosts 配置
conf-dir=/etc/dnsmasq.d/,*.conf # 引入 /etc/dnsmasq.d/ 下所有的以 conf 结尾的配置文件

需要说明的是,CentOS 下,可能是版本过低,也可能是打包者没有开启某些开关,导致 dnssec 无法使用,所以,在 CentOS 下,需要注释两行

# dnssec
# conf-file=/usr/share/dnsmasq/trust-anchors.conf

最后,要低调撒播两个开源项目,众人拾柴火焰高:

他们的工作,让我们的配置得心应手,将两个项目 clone 下来:

OK,大体就这么些,再在目录 /etc/dnsmasq.d 下常见个 personal.conf,写入自己的一些特殊配置。

参考: