是否可以基于查找在 BIND 中执行脚本

是否可以基于查找在 BIND 中执行脚本

是否可以将 BIND 设置为本地网络上的 DNS 服务器,并在查找时执行脚本?

我想根据传入的 DNS 查找执行 Python 或 Bash 脚本,我该如何解决这个问题?

如果可以在 Bind 中实现,请告诉我如何实现,如果不能,请告诉我是否可以在 Ubuntu 上运行的其他 DNS 服务器实现中实现。

非常感谢。

答案1

我可以想到两个额外的选项,它们根本不需要解析 BIND 日志或干扰 BIND。

1) 端口镜像 - 复制数据包并将其发送到应用程序正在侦听、解析 DNS 请求并采取操作的单独端口。dpktscapy或类似的数据包制作库将帮助您解析原始请求。

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

在bind 中没有实现诸如事件之类的东西,它不需要那样。

您可以查看应用防火墙,某些组织使用应用防火墙来限制某些用户的访问。在那里你将有更多的机会实现你想要的。

设置路由似乎也是一个好主意,最终您想要通过绑定和触发脚本执行实现的目标也将是低效的:您必须:

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/组织都可以这样做,并且他们全部为此添加特定路线。运输费用或法院命令通常是采取此类措施的原因。

相关内容