4

我正在使用 Windows 7 和 python 2.7 我想将 172.16.45.84 IP 地址映射到 myapp.nobies.in 而不映射到 hosts 文件中。

我有此主机名所需的证书。我不想映射到主机文件,因为它需要管理权限。

那么,如何为它创建一个 DNS python 服务器,它可以随我的应用程序一起提供。

4

1 回答 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 查找,除非您查找将返回 172.16.45.84 的“myapp.nobies.in”

注意:这不是一个正常运行的 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
于 2014-05-09T10:48:57.400 回答