DNS: Support returning upstream TTL to clients#4526
Conversation
|
对了 proxy/dns/dns.go // if fkr0, ok := h.fdns.(dns.FakeDNSEngineRev0); ok && len(ips) > 0 && fkr0.IsIPInIPPool(net.IPAddress(ips[0])) {
// ttl = 1
// }我注释掉了这个,是因为此PR已经实现其功能
|
|
我的想法 |
|
|
|
关于_变丑问题,其实大多都是test,真正变丑的地方没几个 TTL理应准确,因为没啥开销 |
|
关于fakeDNS 被我注释掉的代码和此PR重复 谨慎起见应该让用过FakeDNS的人测一下,但凭感觉我认为没啥问题 |
我不清楚在什么条件下能够同时返回a+aaaa 如果确有需求,可修改问题不大 |
考虑到这一点的话,Xray 作为基础工具,这个 PR 还是可以接受的 @yuhan6665 看一下? |
|
总的来说我认为作为dns模块理应遵守规范 要不是go不熟,我甚至想让它像个完整的递归dns
|
|
要把它放到基础工具的地位它可能得返回真正的ttl而不是 expire time 不然可能会某个域名的查询会被集中到某个时间点而不是更健康的分散开(当然一般遇不到) |
作为递归DNS,本就应当返回过期时间作为TTL,这是标准 至于你说的AAAA覆盖A,我刚又看了下代码,似乎本来就不会同时返回A+AAAA |
|
DNS出站的不会 但是如果传进去的querystrategy不是单的会返回AAAA的expire |
|
@Fangliding 要不你再看看, |
|
|
没必要啊我说了DNS出站那样可以用 这是你写的吗 你之前说的可以取消注释的那段代码怎么还给删了 |
|
考虑到用户或许配了UseIP,既然4和6的ttl不一样索性拆了,大不了再回滚这个提交 想让46的ttl真正各自独立,要动的地方太多了,那还不如直接实现各ip独立的expire,总之现在够用 那段注释掉的代码是 @yuhan6665 去年 commit a0f1e1f 之前注释掉,没直接删是因为没用过FakeDNS,拿不准 |
|
FakeDNS TTL 返回 1 之前有讨论过,是在手机上面或者透明代理下面用 FakeDNS 时,Xray 被关闭/重启会导致下挂的设备在拿到的 FakeIP 过期之前上不了网,设为 1 的话可以尽量降低问题影响(大概只有 1 秒)(一些 DNS 缓存比较奇葩的应用除外不过也的确没必要为这种情况擦屁股)。只不过手机在 VPN 服务变化的时候会向其它应用发送 flag 所以影响不太大,透明代理没有这种机制问题才大。FakeIP 映射记录在 Xray 运行期间只要 Pool 没满基本都会在内存里面。 FakeDNS 是用另一种方式记录请求域名,因为透明代理主要还是有 DNS 查询和实际请求 IP 映射多对多,分流时多少会受限(用黑名单非常麻烦),加上 *ray 一开始只考虑了 HTTP 上网场景,于是 sniffer 只有 HTTP 和 TLS SNI (最近才加入 QUIC SNI),遇到别的协议要用域名分流就不太方便(以及应用用了 domain-fronting 也会在这时出现意外情况)。另外也可以顺便降低因为查询海外 DNS 引入的所需等待时间。 (我要测也麻烦,因为我这 FakeDNS 是在手机上面用的,测试还得编译个 v2rayNG) |
|
d2f10b两天前我那边跑三个都是好的 这边的test三个炸俩很没道理 我看了下日志似乎跟EDNS请求长度有关 HEAD is now at bb0ca6f Merge d2f10db into 532261d 似乎是RPRX前几天搞EDNS的问题 |
|
破案了,当时我commit d2f10b的时候这边的main不稳定,当时RPRX正在弄EDNS |
|
rebase 或者 merge 都行 |
|
既然 @yuhan6665 approve 了那就先合了,感谢 PR |
响应给客户端的TTL不应是魔法值600
此PR能做到:
Closes #4527