当前位置: 首页 > 编程笔记 >

Python写的一个简单DNS服务器实例

饶德本
2023-03-14
本文向大家介绍Python写的一个简单DNS服务器实例,包括了Python写的一个简单DNS服务器实例的使用技巧和注意事项,需要的朋友参考一下

因为突然有个邪恶的想法,想在自己的Android平板上面搭建一个DNS服务器,因为平板上之前安装过SL4A和Python的解释器,也想继续学学Python因此,就打算用Python实现了。

在Google上面找了一下,Python实现的DNS,没找到我所希望的答案,因此就决定自己来实现了。

现在所实现的没什么高深的,只是能够对A记录查询进行简单的匹配和回复。

实现的代码如下:

'''
Created on 2012-10-15

@author: RobinTang '''

import socketserver import struct

# DNS Query class SinDNSQuery:     def __init__(self, data):         i = 1         self.name = ''         while True:             d = data[i]             if d == 0:                 break;             if d < 32:                 self.name = self.name + '.'             else:                 self.name = self.name + chr(d)             i = i + 1         self.querybytes = data[0:i + 1]         (self.type, self.classify) = struct.unpack('>HH', data[i + 1:i + 5])         self.len = i + 5     def getbytes(self):         return self.querybytes + struct.pack('>HH', self.type, self.classify)

# DNS Answer RRS # this class is also can be use as Authority RRS or Additional RRS class SinDNSAnswer:     def __init__(self, ip):         self.name = 49164         self.type = 1         self.classify = 1         self.timetolive = 190         self.datalength = 4         self.ip = ip     def getbytes(self):         res = struct.pack('>HHHLH', self.name, self.type, self.classify, self.timetolive, self.datalength)         s = self.ip.split('.')         res = res + struct.pack('BBBB', int(s[0]), int(s[1]), int(s[2]), int(s[3]))         return res

# DNS frame # must initialized by a DNS query frame class SinDNSFrame:     def __init__(self, data):         (self.id, self.flags, self.quests, self.answers, self.author, self.addition) = struct.unpack('>HHHHHH', data[0:12])         self.query = SinDNSQuery(data[12:])     def getname(self):         return self.query.name     def setip(self, ip):         self.answer = SinDNSAnswer(ip)         self.answers = 1         self.flags = 33152     def getbytes(self):         res = struct.pack('>HHHHHH', self.id, self.flags, self.quests, self.answers, self.author, self.addition)         res = res + self.query.getbytes()         if self.answers != 0:             res = res + self.answer.getbytes()         return res # A UDPHandler to handle DNS query class SinDNSUDPHandler(socketserver.BaseRequestHandler):     def handle(self):         data = self.request[0].strip()         dns = SinDNSFrame(data)         socket = self.request[1]         namemap = SinDNSServer.namemap         if(dns.query.type==1):             # If this is query a A record, then response it             name = dns.getname();             if namemap.__contains__(name):                 # If have record, response it                 dns.setip(namemap[name])                 socket.sendto(dns.getbytes(), self.client_address)             elif namemap.__contains__('*'):                 # Response default address                 dns.setip(namemap['*'])                 socket.sendto(dns.getbytes(), self.client_address)             else:                 # ignore it                 socket.sendto(data, self.client_address)         else:             # If this is not query a A record, ignore it             socket.sendto(data, self.client_address)

# DNS Server # It only support A record query # user it, U can create a simple DNS server class SinDNSServer:     def __init__(self, port=53):         SinDNSServer.namemap = {}         self.port = port     def addname(self, name, ip):         SinDNSServer.namemap[name] = ip     def start(self):         HOST, PORT = "0.0.0.0", self.port         server = socketserver.UDPServer((HOST, PORT), SinDNSUDPHandler)         server.serve_forever()

# Now, test it if __name__ == "__main__":     sev = SinDNSServer()     sev.addname('www.aa.com', '192.168.0.1')    # add a A record     sev.addname('www.bb.com', '192.168.0.2')    # add a A record     sev.addname('*', '0.0.0.0') # default address     sev.start() # start DNS server

# Now, U can use "nslookup" command to test it # Such as "nslookup www.aa.com"

 类似资料:
  • Http是一个比tcp更高级的协议,它描述了客户端浏览器如何与网页服务器进行通信。Go有自己的net/http包,我们来看看它。我们从一些简单的示例开始, 首先编写一个“Hello world!”:查看示例15.6 我们引入了http包并启动了网页服务器,和15.1的net.Listen("tcp", "localhost:50000")函数的tcp服务器是类似的,使用http.ListenAnd

  • 本文向大家介绍使用Python的Twisted框架实现一个简单的服务器,包括了使用Python的Twisted框架实现一个简单的服务器的使用技巧和注意事项,需要的朋友参考一下 预览   twisted是一个被设计的非常灵活框架以至于能够让你写出非常强大的服务器。这种灵活的代价是需要好通过好几个层次来实现你的服务器, 本文档描述的是Protocol层,你将在这个层次中执行协议的分析和处理,如果你正在

  • 本文向大家介绍Python实现简单的代理服务器,包括了Python实现简单的代理服务器的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python实现简单的代理服务器。分享给大家供大家参考。具体如下: 具备简单的管理功能,运行后 telnet localhost 9000 端口可以进行管理主要功能就是做包转发,如果有一个桥服务器,可以用来外网访问内网用,还是很管用的 希望本文所述对大家的P

  • 本文向大家介绍java实现一个简单的Web服务器实例解析,包括了java实现一个简单的Web服务器实例解析的使用技巧和注意事项,需要的朋友参考一下 Web服务器也称为超文本传输协议服务器,使用http与其客户端进行通信,基于java的web服务器会使用两个重要的类, java.net.Socket类和java.net.ServerSocket类,并基于发送http消息进行通信。 这个简单的Web服

  • 本文向大家介绍Go语言实现的一个简单Web服务器,包括了Go语言实现的一个简单Web服务器的使用技巧和注意事项,需要的朋友参考一下 Web是基于http协议的一个服务,Go语言里面提供了一个完善的net/http包,通过http包可以很方便的就搭建起来一个可以运行的Web服务。同时使用这个包能很简单地对Web的路由,静态文件,模版,cookie等数据进行设置和操作。 http包建立Web服务器 上

  • 本文向大家介绍python实现简单的TCP代理服务器,包括了python实现简单的TCP代理服务器的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python实现简单的TCP代理服务器的方法,分享给大家供大家参考。 具体实现代码如下: 完整实例代码点击此处本站下载。 希望本文所述对大家的Python程序设计有所帮助。