近期 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=
来设置所需的缓存类型
1
dzdh 64 天前 1
想知道这个 ech 是的公钥私钥怎么生成的 nginx 需要怎么配置 其他语言如 go/rust 做 server 怎么适配。
|
2
terrytw OP @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 不清楚 |
4
baraja 63 天前
我测下来结果是
linux 下,firefox 和 chrome 不开 doh 依然有 ech 。 然而 windows 下,firefox 可以不开 doh ,chrome 不开 doh 就没有 ech ,挺奇怪的 |
5
Cusmate 63 天前
如果 udp dns 返回有 HTTPS 记录并且有 ECH 数据但是 A 记录和 AAAA 记录是被污染的 IP 地址,Chrome 能打开网站吗?
|
6
yxmyxmyyy 63 天前
firefox 能直接域名访问非标准端口,而 chrome 还不行,两个都支持用 udp 的 dns 获取 https 记录
|
7
czfy 61 天前
在客户端需要什么特别的配置吗?因为我目前只是在 firefox 上启用了 DoH ,没有在系统层启用
|
8
Coelacanthus 59 天前
@baraja Firefox 以前也是 ECH requires DoH 的,被人骂了大概有个五年多吧,最后改了。
https://bugzilla.mozilla.org/show_bug.cgi?id=1500289 |