微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何在查询回调中从 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 举报,一经查实,本站将立刻删除。