【2025/01/30|教程|隐私安全|审查规避】安全DNS与安全SNI简易配置教程: 补全HTTPS最后的安全拼图, 预防DNS污染与SNI阻断 其他工具 系统优化 APP IOS 技术教程

Tsurumaki_Kokoro 资源大神 举报
1154 8
目录

前言 (P1)

(本部分内容摘编自:节点订阅 β By ZGQ Inc.

某些网站在国内地区无法访问,通常有三种可能:

  1. 网站已关闭。

  2. IP 被墙。

  3. DNS 污染(域名被墙)

一部分情况属于第 3 种,可通过以下方法解决此问题:

  • 修改设备的 hosts 文件。

  • 自定义 DNS 服务器。

    • 本作者注:此方法不会改变 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 查询所使用的端口号,853 端口(DoT/DoQ)相比于 443 端口(DoH/ODoH/DNSCrypt)受干扰程度更大。

请自行根据使用体验选择 DNS 提供商。可在以下网站中测试国内不同省(市)对某一 DNS 提供商的干扰程度:

  • https://itdog.cn

  • https://zhale.me

  • https://whatsmydns.net

    • 主要用于测试网站的 DNS 记录在全球范围内的传播情况。测试前请选择 A 类型(IPv4)或 AAAA 类型(IPv6),若多次测试后“China”的结果一直为红叉,则说明被测试网站在 CN 被墙。

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.1tls://1.1.1.1https://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:11053127.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.12606:4700:4700::1111 (IPv6 地址在此处无需添加中括号),请确保填入的 IP 地址均来自同一提供商的同一 DNS 服务端;“SERVER URL”填写与“SERVERS”中的 IP 地址相对应的 URL,此处为 https://cloudflare-dns.com/dns-query

1.2 配置安全 SNI

ECH 与安全 DNS 强绑定,这意味着当安全 DNS 配置完毕,ECH 通常随之配置完毕。但需注意以下几点:

  • 尽量避免使用知名度过低的 DNS 提供商。

  • 除了浏览器版本,系统版本亦是影响设备是否支持 ECH 的重要因素之一。这点在 iOS 和部分 Android 发行版中体现得尤为明显——为避免“性能锁”而选择不接受更新,但同时无法享受到最新的增强网络隐私与安全的新特性。(叠甲:并没有引导这些用户去升级系统的意思,厂商的“流氓行为”的确客观存在)

可通过以下方式检查浏览器中与 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(1)_1.png

2.1.2(2) AdGuard Home

请确保准备访问待测试域名的设备的 DNS 指向正在运行 AdGuard Home 的设备的地址。

进入 AdGuard Home 的 Web UI,在“设置 -> DNS 设置 -> 日志配置”中勾选“启用日志”,随后点击“查询日志”。

切换设备(若没有多余的设备,直接新增浏览器分页且确保系统 DNS 配置正确亦可),访问待测试域名。访问完毕后,切换到 Web UI 界面并刷新,查询与测试域名相关的 HTTPS 类型的 DNS 响应,若响应中包含 ech=xxx,则意味着服务端支持 ECH。

2.1.2(2)_1.png

2.2 DNS 泄露测试

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

3.1 FAQ

  • 在不使用 VPN 与代理时,中间人总能知道用户访问的 IP 地址,根据 IP 地址可推测出具体网站。这样看来,ECH 的作用在哪?

    • “根据 IP 地址可推测出具体网站”这一点不是 100% 成立。现代互联网广泛使用 CDN,这意味着存在多个网站共用同一个 IP 地址的情况,直接封锁 CDN 的 IP 将误伤大量正常网站。这也是 GFW 使用 SNI 阻断的原因之一——实现选择性地高精度地阻断到单一 IP 地址的流量。

    • 在 Client Hello 消息中,SNI 不是唯一的敏感信息。ECH 会加密整个 Client Hello 消息以解决 TCP 握手过程中几乎所有隐私问题。

  • 若安全 DNS 服务端本身被墙该怎么办?
    • IP 黑名单:无解,请选择其它 DNS 提供商。

    • DNS 污染 / SNI 阻断:似乎看起来陷入“鸡生蛋”的难题,其实不然。

      • AdGuard Home 与其它含 Bootstrap DNS 的软件:在 Bootstrap DNS 中以纯 IP 形式填入安全 DNS 提供商的地址(DNSCrypt 可直接填入),例如:

        • https://149.112.112.11/dns-query

        • tls://149.112.112.11

        • sdns://AQMAAAAAAAAADTkuOS45LjExOjg0NDMgZ8hHuMh1jNEgJFVDvnVnRt803x2EwAuMRwNo34Idhj4ZMi5kbnNjcnlwdC1jZXJ0LnF1YWQ5Lm5ldA

      • 不含 Bootstrap DNS 的软件:在上游 DNS 中以纯 IP 形式填入安全 DNS 提供商的地址(DNSCrypt 可直接填入)。

参考资源

曲终人散,黄粱一梦,该醒了!
最新回复 ( 8 )