DNS 加密
AdGuard Home 开箱即支持所有现代 DNS 加密协议。
AdGuard Home 同时支持客户端和服务端的 DNSCrypt。 了解如何将 AdGuard Home 配置为 DNSCrypt 服务器。
本指南介绍如何使用 AdGuard Home 搭建加密 DNS 服务器。
服务器安装
加密 DNS 流量的目的是保护其免受第三方(例如 ISP)的分析或篡改。
这意味着您需要一台拥有公网独立 IP 地址的服务器。 有很多廉价的云服务器提供商:DigitalOcean、Vultr、Linode 等。 任选一家,在其上创建云服务器,然后在服务器上安装 AdGuard Home。
注册域名
首先,您需要一个域名。 如果您从未注册过域名,这里有一份简单的教程可以帮助您。
获取 SSL 证书
DNS-over-HTTPS 和 DNS-over-TLS 都基于 TLS 加密,因此使用它们需要 SSL 证书。
SSL 证书可以从证书颁发机构(CA)购买。CA 是受浏览器和操作系统信任、为域名颁发 SSL 证书的公司。
或者,您也可以从 Let’s Encrypt CA 免费获取证书。Let's Encrypt 是由互联网安全研究组(ISRG)开发的免费证书颁发机构。
本指南介绍如何获取证书。
使用 CertBot
Certbot 是一个易于使用的客户端,用于从 Let's Encrypt 获取证书。
- 访问 certbot.eff.org,选择「以上都不是」软件以及您的操作系统。
- 按照安装说明操作,在进入「入门」部分之前停止。
使用 DNS 挑战获取证书
如果您已有域名,使用 DNS 挑战是获取证书的最简单方式。
运行以下命令并按 Certbot 的提示操作:
sudo certbot certonly --manual --preferred-challenges=dns --preferred-chain="ISRG Root X1"
最后,您会得到两个文件:
fullchain.pem:PEM 编码的 SSL 证书privkey.pem:PEM 编码的私钥
配置 AdGuard Home 时需要这两个文件。
续期现有证书时需要使用完全相同的方法。
使用 Lego
还有一个非常不错且易于使用的 CertBot 替代方案:LEGO。
此外,这里有一个简单的脚本,可用于自动化证书生成和续期。
配置 AdGuard Home
-
打开 AdGuard Home 网络界面并前往「设置」。
-
选择「加密」部分。

-
将
fullchain.pem文件的内容复制/粘贴到「证书」下的输入字段中,或指定文件路径。 -
将
privkey.pem文件的内容复制/粘贴到「私钥」下的输入字段中,或指定文件路径。 -
在「服务器名称」中输入您的域名。
-
看到验证成功的提示后,点击「保存设置」。
当通过文件路径指定的证书和/或私钥发生更改时,AdGuard Home 会自动重新加载。 也可通过 SIGHUP 信号触发重新加载。
与反向代理一起使用
我们已有一篇关于配置反向代理服务器以访问 AdGuard Home Web 界面的指南。
AdGuard Home 能够限制来自未加入「受信任」列表的代理服务器的 DNS-over-HTTPS 请求。 默认情况下,它被配置为接受来自 IPv4 和 IPv6 本地回环地址的请求。
要让 AdGuard Home 处理来自反向代理服务器的 DNS-over-HTTPS 请求,请在 AdGuardHome.yaml 中将 trusted_proxies 设置为该代理服务器的 IP 地址。 如果有多个代理服务器,可以使用 CIDR 而不是单个 IP 地址。
Nginx 反向代理
要将 AdGuard Home 配置为接受来自 Nginx 反向代理服务器的请求,请确保反向代理服务器本身已正确配置。
nginx.conf 文件中应包含相应的指令,以向请求添加支持的转发头,这些头是 X-Real-IP 或 X-Forwarded-For。 这可以通过 ngx_http_realip_module 实现。 简而言之,该模块会获取客户端的真实 IP 地址,并将其写入 HTTP 请求的头信息中。 AdGuard Home 将接收该头部的值,并将其解析为真实的客户端地址。 反向代理服务器的地址也将被接收,并同样与「受信任」代理列表进行核对。
您可能希望代理的另一个头部是 Host 头,该头用于使 AdGuard Home 能够识别来自主机名中包含 ClientID 的客户端的请求。
例如,如果反向代理服务器的配置包含以下指令:
location /dns-query {
# …
proxy_set_header Host $host;
proxy_set_header X-Real-IP '1.2.3.4';
proxy_bind 192.168.1.2;
# …
}
AdGuard Home 会将 192.168.1.2 作为代理服务器的地址,并与 trusted_proxies 进行核对。 如果该代理是「受信任的」,则 1.2.3.4 将受到访问设置的控制。
Cloudflare CDN
Cloudflare 的内容分发网络充当反向代理,会将其自己的头部(CF-Connecting-IP 和 True-Client-IP)附加到转发的请求中。 AdGuard Home 也支持这些头部,因此反向代理服务器的地址可以直接添加到 trusted_proxies 列表中。 有关恢复原始访问者 IP 的详细信息,请参阅 Cloudflare 官方参考文档。
其他头部
未来 AdGuard Home 可能会支持其他 HTTP 头部。 不过,任何与 HTTP 头部相关的功能请求,应首先尝试通过配置反向代理自身来解决。
例如,要修改 HTTP 严格传输安全机制以包含实验性的 preload 指令,可以使用类似如下的配置片段:
location /dns-query {
# …
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# …
}
配置设备
Android
- Android 9 及以上版本原生支持
DNS-over-TLS。 要配置它,请前往「设置」→「网络和互联网」→「高级」→「私人 DNS」,并在其中输入您的域名。 - AdGuard Android 版支持
DNS-over-HTTPS、DNS-over-TLS、DNSCrypt和DNS-over-QUIC。 - Intra 为 Android 添加了
DNS-over-HTTPS支持。
iOS
- iOS 14 及以上版本通过配置描述文件原生支持
DNS-over-TLS和DNS-over-HTTPS。 为简化操作,AdGuard Home 可以为您生成这些配置描述文件。 只需前往「设置向导」→「DNS 隐私」,然后滚动到 iOS 部分即可。 - AdGuard for iOS 支持
DNS-over-HTTPS、DNS-over-TLS、DNSCrypt和DNS-over-QUIC。 - DNSCloak 支持
DNS-over-HTTPS,但要将其配置为使用您自己的服务器,需要为其生成一个 DNS Stamp。
Windows
- Windows 10 版本 19628 及更高版本原生支持
DNS-over-HTTPS。 - AdGuard Windows 版支持
DNS-over-HTTPS、DNS-over-TLS、DNSCrypt和DNS-over-QUIC。
macOS
- macOS Big Sur 及更高版本通过配置描述文件原生支持
DNS-over-TLS和DNS-over-HTTPS。 为简化操作,AdGuard Home 可以为您生成这些配置描述文件。 只需前往「设置向导」→「DNS 隐私」,然后滚动到 iOS 部分即可。
其他实现方式
- AdGuard Home 本身可以在任何平台上作为安全的 DNS 客户端使用。
- dnsproxy 支持所有已知的安全 DNS 协议。
- dnscrypt-proxy 支持
DNS-over-HTTPS。 - Mozilla Firefox 支持
DNS-over-HTTPS。
配置 DNSCrypt
AdGuard Home 能够作为 DNSCrypt 服务器工作。 不过,此功能只能通过配置文件启用,无法通过 Web 界面进行设置。 本指南将说明如何操作。
生成配置文件
以下是生成 DNSCrypt 配置文件并让 AdGuard Home 指向它的方法:
确保您的 TLS 设置有效且加密已启用。
-
获取适用于您系统的最新版
dnscrypt工具。 解压缩归档文件,并进入生成的目录。-
在 Unix 系统上,使用兼容 POSIX 的 shell:
(此处及下文均以
linux-amd64为例。 请务必下载并使用适用于您平台的版本。)-
提取文件:
tar -f ./dnscrypt-linux-amd64-v2.2.3.tar.gz -v -x -z输出示例:
linux-amd64/linux-amd64/README.mdlinux-amd64/LICENSElinux-amd64/dnscrypt -
转到提取的目录:
cd ./linux-amd64/ -
生成配置文件:
./dnscrypt generate --provider-name '2.dnscrypt-cert.example.org' --out ./dnscrypt.yaml输出示例:
2022/01/02 12:34:56 [info] Generating configuration for 2.dnscrypt-cert.example.org2022/02/02 12:34:56 [info] Configuration has been written to ./dnscrypt.yaml2022/02/02 12:34:56 [info] Go to https://dnscrypt.info/stamps to generate an SDNS stamp2022/02/02 12:34:56 [info] You can run a DNSCrypt server using the following command:2022/02/02 12:34:56 [info] dnscrypt server -c ./dnscrypt.yaml -f 8.8.8.8
-
-
在 Windows 上,使用 PowerShell:
(此处及下文中,
windows-amd64用作示例。 请确保下载并使用适用于您的 CPU 架构的版本。)-
提取文件:
Expand-Archive -Path .\dnscrypt-windows-amd64-v2.2.3.zip -
转到提取的目录:
Set-Location -Path .\dnscrypt-windows-amd64-v2.2.3\windows-amd64\ -
生成配置文件:
.\dnscrypt.exe generate --provider-name '2.dnscrypt-cert.example.org' --out .\dnscrypt.yaml输出示例:
2022/01/02 12:34:56 [info] Generating configuration for 2.dnscrypt-cert.example.org2022/02/02 12:34:56 [info] Configuration has been written to .\dnscrypt.yaml2022/02/02 12:34:56 [info] Go to https://dnscrypt.info/stamps to generate an SDNS stamp2022/02/02 12:34:56 [info] You can run a DNSCrypt server using the following command:2022/02/02 12:34:56 [info] dnscrypt server -c .\dnscrypt.yaml -f 8.8.8.8
-
其中
example.org是您的主机名,./dnscrypt.yaml是配置输出文件的名称。您可以将二进制文件的路径添加到您的
PATH/$env:PATH中。 -
-
在配置文件(通常为
AdGuardHome.yaml)中,添加以下内容:'tls':# N.B. The encryption must be enabled.'enabled': true# …'port_dnscrypt': 5443'dnscrypt_config_file': './dnscrypt.yaml'其中
5443是您的 DNSCrypt 服务器端口,./dnscrypt.yaml是步骤 2 中生成的配置文件的名称。重要信息修改配置文件前,请先停止 AdGuard Home。
tip在 Windows 上,建议使用配置文件的完整路径。 例如,
C:\用户\Me\文件\dnscrypt.yaml。
生成 DNSCrypt stamp
以下是如何生成 DNSCrypt stamp 并检查安装:
-
输入来自您的 DNSCrypt 配置文件中的数据。 「提供方公钥」即您 DNSCrypt 配置文件中
public_key字段的值。note输入带有自定义端口的主机。
-
现在您会得到一个类似这样的印章:
sdns://AQcAAAAAAAAADTEyNy4wLjAuMTo0NDMg8R3bzEgX5UOEX93Uy4gYSbZCJvPeOXYlZp2HuRm8T7AbMi5kbnNjcnlwdC1jZXJ0LmV4YW1wbGUub3Jn运行以下命令检查安装:
./dnscrypt lookup-stamp \--domain 'example.com' \--stamp 'sdns://AQcAAAAAAAAADTEyNy4wLjAuMTo0NDMg8R3bzEgX5UOEX93Uy4gYSbZCJvPeOXYlZp2HuRm8T7AbMi5kbnNjcnlwdC1jZXJ0LmV4YW1wbGUub3Jn' \--type 'a'或者,在 Windows 上:
.\dnscrypt.exe lookup-stamp `--domain 'example.com' `--stamp 'sdns://AQcAAAAAAAAADTEyNy4wLjAuMTo0NDMg8R3bzEgX5UOEX93Uy4gYSbZCJvPeOXYlZp2HuRm8T7AbMi5kbnNjcnlwdC1jZXJ0LmV4YW1wbGUub3Jn' `--type 'a'其中
example.com是要查询的域名。
配置设备以使用 DNSCrypt
所有平台
dnscrypt-proxy(参考实现)。 DNSCrypt-Proxy 是一个命令行代理,支持 Linux、BSD、Windows、macOS、Android 等系统。
Android
- AdGuard Android 版支持 DNSCrypt。
iOS
- AdGuard iOS 版支持 DNSCrypt。
- DNSCloak 内部使用
dnscrypt-proxy,并支持 DNSCrypt。
Windows
- AdGuard Windows 版支持 DNSCrypt。
- Simple DNSCrypt 是一个在 Windows 上配置和运行
dnscrypt-proxy的简易管理工具。
更多信息请参阅 DNSCrypt 官网和 DNS 隐私项目列表。