2022年3月12日

技术教程 在Ubuntu上部署你自己的DNS服务器

作者 TheWhiteDog9487

首先说一下,这次的DNS服务器的重点是代理解析,而不是自己设定一些域名的解析结果。其目的是反污染(不只是长城,还有ISP。比如说中国移动的IPv6 DNS把一大堆网站解析成[::1]),如果你的目标重点是创建自定义的域名DNS解析,那本篇文章可能不适合你。

这次我要介绍的是SmartDNS,能够很完美地完成咱们本次的目标
它的基本工作过程就是代理(遇事不决全转发),看这个:


首先咱需要一台服务器,这个应该不需要我说了
这次我拿我熟悉的Ubuntu来举例(测试版本Ubuntu 20.04 LTS)
首先登录到你的服务器上,最好是root,没有root但是有sudo的话可以sudo su提权。如果你用普通用户的话要注意如果提示权限不足就自己把权限提上去,我后面就不会说了
登录上去之后我们需要下载SmartDNS并安装,Ubuntu可以用现成的deb包

可以用wget直接下载到服务器,比如我这里可以这样:

wget https://github.com/pymumu/smartdns/releases/download/Release35/smartdns.1.2021.08.27-1923.x86_64-debian-all.deb

如果你服务器连接Github有问题你可以先下载到你电脑上然后传到服务器上

安装deb包用dpkg,像这样:

SmartDNS默认只有一个配置文件,是/etc/smartdns/smartdns.conf,我们可以用nano编辑,像这样:

nano /etc/smartdns/smartdns.conf

这配置文件几乎不怎么需要改,而且每个配置项都有注释,自己按照需要改一下就行,我给个例子:
(我有些参数也玩不来,所以这次我的目标只是能用,加密那些我自己服务器都不知道生效没我也没法测试,所以那些就不管了)

这四条server指令随便找个地方加就行,默认配置文件绑定了IPv4和IPv6的本机地址,也就是这个:

这个不用管,协议六绑定之后协议四也自动被绑定了,你手动去加一个协议四的绑定反而会出问题
nano编辑器用Ctrl+O保存,不用改文件名就回车,然后Ctrl+X退出编辑器

然后一套组合拳干掉systemd-resolved并且让SmartDNS重载配置文件,为啥禁用systemd-resloved下一篇文章我会详细讲,在这里暂且不说,你现在只要知道不禁用systemd-resolved你服务器作为DNS客户端就要出大问题

然后修改/etc/resolv.conf,默认是这样的:

nameserver那里改成一个公共DNS的地址,比如这样:

一样的方法,保存
没啥问题的话用reboot重启下服务器,然后就可以测试了
哦对了记得放行服务器DNS端口,没开ufw的话不用管ufw,服务器提供商那里如果还有防火墙也要调一下,这个端口默认是UDP 53,端口可以在配置文件里面修改bind [::]:53来改
服务器提供商的,比如这样:

在这之后就可以在自己电脑上测试啦!像这样:

记得用server指令指定自定义DNS服务器,然后测试一个域名,只要有回复那就成了(全是超时可不行哦)
如果连这一步都没有问题,那就可以投入使用了,完成了。把要使用这个DNS的设备的DNS服务器设置为你服务器的IP就行

注意吼,如果是bilibili或者YouTube这种有分布式数据中心的网站,默认情况是DNS服务器返回离请求者距离最近的IP,举个例子:
我的网站有三个数据中心,一个在北美一个在欧洲一个在亚洲,如果我从中国连接我的网站,很明显连接亚洲的数据中心的速度最快,所以我会让DNS服务器返回亚洲数据中心的IP地址。
但是这就产生了一个问题:如果引入代理服务器会发生什么情况呢?
那就要看你服务器在哪里了,还是这个例子,我让我在南美洲的服务器搭建SmartDNS代理DNS请求,但我人在中国。我本身是期望连接速度最快的亚洲数据中心,但是我服务器在南美洲,很明显服务器离北美的数据中心最近,所以DNS服务器返回了北美数据中心的地址,然后我服务器原封不动地转述了给我,导致我浏览速度变慢。
这个问题我这没什么好的解决方案,只能看你服务器情况你能不能接受了