最后更新于
最后更新于
在VPS服务器上安装AdGuard Home也就是自建公共DNS服务器了,对于大多数人来说可能并没有这个需求但是对我来说确实是刚需了(说出来可能有点奇葩,因为有些游戏看广告给奖励,然后配置AdGuard的DNS服务可以直接跳过,也就是拦截广告,直接就给奖励,简直不要太爽)
其实也没非要自建,因为AdGuard直接提供了一个定制化DNS服务,官网:,个人用户免费一个月30万次请求,平均一天1万次也算勉强够用(如果想用这个又担心请求量不够用的可以看我们workers章节的解决方案),我本来也一直用的这个服务,但是这个服务要么一定要通过加密DNS(也就是DoH,DoT,DoQ等),这些没法直接从系统层面配置,必须要用客户端,要么用不加密的IP连接可以在系统设置,但是我们设备的公网IP一直在发生变化,配置起来会非常头大,折腾了好久,连DDNS都配置了(但是DDNS又只能在路由器配置,你用流量5G的时候就没用了),还是非常闹心,而我们配置DNS就是为了省心,所以就干脆直接自建DNS服务了
本文主要参考文献:官方wiki的Docker部署配置:,少数派教程:,但还是有很多细节摸索了很久经过了好几次修改才终于配置成功,我们也找了很多很多资料,本教程大概是全网最详细的了(应该没有之一)
首先拉取镜像和创建配置文件存放的文件夹(之后如果需要修改配置文件都要到这里修改并且stop\start容器才能生效):
然后如何建立容器就很关键了,官方给的命令是:
这里我们需要注意的主要是两个地方,第一我们建立的文件夹跟官方不同,要修改目录,第二官方把所有可能用到的端口都建立了,会占用大量的端口的同时还可能跟其他服务冲突,然后我们仔细研究了官方的端口介绍,官方文档如下:
这里的关键在于,53端口作为常规DNS端口是一定要用的(这很关键,网上很多教程说可以自己随便改端口,是可以,但是问题在于你客户端的系统设置里面往往不允许自定义端口,DNS服务直接锁死53端口,你服务端修改端口有什么用呢),当然如果实在由于各种原因不想用53端口也是可以的,我们最下面使用10天后更新中会讲(但是服务端不用53端口并不代表你可以不开放53端口,具体看后面);
67、68、5443端口是用来建立DHCP和AdGuard服务用的,如果你是在局域网下构建内网AdGuard Home服务可能会用到,我们在VPS上建立公共服务是完全用不到的可以直接删除;
80、443、3000端口用来访问后台管理界面,但是80、443会跟Nginx服务冲突,而且我们后面会直接用3000端口作为后台管理界面,所以80、443端口也不需要;
443、853端口用来运行加密的DoH,DoT,DoQ服务,如果需要则保留,不需要则删除,我个人不需要所以也可以删除;
6060端口用来调试配置文件,我们也不需要可以直接删除
所以我们修改后的完整的配置文件如下:
在这个配置文件中我们保留了大家可能需要的网页服务和加密DNS服务,但是我们不需要所以还可以进一步精简如下:
这样我们又删除了80、443、853端口,相当于只保留了53常规公共DNS服务和3000后台管理界面,但是在下一步配置之前我们还需要注意,因为53端口作为DNS服务端口会被系统自带的DNS服务占用,所以会导致端口冲突,ubuntu下可以用命令netstat -tunlp | grep 53
查看53端口占用情况,一般都会被系统服务systemd-resolved占用,我们可以用systemctl stop systemd-resolved.service
命令暂时禁用系统DNS服务,不过这个命令只是暂时的(当然对我们接下去的配置暂时也不会有什么问题),重启之后系统又会开启,所以我们需要修改resolved.conf 配置文件使其以后也不会再占用53端口,打开/etc/systemd/resolved.conf文件,修改以下两项(注意要取消注释,第一项直接随意指定几个公共DNS服务或者本地地址,第二项禁用DNS监听):
修改后理论上systemd-resolved服务不会再监听53端口,可以重新启用(先用命令ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
再用systemctl restart systemd-resolved.service
启动),但是我们都使用AdGuard Home来作为DNS服务器了,其实也不需要这个服务了,不启用也可,然后进入ip:3000进行初始化配置,注意这里也非常关键,因为我们在配置的时候没有截图所以借用了少数派的图,配置大同小异(理论上我们的IP没有那么多,只有127.0.0.1和容器的内部IP),网页端口一定要修改成3000,不然以后会进不去管理界面!DNS服务器端口还是53,如果还遇到占用就用上面的步骤找出占用程序并禁用即可
初始化配置完成后就可以用Nginx反代3000端口(上面的章节讲过)然后直接用域名访问后台管理界面了,这个时候配置成功的话我们的VPS IP已经可以直接作为公共DNS服务来使用了,我们可以直接去路由器修改DNS服务了,当然我们还需要进一步对AdGuard Home配置:
常规设置参考:
浏览安全是建议开启的,他会拦截诈骗网站,但是仍可以手动跳过,日志和统计建议保留七天,因为当文件过大时读写速度会有所减慢,会拖慢整体服务速度(毕竟一般VPS配置都很低,我们还要跑很多其他的服务,资源能省就省吧);DNS配置参考:
后面的加密、客户端、DHCP设置我们不需要,DNS黑名单配置参考(也就是广告过滤的核心):
我这里用了AdGuard的默认DNS清单和两个专为中国定制的CHN清单,这三个清单都在官方列表中可以直接添加,一般来说这三个就已经够用了,而且匹配DNS规则是需要使用主机性能的,不建议设置太多,当然初期可以多设置几个,然后同理到主面板看哪些规则命中最多,把无用的规则删除即可。我们配置了以下这些额外的规则清单大家可以参考(最上面那个少数派的教程中列举了很多清单大家也可以参考):
DNS白名单和DNS重写还有自定义规则大家可以根据需求自定义,已阻止的服务也非常好用,比如舍友一直开黑大吼大叫可以直接一键把LOL禁了哈哈哈。
配置到这里就基本完成了,可以给大家看看在我这样的配置下,大概五六台设备连接DNS正常上网的情况下AdGuard Home的资源占用情况(其实还是不低的,超低配VPS就不建议安装了,当然后期我们会减少上游DNS配置以及广告拦截清单的数量,还可以减少一些资源占用):
所对应的AdGuard Home的工作情况(我只配置完成不到三小时,接近30%的拦截率也可以反映效果很好,以及我们的日常网络活动几乎已经被广告填满了;另外,我的VPS在美国德州还能达到平均114ms的处理时间还是挺不错的):
其他注意事项:
如果直接把路由器的DNS配置成VPS的公网IP,还是强烈建议大家要加一个国内的备选DNS如223.5.5.5,毕竟党开大会的时候封杀很严格,一旦IP被封整个网络就宕机了;而且在首选DNS可用的情况下一般不会用备选,所以也不影响我们平常使用
AdGuard Home的上游DNS请求有三种工作模式,在不同的情境下会有不同的功效,对系统资源的占用也不同,如果感觉解析速度缓慢可以尝试切换模式加以体验,然后权衡性能占用来找到最适合的模式
禁用一些其他用不到的功能理论上也能减少占用并加快处理速度,比如IPv6和安全搜索等
DNS层面的网络拦截很舒适但并不是万能的,DNS拦截与内容拦截是不同的,DNS基于网域进行拦截,遇到广告域名与网页域名相同的情况就无法拦截了(比如视频开头的广告)
在使用了大约4天之后,我的整体状况如下:
原本在使用了1天之后,处理延迟越来越高,直奔130+,然后查了很多资料,并且经过反复尝试,得到以下几个配置优化:
1、需要特别注意的是,我们跟网上教程中所有人都不一样的点在于,第一我们搭建的是公共DNS,不是在内网的局域网DNS,所以不能使用ISP DNS作为上游DNS,因为ISP DNS具有地域性,在不同的省份使用时差距很大;第二我们搭建在美国VPS上,所以速度快延迟低的其实多数应该是北美的DNS服务,我们所熟知的优化114、腾讯DNS等速度都不理想;第三,几乎所有大佬都一致认为docker安装的AdGuard Home性能要远远强于luci版本安装的,这里因为我们本来就是docker安装的所以就不说了,如果有想再软路由等设备安装的可以注意以下,尽量用docker安装
2、根据经常请求的上游服务器,删除了命中率低的上游服务器,于是就只剩下了两个阿里DNS和一个googleDNS,不够后来发现quad9DNS虽然命中率低但是处理速度快延迟低,所以就也加了上去;然后下面的请求方式改成并行请求,他会同时查询所有上游服务器,谁最快返回谁的结果,所以可以在一定程度上加快我们的网络体验,当然了这会增加VPS的处理负担,我们性能足够就直接并行
4、第二部分DNS服务配置,这里网上说法不一,我们也来来回回试了好多次,最终上面的两个选项都没开,然后IPv6禁用了,因为目前IPv6整体上还是弊大于利(对于解析速度),其他没改
这里的EDNS客户端子网是指是否向上游DNS发送客户端的IP,正常情况下确实可以加快解析速度,因为上游服务器会选择就近的CDN节点进行解析,但是问题在于,我们获取到的客户端IP都是docker的172.12.0.1,这个IP是没有意义的,然后我们也尝试了自定义IP,但是我们的客户端在国内,服务端在美国,无论填什么都要来回两次延迟,所以也无法做到加速;DNSSEC是一个校验,简单来说就是检验上游DNS有没有被劫持篡改,这个如果在内网使用建议开启,但是我们在VPS上搭建的,VPS运营商当然不太可能来劫持服务端的DNS,所以没有意义,开启后大概会增加了10ms的延迟(毕竟要检验)
5、缓存配置纯理论上越大越好(不要误解,缓存的是DNS信息,不是CDN那种缓存网页数据),默认是4MB,我们空间充裕这里直接给到32MB;然后下面的乐观缓存一定要开!这样即使缓存信息过期了,也会先把过期的缓存响应发出去,这样至少我们可以瞬间得到响应(实测有缓存的情况下响应速度都在1ms以下),然后再尝试刷新,视觉上网络体验会好很多
6、关于各项加密设置.......原则上其实是简单的,但是不知道哪个环节出了问题我们一直配置不成功,目前暂时能锁定问题出在SSL证书上,一直报509错误,继续研究哈哈哈
7、广告过滤清单我们也经过了校验,最后留下了命中率高的,这个其实基本不影响速度,对性能有微乎其微的影响
经过这样的配置之后,我们查看日至可以发现,常用场景下都能直接命中缓存,如下图所示,处理时间都在1ms以内,实际体验大幅提升:
至于没有命中缓存的情况,这样配置后也能有所提升,但是比较有限,毕竟在这种情况下最大的时间浪费在网络延迟上,毕竟我们的VPS在境外,来回的网络延迟无法解决,这是没有办法的事,除非你用DoH套CDN,这几天我们也一直在研究这个,不过到目前为止还没有成功;然后顺便附上我发现的一个app,可以非常便捷地查看AdGuard Home的相关数据(功能和使用体验不如网页版,但是方便些,其实还有个更好用的叫Remote的软件,但是要付费38元就离谱,AdGuard Home都是免费的你一个第三方管理软件要收费Emmm):
首先,事实证明我们之前的配置是非常有效的,随着缓存表建立完善和使用情况逐渐稳定,平均处理时间大幅下降,现在已经来到了20ms左右,日常使用也确实能感受到变快了
不过有个让我很不理解的点是,在我没有修改任何配置的情况下,昨晚突然就能识别到客户端IP和网络环境了,理论上这是不可能的,因为我们在docker部署他只能得到172.17.0.1的内网地址,这个我实在搞不明白。如果确实能稳定且准确获取到客户端IP的话可以考虑开启EDNS
然后我们也找了很多关于获取客户端IP的资料,无意中看到一条说是跟入站端口有关联的,至于对不对我们也无法验证,但是这里衍生出一个问题就是可以用53端口入站但是ADH服务端口不是53,具体操作原理也很简单,就是用iptables实现端口转发(我们在Hysteria2章节讲过,注意修改实际端口以及网卡名为你自己的),这里的示例就实现了53端口入站并转发到54端口,ADH的服务端口就可以是54:
说说我前几天后来修改的一项配置:TTL,我为了让平均处理时间更加极致,把TTL最小值覆盖成了600秒(10分钟)最大值604800秒(一周),TTL指的是存活时间(Time To Live),也就是缓存的过期时间,默认情况下不同的网站都会根据自己网站的IP变化频繁程度对自己的TTL进行指导,比如有的网站会设置成1秒,每秒都会刷新缓存,那我们的缓存就没有意义了,因此直接覆盖最小值为10分钟能大大提高缓存命中率(其实乐观缓存也是这个意思)。
最后一次记录了,除了DoH的问题以外基本全部稳定下来了,处理时间也稳定在了5ms以下,整体体验上也没有问题,所以验证成功我们已经找到了最佳配置,另外如果遇到突然又获取不到客户端IP的问题建议重启一下容器试试:
另外,我之前说加密连接用不到的观点是错误的,近期我在仔细对比中发现在某些网络环境下服务端收到的DNS请求远远少于客户端发出的请求,查看日志发现很多请求并不是在服务端处理的,那么也就是说我们的公共DNS服务被劫持了,而使用DoH等加密DNS就不会出现这种情况,因此还是推荐大家有条件的都上DoH吧,或者在本地搭建,折腾了半个月,在外网搭建公共DNS的尝试确实是成功了,但是最终效果并没有达到预期,就这样吧。
总结一下就是最理想的情况要么本地部署,要么外网部署DoH(但是要用CDN解决延迟问题),要么用Workers中转负载均衡DoH
这里主要需要修改上游DNS服务,以及速率限制,因为我们是配置在Docker上的,大家查看日志可以发现他无法获取到真实的客户端IP,所有请求都是通过容器的IP进来的,那么每秒20个请求肯定是不够用的,而且如果我们纯粹是自己用的话完全没必要限速,直接设置为0即可;对于上游DNS,因为他是加权负载均衡的,所以我们可以多设几个,后期也可以通过查看主面板的“经常请求的上游服务器”来查看哪些DNS服务器性能最佳,然后删除响应慢的即可,这里也把列表给大家(也可以自己去找公共DNS:):
最后给大家推荐一个AdGuard官方出品的DNS检查工具dnslookup(),直接用snap商店安装即可(sudo snap install dnslookup
),使用简单,数据返回准确;windows平台用DnsBenchamark即可
请注意,在国内自建公共DNS服务是需要具备资质的,我们搭建在国外的VPS上虽然不违法,但是不能对外提供,所以大家不要随意公开自己的DNS服务,可能会被封杀。另外,建议大家定期访问来检测是否存在DNS泄漏问题,未泄露状态下DNS LEAK中应该只有终点DNS服务器,如果有国内的DNS服务器则发生了泄漏,你需要检查你客户端的配置
3、BootStrap服务器是干什么用的?之前没搞清楚所以直接用了默认的没有改,简单来说这是用来解析我们上面填的DoH/DoT域名的,毕竟那个也是域名也需要DNS解析才能使用,这里不需要考虑其他因素,只要速度最快就行,大家可以到DNSPerf()查看全球各地区最快的DNS,当然具体还建议自己ping一下,我们这里填的是Google和CloudFlare的,然后加了一个阿里的备用;至于后备DNS无关紧要,我把上面淘汰下来的全丢进去了
折腾了好久终于配置好了一定要记录一下