IrineSistiana / mosdns

一个 DNS 转发器
GNU General Public License v3.0
2.9k stars 326 forks source link

[Feature request] 希望增加一个DOH与DOT的中间件 #656

Open pmkol opened 1 year ago

pmkol commented 1 year ago

希望添加的功能

首先赞一下mosdns的性能,在单台服务器每日几千万的查询量的压力下,性能依旧稳定没任何报错,且资源占用极少。

随着日查询量直奔亿级,一些新的诉求诞生了:

由于查询量变高,参考了作者之前提过的unbound缓存方案,将unbound前置,但这里出现了一个新的问题,虽然unbound已经支持doh功能,但却并不支持http3,所以需要前置nginx,但unbound并没有通过X-Forwarded-For对客户端真实IP进行获取,这将导致如果前置nginx或CDN的情况下ECS功能失效,而mosdns却很好的解决了这点。


目前套娃结构为: mosdns(分流) -> unbound(缓存) -> mosdns(转发) -> nginx(出口)

mosdns(转发) 这里的替代品,有尝试多种方案

a、使用caddy/haproxy直连unbound,ECS失效

b、使用 doh-server中间件,不支持ECS传输,ECS失效

c、使用 dns-over-https中间件,支持ECS,但性能太差,我的503报错占比达到了约2%,而mosdns一次503都没出现过


综上所属,我目前只能单独再开个mosdns进程做中间件转发,因为mosdns性能真的太强了

对于mosdns现有的代码而言,理论上只要提取已有功能,应该就可以单独搞个中间件出来,对作者而言应该比我们任何人都容易做到。主要需要几个功能:

1、将udp/tcp转为dot/doh,doh支持http无ssl模式,也就是把现有的部分提取出来

2、增加unix domain socket,让nginx可以更好的无缝连接这个中间件

3、限制单IP并发数,这个插件里已经有了

4、简化版的日志,格式可以类似unbound的,包含日期、端口、客户端IP、请求域名、请求类型等,例如: Apr 04 04:30:11 [port 5353] info: 1.2.3.4 time.apple.com. AAAA IN

5、ECS功能支持,向后端传输ECS

上述功能除了第二条外,应该都是已有的插件,不知道作者是否能支持一下,至少目前看来这个中间件对高访问量的用户非常有意义,感谢作者的贡献

IrineSistiana commented 1 year ago

unix domain socket 可以实现,其他暂不考虑。

如果配置中不写某个插件,那么这个插件就不会运行。如果觉得可执行文件过大,可以选择不编译不用的插件。没必要再另实现一个中间件。

简化版的日志

这个每个人都有不一样的需求。支持自定义太难了。建议编写自己的插件。