Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python DNS服务器_Python_Windows_Redirect_Dns - Fatal编程技术网

Python DNS服务器

Python DNS服务器,python,windows,redirect,dns,Python,Windows,Redirect,Dns,我正在为我当前的项目添加一项功能,允许网络管理员将软件安装到网络上。我需要用Python编写一个DNS服务器,如果请求地址在我的列表中,它将允许我重定向到某个页面。我能够编写服务器,只是不知道如何重定向 多谢各位。我在Windows XP上使用Python2.6。没有一个简单的例子可以很容易地用来制作各种“迷你假dns服务器”。请注意,绝对不涉及“重定向”(这不是DNS的工作方式):而是请求域名,请求的结果是IP地址。如果您想做的与将名称转换为地址有很大不同,那么可能您实际上需要的不是DNS服务

我正在为我当前的项目添加一项功能,允许网络管理员将软件安装到网络上。我需要用Python编写一个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()
用法:

默认情况下,此示例绑定go
0.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服务器当然不知道正在使用的协议)。