Skip to content
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

DNS: do not use cache when returned DNS result has errors #3784

Merged
merged 1 commit into from
Sep 12, 2024

Conversation

Fangliding
Copy link
Member

#1231
原代码里写的是 如果没有found到 就跳过缓存(if err != errRecordNotFound)
但是如1231中的问题 它确实found到了 但是found的是什么? found到了一个 rcode 3(摊手)
修改之后只要遇到错误就绕过缓存 重新解析 代码里还豁免了一种情况 dns_feature.ErrEmptyResponse 因为这个错误表示没hit对 比如指定解析ipv4 但是解析出来只有v6 这种情况我们它是正常的 不然的话正常单栈v6会被认为解析失败而反复解析

但是注意 现在被修改之后对于一些无效的请求 每一次xray都会进行转发而不会cache住 可能会多大量不必要的无效请求
其实原来的行为其实是合理的 不对的地址就是不对 这会不对的地址怎么等会又对了 感觉只有上游瞎玩dnsmasq之类的玩意才会造成这种问题 是否要其他人为这些DNS灵车爱好者买单?

@dyhkwong
Copy link
Contributor

NXDomain 应该根据 SOA 缓存而不是不缓存。SOA 的 TTL 一般都大于 600,就算是现在写死的 TTL 600 也比不缓存要正常。

@Fangliding
Copy link
Member Author

NXDomain 应该根据 SOA 缓存而不是不缓存。SOA 的 TTL 一般都大于 600,就算是现在写死的 TTL 600 也比不缓存要正常。

我在看到600写死之后也想过看soa 然后叫出dig瞟了一样脸滚键盘域名a根返回的ttl是86400 抿嘴无语一会之后 嗯 还是600吧

加个默认false的配置选项其实就能解决问题了 但是又得堆史加配置项 改函数签名把配置传进来 还得把这个操作copy四遍 就为了伺候一小撮灵车dns(而且现在用的好好的现在再加估计也没多少人用) 我更倾向于蒜了

@yuhan6665
Copy link
Member

如果我们从不返回这些 dns err 可以直接不存到 cache 里?

@Fangliding
Copy link
Member Author

如果我们从不返回这些 dns err 可以直接不存到 cache 里?

不存cache和不命中cache 问题没有本质变化 核心到底要不要无视缓存机制往外转发所有无效域名的DNS请求

@yuhan6665
Copy link
Member

yuhan6665 commented Sep 11, 2024

有用法不喜欢缓存就不存了?似乎发出了 DNS 请求也没啥大负面影响

@Fangliding
Copy link
Member Author

Fangliding commented Sep 11, 2024

有用法不喜欢缓存就不存了?似乎发出了 DNS 请求也没啥大负面影响

如果觉得没大影响的话合并就行了

或者我可以按楼上的说法堆垃圾加一个config然后想办法传进来

@yuhan6665
Copy link
Member

能否改成源头那边不存?

@Fangliding
Copy link
Member Author

Fangliding commented Sep 11, 2024

能否改成源头那边不存?

想必事可以的 不过这个的位置更深 要递config的话要改的更多(不递的话就没啥事了)

@yuhan6665
Copy link
Member

试一下吧 我也觉得先不用加 config

@Fangliding
Copy link
Member Author

能否改成源头那边不存?

唔 好像有一点小问题
核心的逻辑并非尝试查询cache无果后调用查询函数然后返回查询结果接着把这个结果存进cache
而是如果cache查询无果 就调用查询函数 然后蹲着等查询函数更新cache 如果cache里没有找到IP 就反复重试 直到上下文被取消
当然rcode3和查询结果不存在肯定是两个概念 可以把rcode3传给循环函数告诉它 不用重试了 但是这样还是得往cache写东西 和原方案就没差了
当当然还可以用channel什么的方法告诉它不用等了 但是这样的开销感觉比单纯不hit cache更大 脱离初衷了

@dyhkwong
Copy link
Contributor

dyhkwong commented Sep 11, 2024 via email

@yuhan6665 yuhan6665 changed the title 当从DNS缓存中获取到错误时绕过缓存 DNS: do not use cache when returned DNS result has errors Sep 12, 2024
@yuhan6665 yuhan6665 merged commit 1b607ff into main Sep 12, 2024
36 checks passed
@yuhan6665
Copy link
Member

能否改成源头那边不存?

唔 好像有一点小问题 核心的逻辑并非尝试查询cache无果后调用查询函数然后返回查询结果接着把这个结果存进cache 而是如果cache查询无果 就调用查询函数 然后蹲着等查询函数更新cache 如果cache里没有找到IP 就反复重试 直到上下文被取消 当然rcode3和查询结果不存在肯定是两个概念 可以把rcode3传给循环函数告诉它 不用重试了 但是这样还是得往cache写东西 和原方案就没差了 当当然还可以用channel什么的方法告诉它不用等了 但是这样的开销感觉比单纯不hit cache更大 脱离初衷了

看了一下这块确实有点扭曲 先这样吧 感谢!

@RPRX
Copy link
Member

RPRX commented Oct 6, 2024

#3774 (comment)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants