-
Notifications
You must be signed in to change notification settings - Fork 4.8k
DNS: Retry with EDNS0 when response is truncated #4516
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
|
@Fangliding 我发现这些 DNS 查询所用到的 genEDNS0Options() 函数内本来就有一行
|
这个是用来设置client IP的 如果没有就不会设置 我这个会检查原始msg是否有ENDS0参数 如果没有就不retry了 |
|
按我的理解,不是一定有的吗 |
|
看到了,没有 client IP 的话就没有了 |
|
我是想给 EDNS0 加个 padding net4people/bbs#459 (comment) ,给 DoH 默认启用,你有空研究下吗
|
|
DoH 服务器似乎都支持这个,如果请求是 EDNS0 with padding,响应就会自动带上 padding |
这非常简单 只需要这样就行了 或者直接修改 genEDNS0Options 函数就行了 |
据说如果客户端带上了 padding,服务端也会自动带上,至少 1.1.1.1 貌似是这样 Golang h2 req 的 header 和 body 没粘一起 #4430 (reply in thread) ,所以之前 e466b04 光给 req header 加 padding 还不够 |
|
RFC 8467: |
|
@Fangliding 你这张图,客户端带上 padding 了吗 |
|
肯定是带了才这么说的 |
|
@Fangliding 是不是 padding 方式错了或你看的地方不对?RFC 写的是“it MUST pad the corresponding response”,并且 https://community.cloudflare.com/t/doh-service-adds-edns-padding-even-if-client-does-not-indicate-edns-support/84199 1.1.1.1 是支持这个的 |
哦 UDP DNS 没有 DOH 有 还蛮细节 还有是我猜对了 1.1.1.1 把每个 response 都 padding 到定长 468 从隐私上讲这样很好 从隐藏DOH看 嗯。。。 |
一言难尽啊,不过 A 和 AAAA 查询的 response 长度本来就比较固定吧? |
|
还有 response h2 header 和 body 一般是粘起来的吧? |
|
为了防止放大攻击这块管的都比较严 |
|
我在想要不不用 0xc,用个未定义的其它 code,防止服务端把 response padding 至定长 |
|
或者有办法把 h2 req header 和 body 粘一起的话也行 |
|
经过考虑,我觉得 DoH req body 默认开 padding 还是有必要的,就算会导致比如 1.1.1.1 把 response padding 至定长 468 从而暴露了这条 HTTPS 是 DoH,但它不 padding 就不会暴露了吗?同样会,且可能会因为 response length 变化而暴露更多信息,所以只能说是两害相权取其轻吧,至少先把隐私保护起来,以及现在为了隐藏 DoH 至少都要配合 domain fronting,针对白名单 SNI 还要分析流量时序特征也增加了 GFW 的工作量,最后就是自建的 DoH 服务端可以有不同的 padding 策略,也可以只针对 header 另外 Golang h2 req 先发 header 的原因是 golang/go#58674 (comment) ,还挺有道理的,短期内估计不会改,需要 padding body |
这是可以做到的 CF不会在服务端padding了 |
|
|
|
532261d 的 test 炸了,但只炸 Windows 是什么原理 @Fangliding |
|
TestDOHNameServer 的 https+local://1.1.1.1/dns-query 只在 Windows 上炸 |
|
复现不能 我的电脑上是好的 |
|
我发现炸哪不是确定的,最新的测试炸的是 TestDOHNameServerWithIPv6Override 可能是随机到的 padding 100-600 过长会炸?第一次测试时就 Windows 比较倒霉命中了, |
|
这下懂了 单个request body最大不能超过512字节(同原始udp dns) 不然就爆炸 所以是随机爆炸不是就Windows炸 我的新测试里就炸了俩 |
|
这个 512 是哪里的限制,DoH 规范还是? |
https://developers.google.com/speed/public-dns/docs/doh?hl=zh-cn 谷歌也这样,问就是他们说了算 |
既然这样把 padding 范围改为 100-300 应该就没问题了,至于 h2 padding,Golang 可能没提供接口,就像 TLSv1.3 padding |
找了几个地方应该是他们自家的策略 8888和1111都是512 |
|
改成 100-300 了,至于那篇文档里提到的别发 User-Agent,我本来想删掉 Golang 的,但怕过不了(自建)DoH behind CDN 至于要不要把 Xray 的 HTTP 请求全改为 Chrome 的 UA,这是另一个话题,目前对抗 CDN 不是 Xray 的重点 |
|
ecc3d46 炸的是 TestUDPDNSTunnel,看起来只是偶然炸了,并不涉及 DoH |
(cherry picked from commit 86a225c)
XTLS#4516 (comment) (cherry picked from commit 607c2a6)

RT 如果DNS消息回复被截断则再次发送带EDNS的请求并把大小扩展到1350