避免DNS污染!我的DNS解决方案--AdGuard Home

本文最后更新于 <span id="expire-date"></span> 天前,文中部分描述可能已经过时。

ps: 很久没写博客了,最近又折腾了不少东西,有空了慢慢写出来…

前言&科普

DNS污染

由于中国大陆较为特殊的网络环境,DNS[1]一直都是比较麻烦的问题。

由于DNS污染[2],访问网页经常被阻。

就算通过代理连接DNS,速度也会成为问题。

当然,肯定会有同学疑惑:"诶?我不用大陆的DNS,我用8.8.8.8不就行了?"但问题在于,现在中国大陆的DNS标准端口53查询都会被ISP抢答,依然存在污染。

那么,选择一个速度足够快,且没有被污染的DNS就是一个重要的话题。

解决方法

俗话说,魔高一尺,道高一丈。当然有办法来应对这种dnd劫持。两种方法最为常见:

  1. 用非标准端口未污染DNS[3]

因为非标准端口,就无法无差别抢答。缺点是…你得找到一个这样的DNS服务器。

  1. 使用加密DNS

例如DoH(DNS over HTTPS)、DoT(DNS over TLS)、DoQ[4](DNS over QUIC)。三种加密DNS分别使用htrps、tls、quic协议。简单对比下,doq是截至目前最好的DNS加密方法。

准备

这个方案需要用到一下设备或资源,不满足可能无法使用此方案。当然看看也无妨

  • [x] 手机电脑路由器…
  • [x] 一台低延迟vps/NAS/树莓派/软路由…
  • [x] 一枚域名[5](二级域名更好)

AdGuard将作为后端提供DNS查询。

终端还得有对应DNS的支持。截至发稿日,原生支持如下:

  • iOS: DoT和DoH
  • Android 9.0以上: 支持DoT
  • Windows11: 支持DoH
  • 路由器: 看固件

如果没有原生支持,也可以通过软件来达到。一般来讲,代理软件都会提供DNS支持。

  • iOS: Quantumult X、Surge、Stash和Shadowrocket都支持DoH和DoQ。Loon未知。
  • 安卓: Clash支持DoT和DoH
  • 其他终端上的软件过多,可谷歌一下,就不赘述了。

部署

AdGuard Home开源地址&部署文档

AdGuard Home官方配置教程

AdGuard Home的功能很多,甚至还可以过滤广告、强制安全搜索、屏蔽NSFW…

部署平台

vps

选择一个在香港的三网直连vps,可以有效提高日后体验。

如果各位有其他适合的厂家可以在评论区留言。

树莓派&软路由

选择自己的心动设备即可。毕竟玩树莓派和软路由的一般都是大佬

NAS

AdGuard Home提供官方 Docker镜像。

没用过nas实在不知道怎么配置,请见谅~

安装AdGuard Home

一键梭哈

curl -s -S -L https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s — -v

一键梭哈,绝不拖泥带水!

初始管理端口为3000,请在安装完成后及时在ip后面加:3000进入初始化界面设置管理员账户。

Docker

Docker文档

官方Docker镜像的docker命令:

请对照文档自行修改配置!

Docker Run

docker run —name adguardhome\
    —restart unless-stopped\
    -v /my/own/workdir:/opt/adguardhome/work\
    -v /my/own/confdir:/opt/adguardhome/conf\
    -p 53:53/tcp -p 53:53/udp\
    -p 67:67/udp -p 68:68/udp\
    -p 80:80/tcp -p 443:443/tcp -p 443:443/udp -p 3000:3000/tcp\
    -p 853:853/tcp\
    -p 784:784/udp -p 853:853/udp -p 8853:8853/udp\
    -p 5443:5443/tcp -p 5443:5443/udp\
    -d adguard/adguardhome

Docker-compose

version: '3.3'

services:
  adguardhome:
    image: adguard/adguardhome
    container_name: adguardhome
    restart: unless-stopped
    volumes:
      - '/my/own/workdir:/opt/adguardhome/work'
      - '/my/own/confdir:/opt/adguardhome/conf'
    ports:
      - '53:53/tcp'
      - '53:53/udp'
      - '67:67/udp'
      - '68:68/udp'
      - '80:80/tcp'
      - '443:443/tcp'
      - '443:443/udp'
      - '3000:3000/tcp'
      - '853:853/tcp'
      - '784:784/udp'
      - '853:853/udp'
      - '8853:8853/udp'
      - '5443:5443/tcp'
      - '5443:5443/udp'

配置

由于AdGuard Home全部中文化且UI设计合理,本文只简述部分值得关注的配置。

设置- DNS设置-上游DNS服务器

由于选择的服务器位于香港🇭🇰,截至发稿日不存在DNS污染,故直接使用公共DNS即可。

我配置的请求方式为并行请求,于是每种协议都写了至少一个。列表如下:

8.8.8.8
8.8.4.4
1.1.1.1
1.0.0.1
quic://DNS.adguard.com
156.154.70.1
tls://1dot1dot1dot1.cloudflare-DNS.com
84.200.69.80
1.2.4.8

如果你设置的方式并非"并行请求",请注意控制列表内上游DNS数量和质量以保证最优的速度。

设置- DNS设置- DNS服务配置

  • 速率限制: 个人使用建议设置为0
  • DNSSEC: 建议启用以保证上游DNS的正确
  • 弃用ipv6: 若日常使用更多为电脑,则建议关闭

设置- DNS设置-DNS缓存配置

TTL值建议设置为最小600, 最大3600以防止TTL不正常导致的性能问题。

建议选中乐观缓存。

设置- DNS设置-访问控制

打开即意味着只能使用DoH、DoT、DoQ连接(毕竟国内个人不存在静态ip)

设置- 加密设置

按照提示填写即可。

注意

请更改DoT和DoQ的端口以防被统一屏蔽!

如果绑定二级域名且托管在Cloudflare上、是为Freenom免费域名,请前往Freessl按照提示获取通配符证书。[6]

设置- 客户端设置

设置客户端可以有效分离客户端的DNS查询和限制,也可用于前面的访问控制。

若要让客户端识别功能和DoT、DoQ搭配使用,则绑定的域名必须为二级域名[7]且将所有三级域名解析到此服务器,例如example.org*.example.org

家里有孩子的也可以通过这个来有效单独控制成人🔞内容和众多服务禁止。

过滤器-DNS拦截/允许列表

这个板块即为广告过滤。

过滤

我使用的清单🧾如下:

AdGuard DNS filter
https://adguardteam.github.io/AdGuardSDNSFilter/Filters/filter.txt

CHN: anti-AD
https://anti-ad.net/easylist.txt

大圣净化
https://raw.githubusercontent.com/jdlingyu/ad-wars/master/hosts

EasyList China+EasyList
https://easylist-downloads.adblockplus.org/easylistchina+easylist.txt

EasyPrivacy
https://easylist-downloads.adblockplus.org/easyprivacy.txt

Halflife
https://cdn.jsdelivr.net/gh/o0HalfLife0o/list@master/ad.txt

白名单

还有一个白名单板块,我的清单🧾如下:

Anti-ad白名单
https://raw.githubusercontent.com/privacy-protection-tools/dead-horse/master/anti-ad-white-list.txt

filter_whitelist
https://raw.githubusercontent.com/hl2guide/Filterlist-for-AdGuard/master/filter_whitelist.txt

使用

原生使用详见AdGuard Home中的设置向导[8]

同时,设置向导中也有众多各终端通过软件实现DNS设置的方法。

举个例子🌰

这方面的太多了,我就只举个iOS上Quantumult X的例子🌰

我创建了一个myios的客户端id,使用的二级域名为example.org,quic端口为789。那么,我需要在配置文件中使用:

[DNS]
prefer-doh3
doh-server=https://example.org/DNS-query/myios
doq-server=quic://myios.example.org:789

强烈建议使用DoQ,它比https快太多了!

总结

关于DNS,实在有太多可以说。这次文章自我感觉写起来有点杂,因为内容关联太多,很容易导致哪里漏掉了一些,哪里的逻辑有问题这些漏洞。如果发现有任何问题我没有写到或者错误、有补充,请在评论区评论。

最后,感谢您的阅读!


  1. 什么是DNS?Cloudflare Blog ↩︎

  2. 不特指GFW。相关研究 ↩︎

  3. 截至发稿日,有一个公益项目"iQDNS" 提供国内可访问的无污染DNS。tg频道 网页 ↩︎

  4. AdGuard是第一个支持DoQ的DNS解析器。AdGuard博客 ↩︎

  5. 请注意,若域名托管于Cloudflare则须关闭代理(小云朵),仅使用DNS查询 ↩︎

  6. letsencrypt的通配符证书需要DNS验证。但Cloudflare的api拒绝为.ml .tk .ga .cf .gqTLD的域名验证,只能使用其他通配符证书。 ↩︎

  7. 如若不愿付钱购买域名,可以到Freenom免费注册.ml .tk .ga .cf .gqTLD的域名。注册前请一定要谷歌一些教程以防入坑! ↩︎

  8. 设置向导中有很多种终端。在最右侧"DNS隐私"页面的最下面可找到通过描述文件实现DoT/DoH原生支持的板块。 ↩︎

本文作者:Moraxyc

本文链接: https://blog.moraxyc.com/post/1bcb932a/

文章使用 CC BY-NC-SA 4.0 协议进行许可,使用时请遵守知识共享协议。

访问本站,即表明您同意本站免责条款

评论