ローカルネットワークでBINDをDNSサーバーに設定し、ルックアップ時にスクリプトを実行できますか?
着信DNS検索に基づいてPythonまたはBashスクリプトを実行したいと思います。この問題をどのように解決しますか?
Bindで実装できる場合は、どのように実装できるかを教えてください。そうでない場合は、Ubuntuで実行されている他のDNSサーバー実装で実装できるかどうかを教えてください。
とても感謝しています。
答え1
BINDログを解析したり、BINDをまったく妨げたりする必要がない2つの追加オプションを考えることができます。
1)ポートミラーリング - パケットをコピーしてアプリケーションがリッスンしている別のポートに送信し、DNS要求を解析してアクションを実行します。dpkt
あるいは、scapy
同様のパケット作成ライブラリが生の要求を解析するのに役立ちます。
2) いくつかのタイプのパケットスニッフィングライブラリを使用して要求を受動的に監視します。以下は使用例ですscapy
。
from scapy.all import *
def handler(req):
if req.haslayer(DNS) and req.getlayer(DNS).qr == 0:
ip = req.getlayer(IP)
dns = req.getlayer(DNS)
q = dns.qd
print q.qname # simply print domain name
if __name__ == '__main__':
sniff(iface="eth0", filter="udp and port 53", prn=handler, store=0)
明らかに、これは単なる原始的な例です。照会されるドメインの名前だけを印刷しますが、もちろん多くのロジックを追加することもできます。 scapy ドキュメントを参照すると、DNS 要求のすべてのフィールドが使用できることがわかります。
答え2
バインドサーバーログを監視することでこれを行うことができます(クエリログがオンになっている必要があります)。頑張って...
答え3
バインドに実装されたイベントのようなものはなく、そうする必要もありません。
一部の組織で特定のユーザーのアクセスを制限するために使用するアプリケーションファイアウォールを確認できます。そこであなたはあなたが望むことを達成するためのより多くの機会を持つでしょう。
ルーティングを設定するのも良い考えのようです。最終的にスクリプトの実行をバインドしてトリガーすることで達成したいのも非効率的です。以下を行う必要があります。
for each dest IP
look up through your database
if match set the route
then the OS will see and use the root
ルーティング負荷設定は問題ではなく、目立つ方法でパフォーマンスに影響を与えません。エンタープライズルーターにはいくつかのルートがあると思いますか?何百?実際にはそうではありません。そして必ずしも素晴らしいハードウェア仕様を持っているわけではありません。真剣に、問題ありません。深刻なオペレーティングシステムは、多くのパスを処理し、クエリを最適化するように特別に設計されています。
それ以外に、最初にすべきことは、ルーティングテーブルの上に別の種類のデータベースであるデータベースを使用することです。仕事を単純にしてください。 BGPサーバーでは、実際には政治的/財政的な理由から、多くのルートが選択/優先順位が割り当てられています。すべてのISP /組織がこれを行うことができますみんなこれに特定のパスを追加します。配送費用や裁判所命令がそのような措置を取る理由であることがよくあります。