0 背景
由于想要在局域网中使用域名访问本地 nas 中的服务,可以通过修改 Host 在单台设备上实现,但由于想一次配置供所有内网设备使用,因此选择自建 DNS 服务作为路由器的默认 DNS 服务器。本次使用开源的 AdGuard Home 进行搭建。
而 AdGuard Home 中的本地 DNS 重写仅支持 A 记录及 CNAME 记录,因此为了实现域名指向 nas 端口,还需要搭建反向代理,用 80 端口监听所有域名解析请求,并转发到各域名对应的端口。本次使用国产的 lucky 进行搭建,其有着相对完善的 WebUI,简单反向代理的需求之下,相比 Nginx 能一定程度上简化配置的繁琐。
当然,自建了 DNS 服务,当然也顺便兼顾一下其主要功能,隐私保护及广告过滤。其中隐私保护一方面通过 DoH (DNS over HTTPS) 对局域网向外发出的 DNS 解析进行加密,另一方面通过添加 DNS 拦截规则实现;广告过滤全部通过添加 DNS 拦截规则实现。
规则的时效性很强,AdGuard Home 自带了很多自动更新的规则,而互联网上很多个人发布的规则难以维持更新,故这方面的内容本文不进行展开,默认使用自带的规则。
1 使用 AdGuard Home 搭建 DNS 服务
使用 Docker 方式部署 AdGuard Home。
虽然是在 fnOS 的 GUI 中安装,但各项配置参考如下。
docker run --name adguardhome\
--restart unless-stopped\
-v /my/own/workdir:/opt/adguardhome/work\
-v /my/own/confdir:/opt/adguardhome/conf\
-p 80:80/tcp\
-p 3000:3000/tcp\
-d adguard/adguardhome
本次部署仅需注意挂载路径映射及端口映射即可,网络模式保持默认的 bridge。
由于只向局域网内设备提供 DNS 服务,因此设备 -> dns过程无需使用 DoH,通过传统方式访问即可,因此仅需开放 53 端口;AdGuard Home 的管理面板通过 3000 端口访问。因此除 80 与 3000 之外的端口可以忽略。其余端口用途参考
用腾讯云服务器搭建属于你的AdGuard Home与AdGuard Home的设置-腾讯云开发者社区-腾讯云。
容器运行后,通过nas http:本机ip:3000
即可进入到初始界面,一路默认即可。
进入到控制面板中如下图所示。
点击导航栏中 设置-DNS设置
,开始配置 DNS nas等内容。
此处只添加 google 及 cloudflare 提供的 DNS 服务器,访问国内域名可添加阿里云及腾讯云等厂商提供的 DNS。需注意 google 的 DNS 地址不能填写为 https://8.8.8.8/dns-query
,8.8.8.8 仅提供传统 DNS 及 DoT 服务;而cloudflare 的 DNS 可以填写为 https://1.1.1.1/dns-query
。
DNS 查询策略选择并行请求即可。
当在上游服务器填写了多个上游 DNS,并选择并行的查询策略,可以不配置后备 DNS 服务器。
本次部署使用 DoH 方式访问上游 DNS,AdGuard Home 首先需要请求解析上游 DNS 的域名,因此需要添加 Bootstrap DNS 服务器。如果上游服务器填写为 https://1.1.1.1/dns-query
的形式,此处就无需填写。
添加完成后,点击 测试上游 按钮,没问题的话会提示指定的 DNS 服务器正常运行。
其余配置如下。需注意的是是否启用 EDNS 及 DNSSEC 需要添加的上游 DNS 支持功能。
点击保存,到路由器控制面板中修改上网设置为手动配置 DNS,然后填写 AdGuard Home 的宿主机 ip 地址。
此外,连接到路由器的设备,需设置为自动配置 DNS,这样设备才会使用路由器指定的 DNS 服务器。
完成设置后,正常使用互联网服务,即可在管理面板中看到 DNS 查询统计及日志。
此次搭建完成后,一台设备连接到内网的设备,进行一次 DNS 查询时,将经过以下过程。
设备 (192.168.xx.xx) -> [DNS 查询 (53)] -> AdGuard Home (192.168.xx.xx)
AdGuard Home -> [DNS 查询 (53)] -> Bootstrap DNS #查询DoH DNS服务器地址
Bootstrap DNS -> [DNS 查询 (53)] -> AdGuard Home
AdGuard Home -> [DoH 查询 (HTTPS)] -> 上游 DNS(如 8.8.8.8) #真正的DNS查询请求
上游 DNS -> [DoH 响应 (HTTPS)] -> AdGuard Home
AdGuard Home -> [DNS 响应 (53)] -> 设备 (192.168.xx.xx)
由于存在缓存,因此除第一次查询 DoH 服务器地址需要经过 Bootstrap DNS 服务器,此后在缓存有效期内无需再次访问 Bootstrap DNS 服务器。
2 使用 lucky 进行反向代理
使用 Docker 安装 lucky。
各项配置参考如下。需注意不添加挂载目录的话,删除容器时配置文件将一并删除;反代的服务位于宿主机中,需要使用 host 模式监听所有宿主机端口;由于 80 及 443 属于特权端口,只有 root 权限才能访问,因此需要将容器设置为使用高权限执行,才能够使用 80 端口,否则直接监听 80 端口将出现 permission denied
的报错。
docker run -d --name lucky --restart=always --net=host -v /root/luckyconf:/goodluck gdy666/lucky
容器运行后,通过 http:本机ip:16601
端口即可访问控制面板,默认用户名及密码均为 666,进入后如下图所示。
点击侧边栏 Web服务
,点击添加Web服务规则,选择简易模式。此处 tcp4 及 tcp6 分别表示 ipv4 及 ipv6,按需勾选即可。
点击添加子规则,由于在本地提供 DNS 解析,因此使用虚构的域名也可以正常工作,此处使用 .home 的虚构顶级域名,选择感兴趣的词条自定义即可。
点击添加子规则即可。
3 添加本地DNS解析
使用反向代理将域名全部指向 nas 的 80 端口后,还需要将域名解析到 nas 的 ip 地址。
进入 AdGuard Home 的管理面板,点击 过滤器-DNS重写
,点击添加 DNS 重写,填写域名及nas ip。
由于运行于 nas 的众多服务都想要使用不同二级域名区别开,因此此处选择添加通配符记录,将所有 .home 下的二级域名全部解析到 nas 中。如果需要解析到其他服务器中运行的服务,针对每项服务各自添加记录即可。
保存后,在局域网中即可使用 http://nas.home/
通过浏览器访问到 fnOS 的管理面板。