如何在Python中设置本地DNS服务器

4

我正在使用Windows 7和Python 2.7。我想将IP地址172.16.45.84映射到myapp.nobies.in,而无需在hosts文件中进行映射。

我拥有此主机名所需的证书。我不想在hosts文件中进行映射,因为它需要管理员权限。

那么,如何为此创建DNS Python服务器,以便可以与我的应用程序一起使用。


这就是公共DNS的作用。 - Joe
@Joe,OP正在寻找一种DNS解决方案,可以在没有本地管理员权限的情况下覆盖单个主机名。公共DNS无法实现此目的。 - nettux
DNS服务器本身必须使用Python的原因是什么?您可以尝试使用预构建的DNS服务器来查找所需内容,然后编写使用Python的应用程序来使用它。 - Brōtsyorfuzthrāx
1个回答

5

请参考此帖子如何在Python中进行DNS查找,包括引用/ etc / hosts? 了解如何在Python中进行DNS查找。

您可以尝试以下操作:

import socket
name = raw_input("hostname:")
if name == "mpapp.nobies.in":
    print "172.16.45.84"
else:
    print socket.gethostbyname(name)

这将执行普通的DNS查找,除非您查找"myapp.nobies.in",这将返回172.16.45.84。

注意:这不是一个功能完备的DNS服务器应用程序。但它是一种(非常基本的)类似nslookup的命令替代品。要使其成为实际服务器,您需要在53号端口上侦听DNS数据包(这将需要管理员权限,因为它是特权端口。我想您可以使用更高的端口,但您还需要在DNS客户端上进行配置)。请在Python中研究套接字服务器编程。这里有来自Python文档的好文章:

https://docs.python.org/2/howto/sockets.html

并在这里:

https://docs.python.org/2/library/socket.html

我建议您查找 dnslib 和/或 dnspython 以解析DNS数据包。 编辑:
尝试使用以下代码进行操作:(在命令提示符中启动并最小化)
#!/usr/bin/python

import socket

def resolve(name):
    if name == "mpapp.nobies.in":
        return "172.16.45.84"
    else :
        # you ought to add some basic checking of name here
        return socket.gethostbyname(name)

host = ''
port = 50000
backlog = 5
size = 1024
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host,port))
s.listen(backlog)
while 1:
    client, address = s.accept()
    data = client.recv(size)
    if data:
        bits = data.split(":")
        if bits[0] == 'h':
            client.send(resolve(bits[1]))
    client.close()

并将其用作客户端:(自定义变量并在启动服务器后运行)

#!/usr/bin/python

import socket

### configure me ###

dns_server_ip = '127.0.0.1'
dns_server_port = 50000
query = 'mpapp.nobies.in' # change this to the hostname you want to lookup

### configure me ###

size = 1024

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((dns_server_ip,dns_server_port))
s.send('h:' + query)
data = s.recv(size)
s.close()
print data

注意:这并不是真正的DNS服务器,它不能理解DNS数据包,只是在50000端口上接收以“h:”为前缀的主机名字符串,并返回一个IP地址。我希望这符合您的需求。
使用方法:
$ START "" .\dns-server.py
$ .\dns-client.py
172.16.45.84

谢谢您的回答。我查看了这些文档,但没有找到如何制作DNS服务器的线索。 - imp
@imp 你只需要一个能够接收主机名并输出 IP 的工具(基本上只使用 A 记录),还是需要完整的正式 DNS 服务器的功能? - nettux
如果在hosts文件中映射了172.16.45.84 myapp.nobies.in,那么它可以正常工作。但是,通过代码编写hosts文件需要管理员权限。因此,在不编写hosts文件的情况下,应该如何将此IP与主机名映射起来?如何实现呢? - imp
我尝试了这个,但它没有起作用。我正在使用https://myapp.nobies.in:4440作为URL,它应该指向https://172.16.45.84:4440,但是172.16.45.84 myapp.nobies.in不应该在hosts文件中映射。它应该使用Python代码自动将此IP映射到主机名。 - imp
@imp 你要依赖客户端机器上管理员配置的名称解析服务和优先级。这几乎总是会先查找hosts文件,然后才是配置的DNS服务器(没有其他的)。缺少管理员权限使得这个问题变得棘手,这并不是错误...你试图做一些需要管理员授权的事情,所以如果你能让它工作,那只能是通过黑客而不是解决方案。我能想到的唯一可能接近解决方案的事情就是编写一个Web浏览器插件来重定向用户到该IP。 - nettux
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接