如何在查询回调中从 pythontwisted.names defer 返回 DNS 查找?

问题描述

我需要一些帮助来理解 python Twisted DNS Resolver。我正在尝试创建一个充当 DNS 转发器的 dns 服务器。我想接受查找,将查询转发到 8.8.8.8,从 8.8.8.8 返回响应,然后执行一些功能,例如与坏 IP 列表进行比较,知道坏域等。这就是我卡住的地方, (顺便说一句,我在另一个线程中问了另一个关于 DNS 返回 SOA 的问题。从那以后我一直被困在我在这里问的另一个问题上。这个问题更多地涉及扭曲的方面,并在这里提出了一个新问题)

我在 UDP 5553 上为传入请求构建了一个反应器列表,获取请求,执行查找,但不知道如何将查找返回给请求者。这是我创建的:

from twisted.names import client,dns,server,error
from twisted.internet import task
from twisted.internet import reactor,defer

class DNS_Reslover(object):
    def __init__(self,rsvr):
        self.__resolver = rsvr

    def _ProcessesARecord(self,ip,query):
        """
        Manipulate the return and return somthing
        """
        name = "google.com"
        addr = bytes('10.10.200.2','utf-8')
        answer = dns.RRHeader(name=name,payload=dns.Record_A(addr))
        answers = [answer]
        authority = []
        additional = []
        return [(dns.RRHeader(name=name,type=dns.A,cls=dns.IN,payload=dns.Record_A(address=addr)),),(),()]

    def query(self,query,timeout=None):
        
        _query_name = "{}".format(query.name)
        # A Records
        if query.type == dns.A:
            _d = self.__resolver.getHostByName(_query_name,timeout=None,effort=10)
            _d.addCallback(self._ProcessesARecord,query)

        return defer.fail(error.DomainError())

def main():
    """
    Running server
    """
    client_resolver = client.Resolver(resolv='/etc/resolv.conf')
    factory = server.DNSServerFactory(clients=[DNS_Reslover(client_resolver)])

    protocol = dns.DNSDatagramProtocol(controller=factory)

    reactor.listenUDP(5553,protocol)
    reactor.listenTCP(5553,factory)
    reactor.run()


if __name__ == "__main__":
    raise SystemExit(main())

所以当一个请求进来时,它会命中 def query(self,timeout=None)查询解析查找并需要延迟回调,因此我将回调传递回 _ProcessesARecord(self,query)我有我想返回的虚拟测试数据,所以我建立了返回然后呢?在其他示例中,他们调用 defer.succeed 但我收到错误

 current.result = callback(current.result,*args,**kw)
  File "./bouncer.py",line 52,in _ProcessesARecord
    defer.returnValue([(dns.RRHeader(name=name,()])
  File "/opt/DEVELOPMENT/DNS-TEST/.venv/lib/python3.6/site-packages/twisted/internet/defer.py",line 1388,in returnValue
    raise _DefGen_Return(val)
twisted.internet.defer._DefGen_Return: [(<RR name=google.com type=A class=IN ttl=0s auth=False>,()]

从回调中我如何将 (dns.RRHeader(name=name,() 返回给初始请求者?

感谢您抽出宝贵时间。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)