0

我需要一些帮助来理解 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, query, timeout=None)。Query 解析查找并需要延迟回调,因此我将回调传递给_ProcessesARecord(self, ip, query). 我有我试图返回的虚拟测试数据,所以我建立了回报然后呢?在其他示例中,他们调用 adefer.succeed但我收到错误

 current.result = callback(current.result, *args, **kw)
  File "./bouncer.py", line 52, in _ProcessesARecord
    defer.returnValue([(dns.RRHeader(name=name, type=dns.A, cls=dns.IN, payload=dns.Record_A(address=addr)),), (), ()])
  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, type=dns.A, cls=dns.IN, payload=dns.Record_A(address=addr)),), (), ()到初始请求者?

感谢您抽出宝贵的时间。

4

0 回答 0