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

4 投票
1 回答
16552 浏览
提问于 2025-04-18 05:58

我现在在用Windows 7和Python 2.7,我想把172.16.45.84这个IP地址映射到myapp.nobies.in,但不想在hosts文件里做这个映射。

我已经有了这个主机名所需的证书。我不想在hosts文件里做映射,因为那需要管理员权限。

所以,我该怎么用Python创建一个DNS服务器,让它可以和我的应用一起打包呢?

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数据包,只是接受一个以'h:'开头的主机名字符串在50000端口,并返回一个IP地址。希望这能满足你的需求。

使用方法:

$ START "" .\dns-server.py
$ .\dns-client.py
172.16.45.84

撰写回答