
前情提要: t/699027
上次发现 iOS14 会查询域名的 HTTPS 记录TYPE65,以前叫 HTTPSSVC)后,本以为只是个试探性功能没多大用,结果今天看到 cloudflare 的贴文,已经完全实用化了。
简单来说,使用 CF 的域名已增加 HTTPS 记录,记录里罗列服务器支持的协议类型(如 HTTP/3,HTTP/2 ),同时提供 IPv4 和 v6 地址,免去查询 A 和 AAAA 记录的必要,使得客户端可以直接用合适的协议连接,不需要先 HTTP 再 fallback 。
原文: https://blog.cloudflare.com/speeding-up-https-and-http-3-negotiation-with-dns/
不罗嗦,下面是网关上的抓包分析,以 iOS14 设备连接 V2EX 为例( Safari 要先开启 HTTP/3 支持): 
1 、包 497-499:客户端发出 HTTPS(65),A,AAAA 三种类型的 DNS 查询
2 、包 500:HTTPS 结果返回,由于 wireshark 不支持 decode 65 记录,翻译如下,data 部分共 96 字节:
0000 00 01 00 00 01 00 15 05 68 33 2d 32 39 05 68 33 ........h3-29.h3 0010 2d 32 38 05 68 33 2d 32 37 02 68 32 00 04 00 0c -28.h3-27.h2.... 0020 68 14 09 da 68 14 0a da ac 43 03 bc 00 06 00 30 h..h..C....0 0030 26 06 47 00 00 10 00 00 00 00 00 00 68 14 09 da &.G.........h.. 0040 26 06 47 00 00 10 00 00 00 00 00 00 68 14 0a da &.G.........h.. 0050 26 06 47 00 00 10 00 00 00 00 00 00 ac 43 03 bc &.G.........C. 跳过前三字节,此后每条记录有 4 字节 header,2 字节 key 和 2 字节 length 。
记录 1:00010015,0001 是 alpn,15 是长度,内容是支持的协议:h3-29,h3-28,h3-27,h2 四种,由于 http/3 还在 draft,后面带的是草案版本
记录 2:0004000c,0004 是 ipv4hint,就是 ipv4 地址,省得你去查 A 记录,值当然就是 ip 地址
记录 3:00060030,0006 是 ipv6hint,内容正好是最后 3 行,从 hex 就看得出是三条 v6 地址,2606:4700 开头
3 、包 501,504:Safari 发出 HTTP/3 请求和服务端应答,可以看到是 UDP(QUIC),没有进一步研究
4 、包 502-503:A 和 AAAA 的应答,在这里已经没用了
另外,目前 Google 、CF DNS 都可以正常返回 HTTPS 记录,dnspod 和 alidns 不支持,114 和百度支持但非常缓慢,可用dig type65 example.com测试。小白注意,HTTPS 记录和 DOH 没有任何关系。
1 domosekai OP 又想到一点,既然 HTTPS 回答包括了 IP 地址,那么所有基于 DNS 的策略(比如 ipset,比如那些不可描述的分流工具)都将可能暂时失效。即便客户端同时发出 A 和 AAAA,但可能由于时间差,连接请求早于分流发出。 |
2 hallieastem Oct 8, 2020 本地局域网内有一些 service 的域名解析,在 openwrt 上做的 host,IOS14 设备实际使用应用时都会解析出公网 IP 导致应用无法使用,神烦,网上搜了圈还没人提过这问题,难道都没这种场景的需求的吗? |
3 tsanie Oct 12, 2020 alidns 似乎支持了,而且速度不错 ``` ; <<>> DiG 9.10.6 <<>> type65 v2ex.com @223.5.5.5 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 35953 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;v2ex.com. IN TYPE65 ;; ANSWER SECTION: v2ex.com. 298 IN TYPE65 \# 96 000100000100150568332D32390568332D32380568332D3237026832 0004000C681409DA68140ADAAC4303BC000600302606470000100000 00000000681409DA26064700001000000000000068140ADA26064700 0010000000000000AC4303BC ;; Query time: 10 msec ;; SERVER: 223.5.5.5#53(223.5.5.5) ;; WHEN: Mon Oct 12 14:20:49 CST 2020 ;; MSG SIZE rcvd: 134 ``` dnspod 有响应,但 answer 空白。 114 我这里偶尔有比较快速的响应,但是大多数时间 timeout,很奇怪…… |