什么是 dnsdist
dnsdist 是一个现代化的 UNIX 守护进程,主要用于 DNS 流量的负载均衡和流量整形。它是由 PowerDNS 团队开发的一款开源软件,可以帮助您构建高性能、高可用的 DNS 基础设施。

dnsdist 的主要功能包括:

  1. 负载均衡:dnsdist 可以将 DNS 查询均匀地分配到多个后端服务器上,提高整体的处理能力。它支持多种负载均衡算法,如 leastOutstanding、firstAvailable、wrandom 等。
  2. 流量整形:dnsdist 可以根据各种规则对 DNS 流量进行限制和阻挡,比如限制每个客户端的查询速率、阻挡恶意流量等。这有助于保护您的 DNS 基础设施免受 DDoS 攻击。
  3. 动态规则生成:dnsdist 可以根据实时监控的流量情况,自动生成并应用动态的阻挡规则,以应对突发的攻击或异常流量。这使得您的 DNS 系统能够更好地抵御各种安全威胁。
  4. 灵活的配置:dnsdist 的配置是通过 Lua 脚本来实现的,这使得它非常灵活和可扩展。您可以根据自己的需求编写定制的 Lua 脚本,实现各种复杂的流量管理策略。
  5. 缓存: dnsdist 实现了一个简单但高效的数据包缓存,可以大幅提高查询响应速度,减少带宽使用和服务器负载。

安装

当前最新版是1.9.x
这里以 centos9 安装 dnsdist 1.9.x为例

dnf install epel-release &&
curl -o /etc/yum.repos.d/powerdns-dnsdist-19.repo https://repo.powerdns.com/repo-files/el-dnsdist-19.repo &&
dnf install dnsdist

编辑配置文件

vim /etc/dnsdist/dnsdist.conf

local downstreamServers = { "10.20.0.50", "10.20.0.51" }
 
addCapabilitiesToRetain("CAP_SYS_ADMIN")
addCapabilitiesToRetain("CAP_NET_ADMIN")
-- 设置访问控制
setACL("0.0.0.0/0")
-- 设置UDP缓存区大小
setUDPSocketBufferSizes(134217728,134217728)
-- 设置服务器策略
setServerPolicy(leastOutstanding)
-- 设置缓存
local pc = newPacketCache(10000000, {maxTTL=10000000, minTTL=0, temporaryFailureTTL=10, staleTTL=10, dontAge=true, cookieHashing=false})
getPool(""):setCache(pc)
 
-- 添加本地监听和下游服务器
function addServers(i)
    for k, v in ipairs(downstreamServers) do
      newServer({address=v, name='dns'..k, checkInterval=1, checkType="ANY", checkName=".", useProxyProtocol=true})
    end
end
 
function addListeners(i)
    addLocal("0.0.0.0:53", {reusePort=true, sockets=64})
end
 
 
local cpuCores = tonumber(io.popen("nproc"):read("*n"))
if not cpuCores or cpuCores < 1 then
    cpuCores = 1
end
 
for i = 1, cpuCores do
    addListeners(i)
    addServers(i)
end
 
 
-- 以下配置内容可选
 
-- 启用统计和监控界面
--[[
webserver("0.0.0.0:8083")
setWebserverConfig({password=hashPassword("3gR#v8P!xWzL9kDt"), apiKey=hashPassword("!dNVcJHks!xWdSKs"), acl="0.0.0.0/0"})
--]]
 
-- 设置QPS限制
--[[
addAction(NotRule(MaxQPSRule(300000)), DropAction())
--]]
 
-- 开启动态规则过滤
--[[
local bpf = newBPFFilter({ipv4MaxItems=10240, ipv6MaxItems=10240, qnamesMaxItems=1024, cidr4MaxItems=1024,cidr6MaxItems=1024,})
setDefaultBPFFilter(bpf)
local dbr = dynBlockRulesGroup()
dbr:setQueryRate(200, 1, "Exceeded query rate", 20)
dbr:setRCodeRate(DNSRCode.NXDOMAIN, 20, 10, "Exceeded NXD rate", 60)
dbr:setRCodeRate(DNSRCode.SERVFAIL, 20, 10, "Exceeded ServFail rate", 60)
dbr:setQTypeRate(DNSQType.ANY, 5, 10, "Exceeded ANY rate", 60)
dbr:setResponseByteRate(10000, 10, "Exceeded resp BW rate", 60)
 
function maintenance()
  dbr:apply()
end
 --]]

启动dnsdist

systemctl start dnsdist

设置自启

systemctl enable dnsdist

性能调优

调整 Linux 的网络参数:在sysctl.conf 添加以下内容,然后执行 sysctl -p 加载

net.core.somaxconn = 65535
net.core.netdev_max_backlog = 16384
net.core.rmem_max = 134217728
net.core.rmem_default=1048576
net.core.wmem_max = 134217728
net.core.wmem_default = 1048576
文章目录