Soup's Blog

Back

在 LINUX DO 上看到一篇介绍挺到位的帖子:作者 1molchuan 分享了一个「把 ECH 用到极致」的 DoH 服务,两个入口:

  • https://edge.1molchuan.top/linuxdo —— 普通版
  • https://edge.1molchuan.top/plus —— 加强版(把几款受限 AI 服务走中继出境)

这篇不吹产品,而是把它当成一个案例样本,把里面每个技术点拆开讲:它解决了什么问题、原理是什么、为什么有效。文章按「先补基础概念 → 再逐条拆解 → 最后看效果」的顺序来,即使以前没细究过 DNS / TLS 也能看懂。

一、先补几个基础概念#

要理解这个 DoH 牛在哪,得先知道它到底在「修补」互联网的哪个环节。下面用尽量口语的方式讲。

1. DNS:互联网的电话簿#

你在浏览器输入 linux.do 并回车,电脑第一步不是立刻连接网站,而是先查电话簿:linux.do 这个域名对应哪个 IP 地址(IP 才是服务器真正的「门牌号」)。这个「用域名查 IP」的过程就叫 DNS 查询。

传统 DNS 的问题是:查询是明文的,走 UDP 53 端口。这意味着你查询 linux.do 这个动作,运营商、路由器、任何经过的中间人都能看到,甚至能篡改——篡改结果就是俗称的「域名污染 / 劫持」。

2. DoH:把「查电话簿」用 HTTPS 加密#

DoH(DNS over HTTPS) 的思路很简单:既然查电话簿是明文的,那就把它塞进 HTTPS 加密通道里。

效果立竿见影:中间人只能看到「你在和某个 IP 通信」,但看不到你查了哪个域名,也没法篡改查询结果。这也是它能绕开一部分基于「看明文 DNS」的审查/劫持的原因。

3. HTTPS 与 SNI:「内容」加密了,但「访问谁」是暴露的#

HTTPS 大家都熟——浏览器和服务器之间的流量加密,地址栏那小锁图标就是它。但它有个历史遗留问题。

一个服务器 IP 上往往托管着成千上万个网站(尤其是 CDN 的服务器)。TLS 握手的第一句话,客户端必须告诉服务器「我到底要访问的是哪个网站」,这个字段叫 SNI(Server Name Indication)。在旧的实现里,SNI 是明文的。

换句话说:即使你用 HTTPS,中间人看不到你聊了什么,但他能看到这句开场白里写着 linux.do 或 instagram.com——你访问了哪个网站,是裸奔的。

4. ECH:把「访问谁」也加密掉#

ECH(Encrypted Client Hello,加密客户端问候) 就是来解决上面这个问题的:它把 TLS 握手最开头的「问候」整段——包括 SNI——用公钥加密。这样旁观者连「你访问的是哪个网站」都看不到了。它比 HTTPS 更进一步,是近期被推行的隐私增强技术。

关键点(记住这个,后面全靠它):ECH 想生效,客户端得先拿到网站的「加密公钥」。而这把公钥,通常要放在 DNS 的 HTTPS 记录里发布出去,浏览器查到记录里的公钥,才能完成加密。

问题就出在这:很多网站虽然服务器支持 ECH,却从不把公钥发布到 DNS,导致浏览器「想用 ECH 也无从下手」。而 Cloudflare 上的一大票网站,恰好共用同一套 ECH 公钥——服务器端都能解,但站点自己不发布。

5. CDN 与 Anycast:同一个 IP 遍布全球#

CDN 把网站内容缓存到全球各地机房。Anycast(任播) 让同一个 IP 同时出现在全球很多机房,路由协议会自动把你导向离你最近、延迟最低的那个节点。所以很多大站对外只广播少数几个 IP,却能做到「无处不在、就近响应」。

6. CNAME 与「拍平」#

CNAME 是「别名记录」。比如 www.example.com 别名指向 example.cdn.com,浏览器得先解析出它别名到谁、再继续解析那个人,多跳一次。

拍平(Flatten) 就是:由 DNS 服务器替你把这些层层跳转走完,直接把最终的 IP 地址返回给你,省掉你自己多解析一次的时间。

7. SVCB / HTTPS 记录:一条顶过去好几条#

这是新一代的 DNS 记录类型(type 65)。它一条记录里能打包告诉浏览器很多事情,包括:

  • alpn:网站支持 HTTP/2 还是 HTTP/3;
  • ech:网站的 ECH 公钥;
  • ipv4hint / ipv6hint:顺带建议的 IP,少一次解析。

现代浏览器(Chromium 系、Firefox)到支持这种记录的网站时,就是靠它判断「能不能开 HTTP/3、有没有 ECH」。

8. HTTP/3 与 QUIC#

HTTP/2 仍基于 TCP(可靠但握手略慢);HTTP/3 换成基于 UDP 的 QUIC——握手更快、弱网更抗抖动。缺点是国内很多线路的 UDP 不稳(被限速甚至丢弃),强行上 HTTP/3 反而更卡。

9. 「优选 IP」#

同一个 CDN,不同 IP(或同一 Anycast IP 落到不同节点)在你当前网络里的体验可能天差地别。优选 IP 就是提前拿一批候选 IP,逐个真实探测,挑出「当前对你最稳、最快」的那几个,而不是让 DNS 随手给你一个。

概念铺完,下面进入正题:这个 DoH 到底做了什么。

二、这个 DoH 做了什么:九个技术点逐条拆解#

作者介绍的核心特性有九条,我按「解决的问题 → 做法 → 为什么有效」重新讲一遍。

1. 给托管在 Cloudflare 的站点补上 ECH#

  • 问题:Cloudflare 上的站点共用一套 ECH 公钥、服务器能解,但很多站点(比如 linux.do)自己没在 DNS 发布这把公钥。于是浏览器查到的 HTTPS 记录里 ech 缺失,ECH 想开也开不了。
  • 做法:这个 DoH 只要能判断出「某域名托管在这家 CDN 上」,就在返回给浏览器的 HTTPS 记录里,直接把那家 CDN 的 ECH 公钥补进去。
  • 效果:实测这类站点照样能完成 ECH 握手。我验证 linux.do 时,它返回的 HTTPS 记录含 ech(见文末实测)。

2. 双 CDN 大站:统一指向支持 ECH 的那家#

  • 问题:有些大站(作者举 x.com 为例)同时用两家 CDN,按请求来源分配。国内解析经常被分到不支持 ECH 的那家。
  • 做法:逐个子域名检查「能不能走支持 ECH 的那家」,能走就统一指过去并补上 ECH,不能走的原样返回。

3. 自带 ECH 但不公开公钥:内置公钥 + 自动换钥#

  • 问题:有些大型网站(作者举 Meta 系列,如 instagram.com)自己的服务器支持 ECH,却从不把公钥发布到 DNS,客户端根本拿不到钥匙。
  • 做法:这个 DoH 内置了它们的公钥,并让国内探测机每半小时用这把钥匙真实握手一次:
    • 握手成功 → 继续用;
    • 对方换了钥匙 → 从这次握手返回里取出新钥匙,自动换上;
    • 取不到能用的钥匙 → 暂停注入、退回普通解析,免得把网站弄坏。
  • 补充解释:这就是前面第 4 点的应用——公钥这种会「过期换钥」的东西,靠内置一份「快照」不行,得持续跟踪,这个「每半小时握手验证」就是在自动维护这把钥匙的新鲜度。

4. 国内实测的优选 IP 池(IPv4 + IPv6)#

  • 问题:CDN 默认给国内用户的 IP 未必是最优的,可能慢、可能不稳。
  • 做法:上海、北京各一台探测机,每半小时测一轮。候选 IP 来自社区常用优选域名,两台探测机还互相推荐。筛选标准很严:
    • 每个 IP 连续 12 次真实 ECH 握手 + 请求页面,每次都得返回 200,失败一次就淘汰;
    • 长期看:历史成功率低于 90% 的不要,明显比最快那批慢一截的也不要;
    • 两台探测机结果互相印证,两边都认可才进池子。
  • 补充解释:「200」是 HTTP 状态码里表示「正常返回」的代号。要求「真握手 + 真请求页面」而不是 ping,是为了保证这个 IP 不仅能连、还能真正提供内容。

5. 剔除「挑站点」的 IP#

  • 问题:Cloudflare 有些 IP 只服务特定套餐的站点。比如 x.com 是企业站点,有的 IP 只对它开放,访问普通站点(如 linux.do)却返回 403(无权访问)。作者说测试时 L 站头像偶尔加载不出来,就是分到了这种「挑站点」的 IP。
  • 做法:测试时交替用两类站点,只要有一类不通,这个 IP 就淘汰——确保进池子的 IP 对普通站和大站都通用。

6. 保证浏览器真的用上 ECH(两处细节决定成败)#

这只是「补 ECH」的配套,却很关键:

  • 拍平 CNAME:Chromium 系浏览器要求「地址记录」和「HTTPS 记录」落在同一个域名上才肯用 ECH。站点一旦用了 CNAME,两者就不一致,浏览器会不声不响地放弃 ECH。所以这个 DoH 先把 CNAME 链拍平,让两者对齐。
  • 过期缓存先返回:浏览器等 HTTPS 记录只肯等几十毫秒,超时就直接放弃 ECH。所以缓存一过期,这个 DoH 先把旧记录返回(保证浏览器及时拿到、用上 ECH),再在后台刷新。这是「先要可用、再求新鲜」的典型策略。

7. HTTP/3 按实测开关#

  • 问题:国内很多线路 UDP 不稳,盲目开 HTTP/3 反而更卡(呼应基础概念的 QUIC 那段)。
  • 做法:探测机实测每个站点的 QUIC + ECH,两台机器连续三轮都稳定才开,任何一轮不稳就退回 HTTP/2。开不开不是拍脑袋,而是实测出来的。

8. 定时自检#

探测机每半小时从国内按「浏览器的规则」把常用站点检查一遍,确认返回的记录能让浏览器真正用上 ECH,结果上报服务器。相当于持续跑回归测试,防止某次调整把网站「弄坏」。

9. 其他细节#

  • 国内网站就近解析:对常用国内域名,带上请求方所在网段(IPv4 只带前 24 位、IPv6 只带前 48 位),让国内 CDN 返回离你近的节点,不会因为 DoH 服务器架在境外就给你境外节点。
  • 多上游并发查询:同时问几个上游 DNS,谁先回用谁;上游全挂时先用过期缓存顶上。国内站点走腾讯/阿里/Google 的 DNS,国外走 1.1.1.1 和 8.8.8.8。

三、整体架构#

浏览器 ──DoH──▶ 香港入口(对国内线路友好)──▶ DoH 服务
                                    ▲
              国内探测机(上海、北京)每半小时上报:
              优选 IP / ECH 公钥状态 / HTTP3 结果 / 自检结果
plaintext

两个要点:

  1. DoH 入口架在香港:对国内线路更友好(国内直连香港延迟低)。
  2. 优选 IP 的探测在国内做:「一个 IP 优不优」必须从国内测才准确,境外测了没意义。服务器负责聚合探测结果,按域名策略动态改写解析结果。

四、/plus 加强版:按需中继#

/plus 在普通版基础上,把几家 AI 服务的域名解析成「中继」的 IP,而不是 Cloudflare 的 IP:

浏览器 ══ECH══▶ 三网优化 VPS ──▶ azure ──▶ CDN ──▶ AI 服务
                        对方看到的是美国大厂 IP
plaintext

补充解释「中继」:中继就是中间多一台服务器帮你转发流量。这里的关键好处是——网站看到的来源 IP 是「中继那台机器」的 IP(美国大厂 IP),而不是你的真实 IP。这常被用于解锁区域内容、规避风控。

几个显得比较克制的设计:

  • 端到端 TLS:中继只转发字节,浏览器和网站之间是端到端加密,中继解不开任何内容;握手里的真实域名也被 ECH 加密,中继只看得到 CDN 公共的外层名字。
  • 不是开放代理:中继只放行「外层名字是 CDN ECH 公共名字」的连接,其他一律拒绝,杜绝被当公共代理滥用。
  • 只影响那几个域名:其他网站照常直连、出口仍是你自己的 IP。据项目介绍,目前只有 chatgpt.com 和 grok.com;claude.ai、gemini 因为不托管在 Cloudflare,做不了。
  • 为什么要单独一个地址:如果你开着按域名分流的代理客户端,ECH 会让它认不出域名,这几家 AI 的流量会绕过你自己的代理规则、改走中继,造成尴尬。所以默认地址不做中继,只有明确选 /plus 才启用。作者的建议也是「普通版就够用了」。

/plus 的限制(作者明确写出的):

  • 必须真的用上 ECH,否则中继不接(只在系统/路由器上配 /plus、或用不支持 ECH 的客户端,这几家 AI 会直接打不开);
  • 这几个域名只返回 IPv4(中继目前只开 IPv4 入口,若同时返回 CDN 的 IPv6,浏览器会优先走 IPv6 直连、绕过中继);
  • 只走 HTTP/2(中继只转发 TCP,不支持 HTTP/3);
  • 所有 /plus 用户共用一个出口 IP,可能遇验证码或风控,账号安全自负;
  • 中继只换出口 IP,浏览器时区、语言等信息不会改。

五、我的实测(国内阿里云机)#

下面是我在你的国内机上用标准 DoH(application/dns-message)实际查询的结果,佐证前面的说法:

域名普通版解析结果plus 版解析结果
linux.doCF 优选 IP(172.64.229.174/.185)同左(照常直连)
chatgpt.comCF 优选 IP50.118.184.220(中继入口)
grok.comCF 优选 IP50.118.184.220(中继入口)
claude.ai160.79.104.10不变(不做中继)
gemini.google.comGoogle IP 池不变(不做中继)

两个补充观察:

  • linux.do 的 HTTPS 记录里带了 ech 参数(params=[alpn, ipv4hint, ech, …]),而它自己并不在 DNS 发布 ECH 公钥——这正是「被补上去的 ECH」。
  • www.instagram.com 返回两条 HTTPS 记录(priority 1 和 2)都带 ech,对应「Meta 内置公钥 + 自动跟踪换钥」。

这组数据干净地印证了项目说法:中继只作用于 chatgpt.com / grok.com,其他域名包括 claude.ai 和 Gemini 都原样直连。

六、局限与风险(有话直说)#

  1. 第三方信任:DoH 意味着你把「访问了哪些域名」的元数据交给了这个服务。它自称端到端 TLS 透传、中继只认 ECH 外层名,但信不信要你自己判断。
  2. 个人项目,持续性存疑:可用性、命长、限流都看作者投入,不适合当生产依赖。
  3. /plus 共用一个出口 IP:账号风控、验证码风险作者已自认,勿用于重要账号。
  4. ECH 依赖客户端:浏览器(较新的 Chromium 系、Firefox)基本已支持 ECH,但系统/路由器若直接配 /plus,会因不支持 ECH 而打不开那几家 AI。
  5. 不是传统意义的「翻墙」:它主要解决「加密握手 + 优选 IP + 特定站中继」,普通版不改变你的出口 IP。

七、怎么用#

  • 浏览器:在「安全 DNS / 自定义 DoH」里填入 https://edge.1molchuan.top/linuxdo(Chrome、Edge、Firefox、Brave 均支持自定义 DoH)。
  • 普通版就够:作者原话。想体验那几家 AI 走中继再单独用 https://edge.1molchuan.top/plus,但先读完上面的限制清单。

小结#

读完整篇你会发现,这个 DoH 的「核心作业」其实只有一件事:在客户端和 CDN 之间,做一层智能的 DNS 改写与择优——DNS 记录不再机械地原样返回,而是经过「补 ECH、拍平 CNAME、优选 IP、按域名分流」的加工,让浏览器在手感不变的情况下,多拿到一份加密隐私、少踩一些国内线路的坑。

它最大的价值在于:把「用上 ECH」这件事的门槛降到了最低——你不用懂公钥、HTTPS 记录、CNAME 拍平这些细节,只要在浏览器填一个 DoH 地址,剩下的都由它代劳。

本文为对第三方公开项目的技术解读,实测数据来自国内阿里云环境,仅作原理交流,不构成对任何服务可用性、安全性与合规性的承诺。

拆解一个硬核 DoH:补 ECH、优选 IP、按需中继,一文讲透
http://localhost:4321/blog/netsec_blogs/doh-ech-practice
Author Soup Cola
Published at 2026年9月25日