Python DNS服务器
我正在为我当前的项目添加一项功能,允许网络管理员将软件安装到网络上。我需要用Python编写一个DNS服务器,如果请求地址在我的列表中,它将允许我重定向到某个页面。我能够编写服务器,只是不知道如何重定向Python DNS服务器,python,windows,redirect,dns,Python,Windows,Redirect,Dns,我正在为我当前的项目添加一项功能,允许网络管理员将软件安装到网络上。我需要用Python编写一个DNS服务器,如果请求地址在我的列表中,它将允许我重定向到某个页面。我能够编写服务器,只是不知道如何重定向 多谢各位。我在Windows XP上使用Python2.6。没有一个简单的例子可以很容易地用来制作各种“迷你假dns服务器”。请注意,绝对不涉及“重定向”(这不是DNS的工作方式):而是请求域名,请求的结果是IP地址。如果您想做的与将名称转换为地址有很大不同,那么可能您实际上需要的不是DNS服务
多谢各位。我在Windows XP上使用Python2.6。没有一个简单的例子可以很容易地用来制作各种“迷你假dns服务器”。请注意,绝对不涉及“重定向”(这不是DNS的工作方式):而是请求域名,请求的结果是IP地址。如果您想做的与将名称转换为地址有很大不同,那么可能您实际上需要的不是DNS服务器…?这里是一个用python编写的DNS服务器/代理: 使用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()
用法:
默认情况下,此示例绑定go0.0.0.0:53
,因此您需要执行以下操作:
sudo ./dnsserver.py
否则,请更改
bind
参数。我使用库为编写了一个DNS服务器。您可以在上看到示例。我想不是。那我需要什么呢?我想我需要一个代理,因为我想让network andims能够轻松地使用我的程序进行网址过滤。如果我使用代理,它就不能是“网络范围”的实用工具,因为在大多数路由器设置中都没有设置代理的地方。@Zachary,我不知道你需要什么,因为我仍然不明白你想实现什么样的“网址过滤”——我只是回答了你实际提出的问题。例如,如果您正在编写一个需要根据执行请求的IP做出不同响应的web服务器,那么这显然是一个完全不同的问题(首先,取决于您选择的web框架&c;-)……如果您希望您的服务器代理不同的服务器,而在技术上不是HTTP代理,这也是可行的,但又是一个完全不同的问题。请提出另一个问题,更精确地说明您要完成的任务,然后关闭此问题!-)不太清楚。我已经写了一个代理,阻止访问某些关键字或地址的网站。现在,我需要为整个网络提供相同类型的解决方案。也许我需要DNS服务器通过代理转发所有请求?如果这是我需要的,让我知道,我会张贴这个问题。谢谢。@Zachary,当然,你可以有一个不翻译特定地址的DNS服务器(这是DNS服务器“阻止访问”的唯一方式)!-“转发到代理”毫无意义,除非你所谓的“代理”处理世界上的每一个协议(包括基于TCP和基于UDP的协议,但这只是一个开始),这确实是一个非常奇怪的“代理”(代理通常处理少量协议,通常只有HTTP和HTTPS——DNS服务器当然不知道正在使用的协议)。