Резольвер PowerDNS Split Horizon
Я искал в Интернете решение и нашел множество тем с различными предложениями. Большинство из них, которые я обнаружил, использует LUA на распознавателе для возврата записей. Другие посты предлагают использовать GEO-IP или Pipe backends. Весь контент, который я прочитал, использовал
Мне любопытно узнать, возможно ли с помощью 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;
}
Я не вижу примеров LUA от pdns, которые демонстрируют изменение каких-либо настроек в самой PDNS, и мне любопытно, возможно ли это вообще.
2 ответа
Ни сервер PowerDNS, ни Recursor не поддерживают установки с раздельным горизонтом, как это делает BIND.
Вы можете обойти это, например, запустив код Lua в своем рекурсоре, который напрямую предоставляет, например, ответы, которые вы хотите обслуживать для определенной подсети, но, как вы уже узнали, вы не можете манипулировать, куда запросы будут перенаправляться из Lua.
Относительно новым дополнением к семейству кодов PowerDNS является балансировщик нагрузки DNS, который программируется на Lua и позволяет отправлять запросы на разные серверы имен, основываясь практически на всем, что позволяет протокол DNS. См. http://dnsdist.org/ и https://github.com/PowerDNS/pdns/blob/master/pdns/README-dnsdist.md. Пример Split Horizon там разделяет рекурсивные и нерекурсивные запросы, но вы также можете разделить его в зависимости от адреса источника, например, с помощью функции addPoolRule(netmask, pool).
Btw. Людям не нравится, когда вы пишете это заглавными буквами. Смотрите http://www.lua.org/about.html "Что в имени";-)
Этот ответ поддерживает предложение @ZaphodB использовать dnsdist. Вот образецdnsdist.conf
файл, который будет выполнять настройку разделения горизонта, направляя трафик либо на DNS-серверы Google, либо на 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)