dnsdist dns负载均衡器
什么是 dnsdist
dnsdist 是一个现代化的 UNIX 守护进程,主要用于 DNS 流量的负载均衡和流量整形。它是由 PowerDNS 团队开发的一款开源软件,可以帮助您构建高性能、高可用的 DNS 基础设施。
dnsdist 的主要功能包括:
- 负载均衡:dnsdist 可以将 DNS 查询均匀地分配到多个后端服务器上,提高整体的处理能力。它支持多种负载均衡算法,如 leastOutstanding、firstAvailable、wrandom 等。
- 流量整形:dnsdist 可以根据各种规则对 DNS 流量进行限制和阻挡,比如限制每个客户端的查询速率、阻挡恶意流量等。这有助于保护您的 DNS 基础设施免受 DDoS 攻击。
- 动态规则生成:dnsdist 可以根据实时监控的流量情况,自动生成并应用动态的阻挡规则,以应对突发的攻击或异常流量。这使得您的 DNS 系统能够更好地抵御各种安全威胁。
- 灵活的配置:dnsdist 的配置是通过 Lua 脚本来实现的,这使得它非常灵活和可扩展。您可以根据自己的需求编写定制的 Lua 脚本,实现各种复杂的流量管理策略。
- 缓存: 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
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。