在 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两个要点:
- DoH 入口架在香港:对国内线路更友好(国内直连香港延迟低)。
- 优选 IP 的探测在国内做:「一个 IP 优不优」必须从国内测才准确,境外测了没意义。服务器负责聚合探测结果,按域名策略动态改写解析结果。
四、/plus 加强版:按需中继#
/plus 在普通版基础上,把几家 AI 服务的域名解析成「中继」的 IP,而不是 Cloudflare 的 IP:
浏览器 ══ECH══▶ 三网优化 VPS ──▶ azure ──▶ CDN ──▶ AI 服务
对方看到的是美国大厂 IPplaintext补充解释「中继」:中继就是中间多一台服务器帮你转发流量。这里的关键好处是——网站看到的来源 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.do | CF 优选 IP(172.64.229.174/.185) | 同左(照常直连) |
chatgpt.com | CF 优选 IP | 50.118.184.220(中继入口) |
grok.com | CF 优选 IP | 50.118.184.220(中继入口) |
claude.ai | 160.79.104.10 | 不变(不做中继) |
gemini.google.com | Google 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 都原样直连。
六、局限与风险(有话直说)#
- 第三方信任:DoH 意味着你把「访问了哪些域名」的元数据交给了这个服务。它自称端到端 TLS 透传、中继只认 ECH 外层名,但信不信要你自己判断。
- 个人项目,持续性存疑:可用性、命长、限流都看作者投入,不适合当生产依赖。
- /plus 共用一个出口 IP:账号风控、验证码风险作者已自认,勿用于重要账号。
- ECH 依赖客户端:浏览器(较新的 Chromium 系、Firefox)基本已支持 ECH,但系统/路由器若直接配
/plus,会因不支持 ECH 而打不开那几家 AI。 - 不是传统意义的「翻墙」:它主要解决「加密握手 + 优选 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 地址,剩下的都由它代劳。
本文为对第三方公开项目的技术解读,实测数据来自国内阿里云环境,仅作原理交流,不构成对任何服务可用性、安全性与合规性的承诺。