问题描述
我需要一些帮助来理解 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 (将#修改为@)