是否可以将 BIND 设置为本地网络上的 DNS 服务器,并在查找时执行脚本?
我想根据传入的 DNS 查找执行 Python 或 Bash 脚本,我该如何解决这个问题?
如果可以在 Bind 中实现,请告诉我如何实现,如果不能,请告诉我是否可以在 Ubuntu 上运行的其他 DNS 服务器实现中实现。
非常感谢。
答案1
我可以想到两个额外的选项,它们根本不需要解析 BIND 日志或干扰 BIND。
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
在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/组织都可以这样做,并且他们全部为此添加特定路线。运输费用或法院命令通常是采取此类措施的原因。