PowerDNS 水平分割解析器

PowerDNS 水平分割解析器

我在網上尋找解決方案,並發現了許多具有不同建議的線程。我發現大部分都是在解析器上使用 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 Server 和 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)

相關內容