PowerDNS Split Horizon Resolver

PowerDNS Split Horizon Resolver

Я поискал в Интернете решение и нашел множество тем с различными предложениями. Большинство из них, которые я нашел, использовали LUA на resolver для возврата записей. Другие сообщения предлагают использовать 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, и мне интересно, возможно ли это вообще.

решение1

Ни PowerDNS Server, ни 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).

Кстати, людям Lua не нравится, когда вы пишете все заглавными буквами. Смотритеhttp://www.lua.org/about.html"Что в имени" ;-)

решение2

Этот ответ поддерживает предложение @ZaphodB использоватьdnsdist. Вот пример dnsdist.confфайла, который выполнит настройку разделенного горизонта, направляя трафик либо на DNS-серверы Google, либо на DNS-серверы в вашей локальной сети в зависимости от целевого FQDN. Объект 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)

Связанный контент