powerdns-dnsdist基于域名分流实现

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))
    end
end

function 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)
    end
end

addAction(LuaRule(
    function(dq) return matchChinaDomain(dq.qname,shuntset) end
), PoolAction("china"))
addAction(AllRule(), PoolAction("default"))

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

  • addLocal 监听地址就是你要把dnsdist服务运行在哪个ip:端口上
  • newServer 把dns转发到哪个递归服务器 useClientSubnet就是是否转发edns pool可以理解为一个标签这里有两个第一个是转发常规udp第二个是转发到doh服务器上去
  • addAction 这个就是控制发送到哪个newServer的规则了 AllRule()表示默认也就是所有流量都转发到标签为default的递归服务器上去 LuaRule表示通过lua代码处理后的规则然后发送到标签为china的递归服务器上去
  • 剩下的就是dnsdist 内置的lua函数和lua原生的一些东西了这里就不过多解释了

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

#!/bin/bash
cd /root/app/china
rm -f i*.txt
rm -f tmp*.txt
wget -O i1.txt https://raw.githubusercontent.com/felixonmars/dnsmasq-china-list/master/accelerated-domains.china.conf
wget -O i2.txt https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/apple-cn.txt
cat i1.txt | grep -E -v "^#" > tmp1.txt
sed -i s'/server=\//\//g' tmp1.txt
sed -i s'/\/114.114.114.114//g' tmp1.txt
sed -i s'/full:/\//g' i2.txt
cat zdy.dd i2.txt tmp1.txt > tump.txt
sed -i s'/^\///g' tump.txt
rm -f i*.txt
mv tump.txt /etc/dnsdist/domains.txt

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

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

如果有什么好的想法可以发布到评论区或者加群讨论QQ群:1009133646如果能够实现的话后续会再发布文章

© 版权声明
THE END
喜欢就支持一下吧
点赞9赞赏 分享
评论 抢沙发

请登录后发表评论

    请登录后查看评论内容