解決策を求めてウェブを検索したところ、さまざまな提案のあるスレッドが多数見つかりました。私が見つけたスレッドのほとんどは、レコードを返すためにリゾルバで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 Horizon の例では、再帰クエリと非再帰クエリを分割していますが、たとえば 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)