前言 (P1)
(本部分内容摘编自:节点订阅 β By ZGQ Inc.)
某些网站在国内地区无法访问,通常有三种可能:
-
网站已关闭。
-
IP 被墙。
-
DNS 污染(域名被墙)。
一部分情况属于第 3 种,可通过以下方法解决此问题:
-
修改设备的 hosts 文件。
-
自定义 DNS 服务器。
-
使用安全 DNS 与安全 SNI。
本教程将围绕着第三种方法展开。
注意: 诸如 Google 等网站和某些 APP 是直接被墙 IP,这种情况下只能在科学上网后访问。
前言 (P2)
安全 DNS 和安全 SNI 是为了提升网络通信的隐私和安全而设计的,作用在不同的层面。
1. 安全 DNS
- 代表技术:
- DNS-over-TLS(DoT)
- DNS-over-HTTPS(DoH)
- DNSCrypt
- Oblivious DNS-over-HTTPS(ODoH)
- DNS-over-QUIC(DoQ)
- DNSCurve
- 背景: 传统的 DNS 查询通常使用明文传输,这意味着用户的 DNS 查询请求(例如,用户访问的网址)对 ISP、中间人等都是可见的。这会暴露用户的浏览习惯,并可能被用于监视。
- 工作原理: 安全 DNS 通过使用加密协议(HTTPS、TLS 或 QUIC 等)来加密 DNS 查询请求和响应。
2. 安全 SNI
- 代表技术:
- Encrypted SNI(ESNI)
- Encrypted Client Hello(ECH)
- 背景: 传统的 TLS 握手过程中,客户端发送的 Client Hello 消息包含一个名为 Server Name Indication (SNI, 服务器名称指示) 的字段,该字段以明文形式指示客户端要连接的服务器域名。这意味着即使用户使用 HTTPS 连接,ISP 和其他中间人仍然可以看到用户正在访问哪个网站。
- 工作原理: ECH 通过加密包括 SNI 字段在内的整个 Client Hello 消息来解决这个问题。
- 加密 Client Hello: 客户端使用服务器的公钥(从支持安全 DNS 的 DNS 服务器获取)加密整个 Client Hello 消息,包括 SNI 字段。
- 解密 Client Hello: 服务器收到加密的 Client Hello 消息后,使用其私钥解密,获取 SNI 字段。
简单总结:
- 安全 DNS 保护的是 DNS 查询 过程的隐私和安全。
- 安全 SNI 保护的是 TLS 握手 过程的隐私。
前言 (P3: 观前提醒)
-
本教程仅为配置安全 DNS 与安全 SNI 的简易操作指南。
-
ECH 较为新兴,目前仅有部分网站实验性地启用 ECH,本教程提供测试服务端是否支持 ECH 的方法。
-
再次强调: 被墙 IP 的网站只能在科学上网后访问。
目录
1.1 配置安全 DNS
1.1.1 已知的 DNS 提供商
若读者知道其它列举 DNS 提供商的网站,欢迎在评论区补充。
1.1.2 一些注意事项
多数服务商的 (O)DoH/DoT/DoQ 的 tls 证书是没有对 IP 地址签发认证的,必须写实际的域名,但也有一些 (O)DoH/DoT/DoQ 提供商可以直接使用 IP 作为主机名访问,例如 CloudFlare 的 1.1.1.1
和阿里云公共 DNS 的 223.5.5.5
。(摘编自:DNS 服务 | 新 V2Ray 白话文指南)
大多数浏览器和操作系统的设置仅支持添加 (O)DoH 提供商。
GFW 对于境外 DNS 提供商,存在不同程度的干扰(轻则间歇丢包,重则封锁 IP),具体干扰程度通常与以下因素相关:
请自行根据使用体验选择 DNS 提供商。可在以下网站中测试国内不同省(市)对某一 DNS 提供商的干扰程度:
1.1.3 浏览器设置
1.1.3(1) Chrome 与其它基于 Chromium 的浏览器
在“设置 -> 隐私和安全 -> 安全/安全性”中,启用“使用安全 DNS”并选择“添加自定义 DNS 服务提供商”,输入 (O)DoH 提供商的地址后回车。
1.1.3(2) Firefox 与其它基于 Mozilla Firefox 的浏览器
在“设置 -> 隐私与安全 -> 基于 HTTPS 的 DNS”中,启用策略选择“增强保护”或“最大保护”,随后在“选择提供方”中选择内置提供商或自定义提供商。
1.1.4 系统设置 (Windows 11)
在“设置 -> 网络和 Internet 设置 -> WLAN(无线局域网) -> 硬件属性”或“设置 -> 网络和 Internet 设置 -> 以太网”中,找到“DNS 服务器分配”并点击“编辑”,启用 IPv4 和按需启用 IPv6。在“首选 DNS”中输入 (O)DoH 提供商的纯 IP 地址,在“DNS over HTTPS”中选择“开(手动模板)”并输入 https://提供商的域名/dns-query
,随后保存。
提示: 部分 (O)DoH 提供商的 URL 不以 dns-query
结尾,请以提供商的最新信息为准。
1.1.5 第三方软件
1.1.5(1) AdGuard Home
推荐使用该软件。
适用于:Windows、macOS 和 Linux。其它类型设备可修改 DNS 为正在运行 AdGuard Home 的设备的地址。
官网:AdGuard Home| 适用于任何操作系统(Windows,macOS,Linux)的网络软件。
官方 GitHub 项目地址:GitHub - AdguardTeam/AdGuardHome: Network-wide ads & trackers blocking DNS server。
无法访问 GitHub?尝试访问以下链接(由本作者手动上传至屋舍,仅有 Windows 和 Linux 的 amd64 版本且不保证更新):
以 Windows 为例,下载完毕并解压缩后,运行 AdGuardHome.exe
,随后在浏览器中输入 127.0.0.1:3000
(有可能是其它端口,具体请查看终端日志)。
点击“开始配置”。在步骤 2/5 中,网页管理界面(Web UI)监听端口建议选择一个非特权端口(1025-65535),DNS 服务器监听端口若无特殊需求则建议选择 53 端口,点击“下一步”。
在步骤 3/5 中,设置用户名和密码并点击“下一步”。
在步骤 4/5 中,根据 AdGuard Home 内置教程对当前设备和其它内网设备进行配置,随后点击“下一步”。
在步骤 5/5 中,点击“打开仪表盘”以结束初始配置。
在“设置 -> DNS 设置”中,分别在上游 DNS 服务器、后备(回落) DNS 服务器和 Bootstrap DNS 服务器中输入安全 DNS 提供商地址后点击“应用”。Bootstrap DNS 用于解析上游和后备 DNS 服务器的 IP 地址,其仅支持输入 IP,例如 quic://1.1.1.1
、tls://1.1.1.1
和 https://1.1.1.1/dns-query
,输入 DNSCrypt 提供商的地址时不受此限制。
若仅希望 AdGuard Home 作为 DNS 解析器,将 AdGuard Home 设置为启动项后即算结束。AdGuard Home 的功能不止这些,但其它功能已脱离本教程的范畴,故若有需要请自行搜索有关 AdGuard Home 的更多“玩法”。
1.1.5(2) Simple DNSCrypt
目前不推荐用该软件,其最新更新于 2020/04/11,问题较多,详见该软件的 GitHub Issues。如此用户友好的 DNS 软件停止更新,还是有些不甘心呢。
适用于:Windows。其它类型设备可修改 DNS 为正在运行 Simple DNSCrypt 的设备的地址(需调整部分设置)。
官方 GitHub 项目地址:GitHub - bitbeans/SimpleDnsCrypt: A simple management tool for dnscrypt-proxy。
屋舍(由本作者手动上传):
打开 Simple DNSCrypt,若 UI 界面语言不为简体中文,在窗口右上角找到“English”(语言设置)并点击,选择“Chinese Simp.”。
点击左上方“服务器”,若出现闪退且重试多次后问题依旧,请停用并卸载 Simple DNSCrypt 并改用其它软件。
在“主菜单 -> 设置”中,调整以下选项:
- 使用 IPv6 服务器:按需勾选。
- 只显示支持 DNSSEC 的服务器:默认被勾选,不建议关闭。
- 只显示不保留日志的服务器:默认被勾选,不建议关闭。
- 只显示不进行内容筛选的服务器:默认被勾选,在这些情况下可以关闭:
- 追求解析性能。
- 设备中已有与内容过滤相关的程序和服务等,例如防火墙和浏览器插件,不需要“双重过滤”。
在“主菜单 -> 网卡”中,除非读者知道各个网卡的作用,否则请选择所有网卡(不强制包括隐藏的网卡)。
在“主菜单 -> 服务”中,启用“DNSCrypt 服务”以使 Simple DNSCrypt 开始运行,中途可能会弹出 UAC 窗口,同意即可。
在“服务器”中,若需要自选 DNS 提供商,请关闭“自动模式”,随后在“可用的服务器”中选择至少一个提供商后点击“应用设置”。Simple DNSCrypt 不支持添加 DNS 提供商,但其内置大量提供商,故若没有特殊需求,无需过于在意这点。
在“高级设置”中,调整以下选项:
- DNS 缓存:建议开启。
- 阻止 IPv6:按需开启。
- 强制使用 TCP:按需开启。开启后,DNSCrypt 将使用 TCP/443 通信(默认使用 UDP/443),DoH 将不会使用 HTTP/3 通信。
- 全局代理:按需开启。开启后,其它内网设备可修改 DNS 为正在运行 Simple DNSCrypt 的设备的地址以使用安全 DNS。
- Fallback Resolvers(后备/回落解析器):在上游 DNS 解析器无法运作时,将使用该解析器。由于 Fallback Resolvers 使用传统的无加密 DNS,故若想取消它,在其中设置一个无效的 IPv4 地址即可。
最后,将 SimpleDnsCrypt.exe
设置为启动项,即算配置完毕。
1.1.5(3) RethinkDNS
适用于:Android。
官网下载页面:Downloads | Rethink,支持直链、F-Droid 和 Google Play 下载。
直接下载 .apk
文件(官方直链): https://dl.rethinkdns.com/app 。
官方 GitHub 项目地址:GitHub - celzero/rethink-app: DNS over HTTPS / DNS over Tor / DNSCrypt client, WireGuard proxifier, firewall, and connection tracker for Android.。
不止 GitHub,官网也无法访问?欧尼酱真是个无可救药的杂鱼呢~♥️❤️ 尝试访问以下链接(由本作者手动上传至屋舍):
RethinkDNS 不仅是一个提供安全的 DNS 解析服务的工具,亦是一个强大的防火墙工具。本章节仅涉及 DNS 配置,若有需要请自行搜索 RethinkDNS 防火墙配置相关内容。
在 RethinkDNS 首页中,点击“启动”按钮旁的箭头并选择包含“DNS”的模式后启动 RethinkDNS。RethinkDNS 以 VPN 模式运行,这意味着它无法与 Android 设备中的 VPN/代理软件共存,但若 VPN/代理软件支持仅代理模式(无 VPN 模式),可在“首页 -> 代理 -> 其他”中设置代理,实现一同运行。
在首页中点击“DNS”图标进入 DNS 设置,启用“防止 DNS 泄露”,随后在“类型”中选择内置提供商或自定义提供商。
回到首页,在“配置 -> 网络 -> 选择 IP 版本”中,按需选择 IPv4、IPv6 或自动。
在“配置 -> 设置 -> 一般设置”中,启用“设备启动时自启”。
Android 看重电池续航,通常不允许应用在后台无限制地运行。为了在使用 RethinkDNS 时避免这种情况,需手动将 RethinkDNS 排除在电池优化策略之外并授予 RethinkDNS “无障碍”权限,本章节以 LineageOS 为例。
在“设置 -> 应用 -> 应用的电池使用情况”中,找到 RethinkDNS 并点击,启用“允许后台使用”并点击这段文字,选择“无限制”;在“设置 -> 无障碍 -> 已下载的应用”中,找到 RethinkDNS 并点击,启用“使用 RethinkDNS”。
若使用其它 Android 发行版,请自行搜索设置方法。Android 发行版繁多,但在系统设置方面大同小异。
1.1.5(4) Nebulo
适用于:Android。其它类型设备可修改 DNS 为正在运行 Nebulo 的设备的地址(需调整部分设置)。
GitHub 项目地址(镜像):GitHub - Ch4t4r/Nebulo: Mirror of https://git.frostnerd.com/PublicAndroidApps/smokescreen. Feel free to contribute here as well.,README 为英文版本,内含多种下载渠道。
屋舍(由本作者手动上传):
Nebulo 专注于提供安全的 DNS 解析服务,配置难度相比于 RethinkDNS 较小。
Nebulo 默认以 VPN 模式运行,这意味着默认情况下它无法与 Android 设备中的 VPN/代理软件共存,但 Nebulo 支持以无 VPN 模式(仅代理模式)运行。在“首页左上方汉堡图标 -> 设置 -> 无VPN模式”中,启用“无VPN运行”,并在 VPN/代理软件中将 DNS 修改为 localhost:11053
、127.0.0.1:11053
或 [::1]:11053
(11053 号端口为其默认监听端口,可自行改为其它端口)。
启用无 VPN 模式后,其它内网设备亦可修改 DNS 为 [正在运行 Nebulo 的设备的地址]:(Nebulo 服务端监听端口)
以使用安全 DNS。
Android 看重电池续航,通常不允许应用在后台无限制地运行。为了在使用 Nebulo 时避免这种情况,需手动将 Nebulo 排除在电池优化策略之外并授予 Nebulo “无障碍”权限,具体详见章节 1.1.5(3)后半段。
注意: 并不是所有设备均支持在修改 DNS 时添加端口号,但 Nebulo 又无法指定不大于 1024 的端口,若碰到这种情况建议改用其它软件。
1.1.5(5) DNSecure
适用于:iOS。
在 App Store 中搜索 DNSecure,找到图标为“黄底白锁”的 DNSecure 并下载。若未找到软件,请在切换 App Store 的地区后再次搜索。
DNSecure 内置“Instructions”配置教程(英文,但有流程图)。
若需要添加自定义 DNS 提供商,在“左上角‘+’号 -> DNS-over-HTTPS/TLS”中,“NAME”自取;“SERVERS”填写提供商的纯 IP 地址,例如 1.1.1.1
和 2606:4700:4700::1111
(IPv6 地址在此处无需添加中括号),请确保填入的 IP 地址均来自同一提供商的同一 DNS 服务端;“SERVER URL”填写与“SERVERS”中的 IP 地址相对应的 URL,此处为 https://cloudflare-dns.com/dns-query
。
1.2 配置安全 SNI
ECH 与安全 DNS 强绑定,这意味着当安全 DNS 配置完毕,ECH 通常随之配置完毕。但需注意以下几点:
可通过以下方式检查浏览器中与 ECH 相关的设置是否正确:
-
Firefox: 在地址栏输入 about:config
,搜索 network.dns.ech.enabled
,若其值为 false
则请设置为 true
。 同时,确保 network.trr.mode
设置为 3
(强制使用 DoH) 或 2
(优先使用 DoH) 以启用 DoH。
-
Chrome/Chromium: Chrome/Chromium 通常默认启用 ECH,但可通过命令行参数 --enable-features=EncryptedClientHello
显式启用。
2.1 测试客户端与服务端对安全 SNI 的支持情况
若读者知道其它测试方法,欢迎补充。
2.1.1 测试客户端
2.1.2 测试服务端
2.1.2(1) dns.google
需科学上网,若访问失败请尝试加上 https://
前缀。
dns.google 是谷歌公共 DNS 解析器的网页。在“DNS Name”中输入待测试服务端的域名并点击“Resolve”,随后在左上角“RR Type”中输入“HTTPS”并再次点击“Resolve”。若响应中包含 ech=xxx
,则意味着服务端支持 ECH。

2.1.2(2) AdGuard Home
请确保准备访问待测试域名的设备的 DNS 指向正在运行 AdGuard Home 的设备的地址。
进入 AdGuard Home 的 Web UI,在“设置 -> DNS 设置 -> 日志配置”中勾选“启用日志”,随后点击“查询日志”。
切换设备(若没有多余的设备,直接新增浏览器分页且确保系统 DNS 配置正确亦可),访问待测试域名。访问完毕后,切换到 Web UI 界面并刷新,查询与测试域名相关的 HTTPS 类型的 DNS 响应,若响应中包含 ech=xxx
,则意味着服务端支持 ECH。

2.2 DNS 泄露测试
DNS 泄露测试在此处用于测试是否存在因某些设备/程序/服务等绕过安全 DNS 导致的 DNS 查询请求泄露给 ISP 与其它中间人的情况。若使用境外安全 DNS 提供商,那么结果(DNS 出口 IP)中不应存在境内 IP 地址。
3.1 FAQ
参考资源