微言码道 · 手记

善用开源, 用AdGuard Home搭建私有DNS服务

善用开源, 用AdGuard Home搭建私有DNS服务封面

—— 用AdGurad Home搭建一个你的私有DNS服务是简单,方便的事.

上篇文章, 稍微讲了下什么是DNS, 以及什么情况下你可能需要搭建一个自己的DNS服务. 这篇文章承接上篇文章, 主要详细介绍如何基于开源的AdGurad Home来搭建一个你的私有DNS服务

1. 明确需求

首先需要再次明确的是, 搭建一个私有的DNS服务是有适应场景的, 建议在以下几个场景中你完全可以考虑搭建一个私有的DNS服务

  • 在你的家庭网络中搭建一个私有的DNS解析, 主要用来保护你家人的上网健康

  • 在公司或团队中搭建一个私有的DNS解析, 主要用来做公司层面的私有服务解析

如果只是你个人使用, 并无太大必要. 直接使用公有的DNS解析就足够了.

但是无论是哪种情况, 搭建一个私有的DNS需要一台私有服务器. 比如我是在自己的家庭服务器上安装的这个服务.

2. AdGuard Home简介

先介绍下AdGuard Home

AdGuard Home是adguard推出的一款工具, adguard是一家专门网络安全与隐私保护的公司. 公司名下有很多广告过滤的产品, 比如我的Chrome上也安装了adguard的广告过滤插件.而AdGurad Home是它推出的开源免费的隐私保护与广告过滤工具.

与Chrome上的广告插件相比, AdGuard Home特点表现在:

  • 它是在DNS层级上做隐私保护以及广告拦截.

  • 你只需要安装它, 通过路由器的DNS用它来解析, 就自动保护所有联网设备

  • 支持DNS自定义解析等DNS扩展能力

所以, 简而言之, AdGuard Home是一个DNS解析服务, 它通过在DNS解析层面来过滤广告, 恶意网站等.

它的原理比较很简单, 一般是通过域名黑名单来实现. 恶意网站或广告网站对它的DNS不做正常解析就行了

3. 安装

这个部分主要讲解如何安装Adgurad Home.

前提条件

安装之前需要考虑以下前提条件的:

  • 你需要一台服务器,当然最好是Linux, 能用来安装Adgurad Home

  • 建议使用Docker来安装, 因此你需要在Linux上搭建好docker环境

Docker环境

我还是那个建议, 能基于Docker来部署, 就不要使用其它方式. Docker部署简单, 易于操作, 并且尽量降低各种环境与依赖

Docker以及Docker Compose, 如果没有请自行查阅官方.

新建目录

在你的Linux某个目录下, 创建一个adguardhome目录 (当然你可以修改其它任何目录名)

在这个目录下, 创建confdir以及workdir两上目录,以下一个docker-compose.yml文件. 结构如下

.
├── confdir
├── docker-compose.yml
└── workdir

解释如下:

  • confdif: 配置目录

  • workdir: AdGurad Home运行产生的数据目录. 比如数据, DNS缓存等

  • docker-compose.yml: docker compose配置文件

编辑docker-compose.yml

编辑你的docker-compose.yml文件,内容如下:

version: "3.9"

services:
  adguardhome:
    image: adguard/adguardhome:latest
    restart: always
    container_name: adguardhome
    ports:
      - 53:53/tcp
      - 53:53/udp
      - 3000:3000/tcp
    volumes:
      - ./workdir:/opt/adguardhome/work
      - ./confdir:/opt/adguardhome/conf

几个重要参数说明:

  • ports: 开放53的TCP以及UDP端口. 53是DNS的默认端口. 3000是Web管理端口

  • volumes: 挂载我们刚刚创建的两个目录, 这样docker容器重启时, 相关数据就不会丢失.

开放端口

如果你的Linux有防火墙, 比如我的Debian都会有UFW. 那你需要开放端口

sudo ufw allow 53
sudo ufw allow 3000

运行

使用如下命令来启动运行服务

sudo docker compose up -d

第一次可能会因为下载镜像需要一些时间, 一切正常很快就能启动

关闭Linux的默认resolved

如果启动时, 报53端口已被占用. 那是因为部分Linux自带了一个resolved服务, 也是做域名解析的的.

我们使用了AdGurad Home, 就不需要这个了. 把它停掉

sudo systemctl disable systemd-resolved
sudo systemctl stop systemd-resolved

4. 初始化

启动成功后, 访问http://ip:3000, 第一次会进入一个配置页面. 这个配置页面会要求我们初始化用户名密码及一些常规配置.

设置端口

在这一步, 设置你刚在docker文件中的端口. 我们的是3000和53

  • 3000是Web管理端口

  • 53是DNS默认端口

文章《善用开源, 用AdGuard Home搭建私有DNS服务》中的配图 1

创建用户名密码

这一步, 设置你的用户名和密码. 后面你需要使用这个用户名和密码来登录这个系统

文章《善用开源, 用AdGuard Home搭建私有DNS服务》中的配图 2

完成

完成上述几个简单的步骤, 设置就完成了

文章《善用开源, 用AdGuard Home搭建私有DNS服务》中的配图 3

5. 设置

其实, 完成这一步后, 这个DNS解析默认就可以使用了, 开箱即用.

但很可惜, 在国内, 由于众所周知的原因, AdGurad Home中默认的上游DNS解析服务器很可能是访问不了的. 所以我们要修改上游DNS解析服务器

进入设置-DNS设置界面

文章《善用开源, 用AdGuard Home搭建私有DNS服务》中的配图 4

如上图所示, 在这里, 将上游的DNS服务器, 修改为你能够访问的一些知名可靠的DNS服务.

  • 1.1.1.1

  • 1.0.0.1

在这个设置中, AdGurad Home提供了一个已知DNS提供商列表, 建议从这里找你访问速度较快的.

你可以添加一个或多个上游DNS服务. 比如国外一个, 国内一个. 国外优先. 这样更有保障.

建议

***尽量使用国外DNS做DNS上游服务器. ***

原因当然很容易理解, 我们本来就是希望自建DNS来尽量避免DNS劫持与DNS污染. 如果仍然使用国内DNS做上游, 这个就解决不了问题.

当然,你不需要担心国外DNS会不会速度很慢, AdGurad Home本身是一个DNS服务, 只有在本地没有缓存记录的情况下, 才会向上游DNS请求解析的. 这意味着, 除了第一次或缓存过期等极少数情况, 大部分时间域名的解析是非常快的. 是由AdGuard Home承担的.

验证

设置完上游DNS服务器后, 保存下你的设置. 然后使用nslookup来测试下它的正常性

# 将127.0.0.1改成你的AdGurad Home所在服务器的IP
nslookup google.com 127.0.0.1

你会看到如下结果

Server:		127.0.0.1
Address:	127.0.0.1#53

Name:	google.com
Address: 8.7.198.46
Name:	google.com
Address: 8.7.198.46

你得到了Google.com正确的DNS解析. 这证明AdGurad Home已经生效了.

6. 更多

隐私保护与广告拦截

DNS域名解析是AdGurad Home的核心能力. 但AdGurad Home这个产品的本意是基于DNS域名解析层面来做隐私保护与广告过滤.

其实原理比较简单, 它有一个DNS黑名单, 这些黑名单的域名可能是恶意广告或广告网站, 遇到这个黑名单中的域名, 它解析DNS时, 会返回错误的IP.

这样就访问不了这些恶意网站及广告了. (很多广告联盟有固定的一些域名, 屏蔽这些域名就无法在网页上投放广告了)

文章《善用开源, 用AdGuard Home搭建私有DNS服务》中的配图 5

进入过滤器->DNS黑名单, 在这里添加或维护域名黑名单. AdGuard Home默认已经提供了一份. 你也可以在互联网上寻找一些知名的公开的类似的维护列表.

DNS自定义解析

如果你是公司中使用, 可能会遇上需要解析一些内部域名.

这个时候,在过滤器->DNS重写中, 可以添加自定义解析.

文章《善用开源, 用AdGuard Home搭建私有DNS服务》中的配图 6

日志

前几天有人私信问我DNS解析日志方面的事.

AdGurad Home自带了完整的日志, 你可以通过查询日志模块, 来访问与查询所有日志. 这里有完整的日志.

文章《善用开源, 用AdGuard Home搭建私有DNS服务》中的配图 7

6. 最后的设置

其实, 到这一步, 我们已经成功搭建了一个完整的DNS服务. 但DNS服务要生效, 得联网设备修改它的DNS地址指向我们的服务器IP.

如果需要别人每个设备一个一个修改, 这就非常麻烦了.

好在, 大多数情况下, 我们其实都是通过路由器来上网. 所以, 方便的方式是修改路由器中的默认DNS服务地址, 指向我们刚刚建立的这个DNS服务.

只需要输入这个AdGuard Home的IP, 你整个家庭的所有上网设备, 或整个公司所有的上网设备, 就自动使用这个DNS解析的了.

是不是非常方便?

相比其它一些自建DNS解决方案, AdGurad Home是我见过最简单, 最容易部署与设置的DNS解析的服务工具. 除了部署需要一点Linux及Docker能力以外, 普通人使用这个工具完全没有障碍.

AdGurad Home是一个基于GO语言实现的开源项目. 向adgurad公司以及开源致敬.