我在网上寻找解决方案,发现了很多帖子,提出了不同的建议。我发现大多数帖子都在解析器上使用 LUA 来返回记录。其他帖子建议使用 GEO-IP 或 Pipe 后端。我读过的所有内容都使用了
我很好奇,是否可以通过 LUA 根据网络范围更改转发器,而不是使用 LUA 来存储区域信息。
如果我能让类似以下的逻辑发挥作用,那么一切就都准备好了:
if sourceip comes from (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16) {
forwarder = 192.168.0.1;
}else{
forwarder = 8.8.8.8;
}
我没有看到任何来自 pdns 的 LUA 示例来演示更改 PDNS 本身内的任何设置,并且很好奇这是否可能。
答案1
PowerDNS 服务器和 Recursor 都不像 BIND 那样支持水平分割设置。
您可以通过在递归器中运行 Lua 代码来解决这个问题,该代码直接提供您想要为特定子网提供的答案,但正如您已经发现的那样,您无法操纵查询从 Lua 转发到的位置。
PowerDNS 代码家族中一个相对较新的成员是 DNS 负载均衡器,它可以使用 Lua 进行编程,让您能够根据 DNS 协议允许的任何内容向不同的名称服务器发送查询。请参阅http://dnsdist.org/和https://github.com/PowerDNS/pdns/blob/master/pdns/README-dnsdist.md。那里的“拆分水平”示例拆分了递归查询和非递归查询,但您也可以根据源地址进行拆分,例如通过 addPoolRule(netmask, pool) 函数。
顺便说一句,Lua 的开发人员不喜欢你用大写字母书写。参见http://www.lua.org/about.html“名字意味着什么” ;-)
答案2
这个答案支持@ZaphodB 的建议使用域名系统。这是一个示例dnsdist.conf
文件,它将执行水平分割设置,根据目标 FQDN 将流量定向到 Google 的 DNS 服务器或本地网络中的 DNS 服务器。对象dq
是DNS 问题;你的 lua 函数可以针对该对象的任何属性进行测试。
-- bind to port 53 (default) on local machine.
-- setLocal clears existing, addLocal appends to existing
setLocal("127.0.0.1")
addLocal("10.22.222.222")
-- set up dns server pools
newServer({address="8.8.8.8",name="google8888",pool="google"})
newServer({address="8.8.4.4",name="google8844",pool="google"})
newServer({address="10.22.222.1",name="localdns1",pool="local"})
newServer({address="10.22.222.2",name="localdns2",pool="local"})
-- define split horizon policy
function splitHorizon(servers, dq)
if (string.find(dq.qname:toString(),'example.com.?$')) then
print("local address")
return leastOutstanding.policy(getPoolServers("local"), dq)
else
print("other address")
return leastOutstanding.policy(getPoolServers("google"), dq)
end
end
-- apply split horizon policy
setServerPolicyLua("splitHorizon", splitHorizon)