IrineSistiana / mosdns

一个 DNS 转发器

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[Feature request] cache 可以跳过不缓存

skill7899 opened this issue · comments

希望添加的功能

  • tag: main_sequence
    type: sequence
    args:
    - exec: $hosts
    - exec: jump has_resp_sequence
    - matches:
    - "!qname $ddnslist"
    - "!qname $blocklist"
    - "!qname $adlist"
    - "!qname $local_ptr"
    exec: $lazy_cache
    - exec: $redirect
    - exec: jump has_resp_sequence
    - exec: $query_is_apple_domain
    - exec: jump has_resp_sequence
    - exec: $query_is_ddns_domain
    - exec: jump has_resp_sequence
    - exec: $query_is_whitelist_domain
    - exec: jump has_resp_sequence
    - exec: $query_is_reject_domain
    - exec: jump has_resp_sequence
    - exec: $query_is_greylist_domain
    - exec: jump has_resp_sequence
    - exec: $query_is_local_domain
    - exec: jump has_resp_sequence
    - exec: $query_is_no_local_domain
    - exec: jump has_resp_sequence
    - exec: $fallback

希望cache可以更灵活,比如远程的dns结果,我不要缓存,
执行到$query_is_no_local_domain 的时候,我不想缓存他的结果,按目前配置是做不到的。
因为我远程的dns是一个fakeIp,缓存起来可能会导致异常。又或者我远程到的ip是一个cdn ip。
我也有曲线求国的办法,就是,cache 成功后判断一下响应结果,要是fakeIp就drop掉,继续执行。
可以exec: !cache 代表这次响应的结果不缓存
比如

- exec: $query_is_no_local_domain
- exec: !cache 
- exec: jump has_resp_sequence

或者添加cache的作用域,只在当前的sequence

- matches:
  - "!qname $ddnslist"
  - "!qname $blocklist"
  - "!qname $adlist"
  - "!qname $local_ptr"
  exec: $lazy_cache

按你贴出来的配置,你这不是已经会条件缓存了吗?为什么还会问远程DNS不缓存的问题,这不是和你上面的意思一样的吗?

在你这个基础上直接把 $query_is_no_local_domain 所使用的数据库 tag 名称添加上去,它不就跳过缓存操作了吗?

希望cache可以更灵活,比如远程的dns结果,我不要缓存

另外 mosdns 是完全支持灵活缓存的,只要在需要的地方(比如国内)给它使用 sequence 内建操作的 exec: cache 就可以了,而不是使用独立的 lazy cache 插件。灵不灵活,主要体验在你怎么写配置文件!

最傻瓜的方法:扔掉你现有所有缓存操作,只在响应中做匹配,命**内 IP 就缓存。

  - tag: has_resp_sequence
    type: sequence
    args:
      - matches: "resp_ip $geoip_cn"
        exec: $lazy_cache
      - matches: has_resp
        exec: accept

在你这个基础上直接把 $query_is_no_local_domain 所使用的数据库 tag 名称添加上去,它不就跳过缓存操作了吗?

相当于又查了一次$query_is_no_local_domain的匹配了tag了,性能会有所下降

希望cache可以更灵活,比如远程的dns结果,我不要缓存

另外 mosdns 是完全支持灵活缓存的,只要在需要的地方(比如国内)给它使用 sequence 内建操作的 exec: cache 就可以了,而不是使用独立的 lazy cache 插件。灵不灵活,主要体验在你怎么写配置文件!

最傻瓜的方法:扔掉你现有所有缓存操作,只在响应中做匹配,命**内 IP 就缓存。

  - tag: has_resp_sequence
    type: sequence
    args:
      - matches: "resp_ip $geoip_cn"
        exec: $lazy_cache
      - matches: has_resp
        exec: accept

这样就重复匹配了,每次查询到的结果都要去匹配国内IP,要是还有域名,还得再匹配域名。现在cache的作用域就是只要出现在调用中,最后回来的结果都会cache上。没有丢弃的选项。要是多一个丢弃项,或者在当前sequence选项生效。会更加灵活

mosdns 的规则匹配都是在内存里进行,常规的设备下多庞大的规则量都是微秒单位完成匹配(按当时的 mosdns v4 debug 日志表现来讲)。只要不是部署在公网给大众使用的,这种所谓性能下降完全可以无视。

真设备性能差到爆的话,直接用 sequence 的 cache 按需对某个 tag 做缓存,比如只对 query_is_local_domain 执行,这种情况 0 额外匹配,它单纯是个执行序列

拿到应答后,把 ttl 改成 1,就可以”近似跳过“缓存。

可以全缓存 然后匹配fakeip地址的请求再去请求一次clash-dns 相当于强制刷新了吧