#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-адрес. Это было то, что я искал. Спасибо, и это можно закрыть