V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
terrytw
V2EX  ›  宽带症候群

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

  •  1
     
  •   terrytw · 28 天前 · 1795 次点击

    近期 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=来设置所需的缓存类型

    11 条回复    2024-10-22 10:30:52 +08:00
    dzdh
        1
    dzdh  
       28 天前   ❤️ 1
    想知道这个 ech 是的公钥私钥怎么生成的 nginx 需要怎么配置 其他语言如 go/rust 做 server 怎么适配。
    terrytw
        2
    terrytw  
    OP
       28 天前
    @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 不清楚
    baraja
        4
    baraja  
       27 天前
    我测下来结果是
    linux 下,firefox 和 chrome 不开 doh 依然有 ech 。
    然而 windows 下,firefox 可以不开 doh ,chrome 不开 doh 就没有 ech ,挺奇怪的
    Cusmate
        5
    Cusmate  
       27 天前
    如果 udp dns 返回有 HTTPS 记录并且有 ECH 数据但是 A 记录和 AAAA 记录是被污染的 IP 地址,Chrome 能打开网站吗?
    yxmyxmyyy
        6
    yxmyxmyyy  
       27 天前
    firefox 能直接域名访问非标准端口,而 chrome 还不行,两个都支持用 udp 的 dns 获取 https 记录
    czfy
        7
    czfy  
       25 天前
    在客户端需要什么特别的配置吗?因为我目前只是在 firefox 上启用了 DoH ,没有在系统层启用
    Coelacanthus
        8
    Coelacanthus  
       23 天前
    @baraja Firefox 以前也是 ECH requires DoH 的,被人骂了大概有个五年多吧,最后改了。
    https://bugzilla.mozilla.org/show_bug.cgi?id=1500289
    terrytw
        9
    terrytw  
    OP
       21 天前
    @baraja 你这个只怕是自身问题, 我就是用的 chrome, UDP dns
    terrytw
        10
    terrytw  
    OP
       21 天前
    @Cusmate 那当然不行了, 你 IP 都是错的, client hello 加密了有啥个用...就好比你快递包裹用了个保险箱, 但是送错了地址...
    terrytw
        11
    terrytw  
    OP
       21 天前
    @czfy 系统级没有支持, 目前就各浏览器支持了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1080 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 22:31 · PVG 06:31 · LAX 14:31 · JFK 17:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.