[英]How to set up a local DNS server in python
我正在使用Windows 7和python 2.7我想將172.16.45.84 IP地址映射到myapp.nobies.in而不在hosts文件中映射。
我有這個主機名所需的證書。 我不想在hosts文件中映射,因為它需要管理權限。
那么,如何為它創建一個DNS python服務器,可以隨我的應用程序一起提供。
看這篇文章如何在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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.