ЗАКРЫТО — Как получить разрешенный DNS-IP от python twisted reactor?

#python #dns #twisted

Вопрос:

Я пытаюсь создать разрешающий DNS-сервер с помощью python twisted. Я хочу выполнить поиск по домену, а затем манипулировать (или, по крайней мере, анализировать) возвращенным значением поиска. Вот что я сделал до сих пор:

 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 dump(self, obj):
        for attr in dir(obj):
            if hasattr(obj, attr):
                print("obj.%s = %s" % (attr, getattr(obj, attr)))

    def _qryCallBack(self, qry):
        # print(qry)
        print(len(qry))
        for i in qry[1]:
            print(i)

    def _qryError(self, domainname):
        print("error {}".format(domainname))

    def query(self, query, timeout=None):
        """
        Check if the query should be answered dynamically, otherwise dispatch to
        the fallback resolver.
        """
        _d = self.__resolver.lookupService(query.name.name)
        _d.addCallback(self._qryCallBack)
        _d.addErrback(self._qryError)

        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())
 

То, что возвращается, — это

 <RR name=google.com type=SOA class=IN ttl=59s auth=False>
 

Я заинтересован в анализе и проверке IP-адреса, но он не настраивается. Может ли кто-нибудь указать мне, что я делаю не так?
Спасибо

Комментарии:

1. IP — адрес не возвращается, потому что вы возвращаете SOA запись либо потому, что вы ее запросили (посмотрите в документации вашей библиотеки, чтобы узнать, как запросить A или AAAA записи), либо потому, что это действительно то, что ответил удаленный сервер, что может произойти, например, для имен, которых не существует. Поэтому независимо от того, что нужно вашему коду, сначала проверьте тип записи ресурса, прежде чем пытаться получить в нем IP-адрес, если это действительно запись A/AAAA. И обрабатывайте эти случаи в зависимости от ваших потребностей (сообщите о проблеме? повторите что-нибудь еще? и т.д.)

2. Спасибо вам за то, что вы опубликовали. Поиск был для SOA, я качаю головой. Снова ты раскачиваешься.

3. Спасибо вам за помощь, с тех пор я добавил _d = self.__resolver.getHostByName(_query_name, timeout=None, effort=10) . Это вернет разрешенный IP-адрес. Это было то, что я искал. Спасибо, и это можно закрыть