【问题标题】:How to set up a local DNS server in python如何在python中设置本地DNS服务器
【发布时间】:2014-06-27 01:39:23
【问题描述】:

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

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

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

【问题讨论】:

  • 这就是公共 DNS 的用途。
  • @Joe 操作员要求提供 dns 解决方案,无需本地管理员权限即可覆盖单个主机名。公共 dns 无法做到这一点。
  • DNS 服务器本身必须使用 Python 是否有原因?您可以使用预建的 DNS 服务器找到您要查找的内容,然后在 Python 中编写使用它的应用程序。

标签: python windows ssl dns hosts-file


【解决方案1】:

请参阅这篇文章How can I do DNS lookups in Python, including referring to /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

【讨论】:

  • 感谢您的回答。我查看了这些文档,但没有任何关于如何制作 DNS 服务器的线索。
  • @imp 你只是想要一个可以获取主机名并输出 ip 的东西(基本上只使用 A 记录)还是需要一个适当的 dns 服务器的全部功能?
  • 如果在 hosts 文件中我映射 172.16.45.84 myapp.nobies.in ,那么它工作正常。但是通过代码写入主机文件需要管理权限。因此,无需写入主机文件,它应该将此 IP 映射到主机名。怎么做。
  • @imp 编辑主机文件需要管理员权限完全停止。我相信这个答案可以满足您对我最新编辑的需求(请参阅服务器中的第 6 行和第 7 行以获取自定义条目)唯一的问题是这不是真正的 DNS,但如果您只需要插入就可以了你自己的应用程序。 IE 这在网络浏览器或 ping 等中不起作用。
  • 我试过了,但是没有用。我使用 myapp.nobies.in:4440 作为 URL,它应该指向 172.16.45.84:4440 但 172.16.45.84 myapp.nobies.in 不应该映射到主机文件中。它应该使用 python 代码自动将此 IP 映射到主机名
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-31
  • 1970-01-01
  • 2010-12-28
  • 1970-01-01
  • 2017-04-16
  • 1970-01-01
  • 2021-09-20
相关资源
最近更新 更多