【发布时间】:2011-04-16 01:14:55
【问题描述】:
我正在向我当前的项目添加一项功能,该功能将允许网络管理员将软件安装到网络。我需要用 Python 编写一个 DNS 服务器,如果请求地址在我的列表中,我可以重定向到某个页面。我能够编写服务器,只是不确定如何重定向。
谢谢。我在 Windows XP 上使用 Python 2.6。
【问题讨论】:
标签: python windows redirect dns
我正在向我当前的项目添加一项功能,该功能将允许网络管理员将软件安装到网络。我需要用 Python 编写一个 DNS 服务器,如果请求地址在我的列表中,我可以重定向到某个页面。我能够编写服务器,只是不确定如何重定向。
谢谢。我在 Windows XP 上使用 Python 2.6。
【问题讨论】:
标签: python windows redirect dns
我使用Python Twisted 库为NameOcean.net 编写了一个DNS 服务器。您可以在https://twistedmatrix.com/documents/16.5.0/names/howto/custom-server.html 上查看示例。
【讨论】:
使用circuits 和dnslib,这是一个用 Python 编写的完整递归 dns 服务器,代码仅 143 行:
#!/usr/bin/env python
from __future__ import print_function
from uuid import uuid4 as uuid
from dnslib import CLASS, QR, QTYPE
from dnslib import DNSHeader, DNSQuestion, DNSRecord
from circuits.net.events import write
from circuits import Component, Debugger, Event
from circuits.net.sockets import UDPClient, UDPServer
class lookup(Event):
"""lookup Event"""
class query(Event):
"""query Event"""
class response(Event):
"""response Event"""
class DNS(Component):
def read(self, peer, data):
record = DNSRecord.parse(data)
if record.header.qr == QR["QUERY"]:
return self.fire(query(peer, record))
return self.fire(response(peer, record))
class ReturnResponse(Component):
def response(self, peer, response):
return response
class Client(Component):
channel = "client"
def init(self, server, port, channel=channel):
self.server = server
self.port = int(port)
self.transport = UDPClient(0, channel=self.channel).register(self)
self.protocol = DNS(channel=self.channel).register(self)
self.handler = ReturnResponse(channel=self.channel).register(self)
class Resolver(Component):
def init(self, server, port):
self.server = server
self.port = port
def lookup(self, qname, qclass="IN", qtype="A"):
channel = uuid()
client = Client(
self.server,
self.port,
channel=channel
).register(self)
yield self.wait("ready", channel)
self.fire(
write(
(self.server, self.port),
DNSRecord(
q=DNSQuestion(
qname,
qclass=CLASS[qclass],
qtype=QTYPE[qtype]
)
).pack()
)
)
yield (yield self.wait("response", channel))
client.unregister()
yield self.wait("unregistered", channel)
del client
class ProcessQuery(Component):
def query(self, peer, query):
qname = query.q.qname
qtype = QTYPE[query.q.qtype]
qclass = CLASS[query.q.qclass]
response = yield self.call(lookup(qname, qclass=qclass, qtype=qtype))
record = DNSRecord(
DNSHeader(id=query.header.id, qr=1, aa=1, ra=1),
q=query.q,
)
for rr in response.value.rr:
record.add_answer(rr)
yield record.pack()
class Server(Component):
def init(self, bind=("0.0.0.0", 53)):
self.bind = bind
self.transport = UDPServer(self.bind).register(self)
self.protocol = DNS().register(self)
self.handler = ProcessQuery().register(self)
class App(Component):
def init(self, bind=("0.0.0.0", 53), server="8.8.8.8", port=53,
verbose=False):
if verbose:
Debugger().register(self)
self.resolver = Resolver(server, port).register(self)
self.server = Server(bind).register(self)
def main():
App().run()
if __name__ == "__main__":
main()
用法:
默认情况下,此示例绑定 go 0.0.0.0:53,因此您需要执行以下操作:
sudo ./dnsserver.py
否则更改bind 参数。
【讨论】:
这是一个用 python 编写的适用于我的 dns serer/proxy:
【讨论】:
有一个小而简单的例子here可以很容易地适应制作各种“迷你假DNS服务器”。请注意,绝对不涉及“重定向”(这不是 DNS 的工作方式):相反,请求是针对 域名,该请求的结果是 IP 地址。如果您想要做的与将名称转换为地址完全不同,那么您可能需要的是不是实际上是 DNS 服务器...?
【讨论】: