V2EX 11小时前
[DNS] powerdns-dnsdist 基于域名分流实现
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文介绍了dnsdist的配置和实践,这是一款高度DNS、DoS和滥用感知的负载均衡器。文章详细阐述了dnsdist的配置方法,包括监听地址、DNS转发服务器的设置,以及基于Lua脚本的流量分流规则。通过示例配置文件的解析,读者可以了解到如何将流量路由到不同的服务器,提高DNS查询效率。此外,文章还提供了生成domains.txt文件的Shell脚本,以及对使用dnsdist的经验分享,强调其在性能方面的优势。最后,作者探讨了公益DNS是否应加入广告拦截功能的问题,引发了对用户需求差异性的思考。

💡 dnsdist是一款高性能的DNS负载均衡器,旨在优化DNS查询效率并应对潜在的DoS攻击和滥用行为。

⚙️ 配置文件详解:文章详细解读了dnsdist配置文件,包括`addLocal`、`newServer`和`addAction`等关键配置项的含义和作用。`addLocal`用于指定监听地址,`newServer`用于配置上游DNS服务器,而`addAction`则定义了流量分流规则,例如基于Lua脚本的分流。

🌐 分流规则与域名列表:通过Lua脚本和自定义域名列表,dnsdist能够将流量智能地分流到不同的上游DNS服务器。文章提供了生成`domains.txt`文件的Shell脚本示例,该脚本整合了多个域名列表,用于实现更精准的分流策略。

🚀 性能对比与实践经验:作者分享了使用dnsdist的经验,强调其在性能方面的优势,尤其是在响应速度和资源占用方面优于AdGuard Home。这为读者提供了选择DNS解决方案的参考。

🤔 公益DNS的广告拦截问题:文章最后探讨了公益DNS是否应该加入广告拦截功能的问题,这引发了对用户需求差异性的思考。作者在广告拦截和用户体验之间权衡,反映了实际运营中可能遇到的挑战。

dnsdist 是一款高度 DNS 、DoS 和滥用感知的负载均衡器。其目标是将流量路由到最佳服务器,为合法用户提供最佳性能,同时分流或阻止滥用流量 文档: https://dnsdist.org/


addLocal("127.0.0.1:5200")newServer{address="127.0.0.1:5373", useClientSubnet=true,pool="china"}newServer({address="127.0.0.1:443", tls="openssl", subjectName="xxxx", dohPath="/dns-query", validateCertificates=true,pool="default",useClientSubnet=true})local shuntset = newDNSNameSet()for line in io.lines("/etc/dnsdist/domains.txt") do    local trimmed_line = line:match("^%s*(.-)%s*$")    if trimmed_line ~= "" then        shuntset:add(newDNSName(line))    endendfunction matchChinaDomain(qname,shuntset)    local primary_domain = qname:toStringNoDot():match("([^.]+%.[^.]+)$")    domain = newDNSName(qname:toStringNoDot())    -- infolog("Query domain: " .. qname:toStringNoDot())    -- infolog("Query domain: " .. primary_domain)    if shuntset:check(domain) then       return true    else       primarydomain = newDNSName(primary_domain)       -- infolog("Exact match: " .. tostring(shuntset:check(primarydomain)))       return shuntset:check(primarydomain)    endendaddAction(LuaRule(    function(dq) return matchChinaDomain(dq.qname,shuntset) end), PoolAction("china"))addAction(AllRule(), PoolAction("default"))

这是来自 /etc/dnsdist/dnsdist.conf dnsdist 的配置文件下面简单解释一下


下面是 shell 脚本用于生成 domains.txt 文件


#!/bin/bashcd /root/app/chinarm -f i*.txtrm -f tmp*.txtwget -O i1.txt https://raw.githubusercontent.com/felixonmars/dnsmasq-china-list/master/accelerated-domains.china.confwget -O i2.txt https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/apple-cn.txtcat i1.txt | grep -E -v "^#" > tmp1.txtsed -i s'/server=\//\//g' tmp1.txtsed -i s'/\/114.114.114.114//g' tmp1.txtsed -i s'/full:/\//g' i2.txtcat zdy.dd i2.txt tmp1.txt > tump.txtsed -i s'/^\///g' tump.txtrm -f i*.txtmv tump.txt /etc/dnsdist/domains.txt

zdy.dd 这个文件就是自定义的域名了虽然来自 github 的中国大陆的域名列表挺完善的但也有覆盖不到的

zdy.dd 里面的格式“/xxx.xx”,一行一个

当然 dnsdist 不仅仅只能实现基于域名分流还可以实现更多的功能(基于 ip 分流、基于 ip 和域名分流、基于恶意域名列表拦截、基于威胁情报 ip 源进行拦截、正则匹配拦截,改写 edns 、改写 dns 回复数据等等)


这个方案我用了很长一段时间和其它的有什么区别我不知道但是对比 adguardhome 的分流 dnsdist 无论是占用还是响应都比 adguardhome 快一些

最后我想知道如果做公益 dns 是否要加上广告拦截呢,我一直在纠结这个问题我目前做的是加上广告拦截的但是老是一堆反映这个怎么拦截不了这个被误杀了挺烦的毕竟每个人对这个东西需求不一样希望各位大佬给点建议

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

dnsdist DNS负载均衡 分流 Lua脚本 性能优化
相关文章