关于 Encrypted client hello(ECH)的一个小提醒

1 天前
 terrytw

近期 cloudflare 为 free 用户逐步开启了 ECH, V2 也已经开启, 有人在讨论 https://v2ex.com/t/1076154

有一个自己遇到的小问题, 提示各位一下

ECH 大体上是依赖三个部分, 服务端(如 nignx)的设置, 客户端(如浏览器)的设置, 以及 DNS 的设置

DNS 是依赖 HTTPS 记录(type 65)来提供服务端的 public key 和 outer SNI 的, 比如 v2 的 DNS 记录:

https://dns.google/query?name=v2ex.com&rr_type=HTTPS&ecs=

可以看到包含ech=AEX+DQBB4gAgACDmyFU4oeqVH/jutZB8Nu5Ve9dGQ5OnELvHv/Z7yR+ZbgAEAAEAAQASY2xvdWRmbGFyZS1lY2guY29tAAA=

对于 chrome 来说, 即使上游是 UDP 的 DNS, 只要可以提供正确的 HTTPS 记录, 并且 chrome 自身开启了 ECH, 服务端开启了 ECH, 这三个条件满足, 就可以使用 ECH

那么这里有一个巨大的坑, 就是 cache....

dnsmasq 旧版本只能缓存常见类型如 A 和 AAAA, 只有在最新版 2.90 才提供了缓存其他类型记录的选项, 并且默认是不开启的, 所以后果就是, 第一次访问的时候, 你会使用 ECH, 但是如果再次访问, 命中了 DNS 缓存, 返回记录不再包含 HTTPS 记录, 就不再使用 ECH 了

所以如果你用了 dnsmasq 作为本地 DNS forwarder(比如 Openwrt), 那么请在 conf 里加上--cache-rr=ANY或者自己手动加上多行--cache-rr=来设置所需的缓存类型

864 次点击
所在节点    宽带症候群
5 条回复
dzdh
1 天前
想知道这个 ech 是的公钥私钥怎么生成的 nginx 需要怎么配置 其他语言如 go/rust 做 server 怎么适配。
terrytw
1 天前
@dzdh 技术细节请参照 https://datatracker.ietf.org/doc/draft-ietf-tls-esni/
简单介绍请见 https://blog.cloudflare.com/announcing-encrypted-client-hello/
nginx 好像已经支持了, 细节未知, 因为我不用
go 的话, Google 那边的 Roland 在写, 1.24 会上
rust 不清楚
dreamk
20 小时 39 分钟前
baraja
4 小时 28 分钟前
我测下来结果是
linux 下,firefox 和 chrome 不开 doh 依然有 ech 。
然而 windows 下,firefox 可以不开 doh ,chrome 不开 doh 就没有 ech ,挺奇怪的
Cusmate
3 小时 48 分钟前
如果 udp dns 返回有 HTTPS 记录并且有 ECH 数据但是 A 记录和 AAAA 记录是被污染的 IP 地址,Chrome 能打开网站吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1080301

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX