PowerDNS スプリット ホライズン リゾルバ

PowerDNS スプリット ホライズン リゾルバ

解決策を求めてウェブを検索したところ、さまざまな提案のあるスレッドが多数見つかりました。私が見つけたスレッドのほとんどは、レコードを返すためにリゾルバでLUAを使用していました。他の投稿では、GEO-IPまたはパイプバックエンドを使用することが提案されています。私が読んだコンテンツはすべて、

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 自体の設定を変更する方法を示す pdns からの LUA の例は見当たらないのですが、それが可能なのかどうか気になります。

答え1

PowerDNS Server も Recursor も、BIND のようなスプリット ホライズン設定をサポートしていません。

たとえば、特定のサブネットに対して提供したい回答を直接提供する Lua コードを再帰的に実行することでこれを回避できますが、すでにおわかりのように、Lua からクエリが転送される場所を操作することはできません。

PowerDNS ファミリーのコードに比較的最近追加されたのが、Lua でプログラム可能な DNS ロードバランサーです。これにより、DNS プロトコルで許可されているほぼすべての条件に基づいて、さまざまなネームサーバーにクエリを送信できます。http://www.dnsdist.org/ よりそしてhttps://github.com/PowerDNS/pdns/blob/master/pdns/README-dnsdist.md. Split Horizo​​n の例では、再帰クエリと非再帰クエリを分割していますが、たとえば addPoolRule(netmask, pool) 関数を使用して、送信元アドレスに応じて分割することもできます。

ちなみに、Luaの人たちは大文字で書くのを好みません。http://www.lua.org/about.html"名前って何" ;-)

答え2

この回答は@ZaphodBの提案を支持していますdnsdist. スプリットホライズン設定を行うサンプルファイルです。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)

関連情報