共计 3133 个字符,预计需要花费 8 分钟才能阅读完成。
概述
因为国内 DNS 污染严重,虽然人在国外为了避免 DNS 泄露决定自己搭建一套 DNS 服务器。但是我的主路由使用 Ros,旁路由使用 Linux,又因为之前使用的 OpenWrt 经常在保存配置文件时卡住,进而崩掉系统,导致我有点 PTSD 了。遂放弃 OpenWrt 方案。
DNS 架构
这套 DNS 服务器架构使用一个根 DNS, 一个 Adguardhome。
运行流程:
graph TB
A(用户)-->|访问|B(Adguardhome)
B-->|查询|C(Root DNS)
B-->|缓存|B
C==>|1查询结果|B
B==>|1发送|A
B-->|2查询结果|A
在这个系统中,有两种情况,
- 1. AdGuardHome 中有缓存,直接返回。
- 2. AdGuardHome 没有缓存,查询根 DNS 再执行递归查询操作,最后将获得的结果写入缓存以供下次使用。
如果在国内可能还要再加上国内外分流,这会在递归 DNS 查询时,增加分流步骤。人在国外,就不研究了。可以自行google
搭建
我自己也是一知半解,属于是摸石头过河。
Root DNS
本节中将使用 BIND 搭建Root DNS
准备
开始
按照bind9文档安装,我安装的位置是在/etc/bind
├── bind.keys
├── db.0
├── db.127
├── db.255
├── db.empty
├── db.local
├── named.conf
├── named.conf.default-zones
├── named.conf.local
├── named.conf.options
├── rndc.key
├── root.hints
├── root.zone
└── zones.rfc1918
编辑文件named.conf.default-zone添加下面文字
zone "." {
type hint;
file "/etc/bind/root.hints";
};
注意
Ubuntu 系统在配置 DNS 时,需要先关闭systemd-resolved
sudo systemctl stop systemd-resolved && \
sudo systemctl disenable systemd-resolved
将/etc/resolv.conf文件删除并重新编写一次。在 rootDNS 配置完成前填入
nameserver 1.1.1.1
nameserver 8.8.8.8
配置完成后填入
nameserver 127.0.0.1
测试
安装 dnsutils 使用 dig 测试是否安装成功
Adguardhome
本节中将搭建 Adguardhome 服务
准备
- 一台可以联网的 Linux 系统的虚拟机/实体机
- 一份 Adguardhome 的规则 (这里不做推荐,自行 google)
- 一份 Adguardhome 的文件压缩包 下载
- 一份 Adguardhome 的帮助文档 查看
开始
安装方案一:使用官方脚本
curl -s -S -L https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -v
wget --no-verbose -O - https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -v
fetch -o - https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -v
安装方案二:将 AdGuardHome 压缩包解压。再配置 systemctl 来管理自启动。
注意
- AdGuardHome 会在文件中生成一个类似querylog.json的文件,这个文件会随着时间不断变大,然后boom。所以需要请示清除
../data/filters/ 中存储Adhome的过滤器配置 初始文件树大概是
├── AdGuardHome
├── AdGuardHome.yaml
├── CHANGELOG.md
├── LICENSE.txt
└── README.md
使用后大概是
├── AdGuardHome
├── AdGuardHome.sig
├── AdGuardHome.yaml
├── CHANGELOG.md
├── LICENSE.txt
├── README.md
└── data
├── filters
│ ├── 1730121552.txt
│ ├── 1730121553.txt
│ ├── 1730121554.txt
│ ├── 1730121555.txt
│ ├── 1730121556.txt
│ ├── 1730121557.txt
│ ├── 1730121558.txt
│ ├── 1730121559.txt
│ ├── 1730121560.txt
│ ├── 1730121561.txt
│ ├── 1730194805.txt
│ ├── 1730194806.txt
│ ├── 1730194807.txt
│ ├── 1730194808.txt
│ ├── 1730194809.txt
│ ├── 1730194810.txt
│ ├── 1730194811.txt
│ └── 1730194812.txt
├── querylog.json
├── sessions.db
└── stats.db
- 正常是使用 systemctl 管理AdGuardHome,如果无法使用,在/etc/systemd/system/路径下创建一个AdGuardHome.service文件并填入下面内容。
[Unit] Description=AdGuard Home: Network-level blocker ConditionFileIsExecutable=/opt/AdGuardHome/AdGuardHome After=syslog.target network-online.target [Service] StartLimitInterval=5 StartLimitBurst=10 ExecStart=/opt/AdGuardHome/AdGuardHome "-s" "run" WorkingDirectory=/opt/AdGuardHome StandardOutput=journal StandardError=journal Restart=always RestartSec=10 EnvironmentFile=-/etc/sysconfig/AdGuardHome [Install] WantedBy=multi-user.target
路由
将 DHCP 中 DNS 设置为 AdguardHome 的 ip 地址。很简单啦。
测试
Windows 系统使用 nslookup xxx.com,Linux 系统使用 dig xxx.com 测试电脑使用什么 DNS 以及耗时多少。

如果这里 Server 都是 AdguardHome 的 ip 地址就说明没问题了。
参考
- [1] AdGuardHome Github
- [2] Root DNS