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


Posted in Python onJune 04, 2014

因为突然有个邪恶的想法,想在自己的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"
Python 相关文章推荐
Python中使用wxPython开发的一个简易笔记本程序实例
Feb 08 Python
python中assert用法实例分析
Apr 30 Python
python过滤字符串中不属于指定集合中字符的类实例
Jun 30 Python
合并百度影音的离线数据( with python 2.3)
Aug 04 Python
python 字符串转列表 list 出现\ufeff的解决方法
Jun 22 Python
使用Python更换外网IP的方法
Jul 09 Python
Django2.1.3 中间件使用详解
Nov 26 Python
python解压TAR文件至指定文件夹的实例
Jun 10 Python
python绘制直方图和密度图的实例
Jul 08 Python
Python 图像对比度增强的几种方法(小结)
Sep 25 Python
Python读取文件夹下的所有文件实例代码
Apr 02 Python
提取视频中的音频 Python只需要三行代码!
May 10 Python
python写的ARP攻击代码实例
Jun 04 #Python
python和C语言混合编程实例
Jun 04 #Python
python实现的一个p2p文件传输实例
Jun 04 #Python
python实现文件分组复制到不同目录的例子
Jun 04 #Python
python实现的udp协议Server和Client代码实例
Jun 04 #Python
Python实现同时兼容老版和新版Socket协议的一个简单WebSocket服务器
Jun 04 #Python
Python程序员鲜为人知但你应该知道的17个问题
Jun 04 #Python
You might like
如何使用php输出时间格式
2013/08/31 PHP
php自定义的格式化时间示例代码
2013/12/05 PHP
ThinkPHP的I方法使用详解
2014/06/18 PHP
typecho插件编写教程(一):Hello World
2015/05/28 PHP
smarty中改进truncate使其支持中文的方法
2016/05/30 PHP
Zend Framework入门教程之Zend_Session会话操作详解
2016/12/08 PHP
对联广告js flash激活
2006/10/19 Javascript
IE8 原生JSON支持
2009/04/13 Javascript
js获取事件源及触发该事件的对象
2013/10/24 Javascript
javascript陷阱 一不小心你就中招了(字符运算)
2013/11/10 Javascript
前端轻量级MVC框架CanJS详解
2014/09/26 Javascript
JavaScript控制两个列表框listbox左右交换数据的方法
2015/03/18 Javascript
JS根据生日算年龄的方法
2015/05/05 Javascript
js实现文本框输入文字个数限制代码
2015/12/25 Javascript
浅谈jquery设置和获得checkbox选中的问题
2016/08/19 Javascript
Angular.js实现多个checkbox只能选择一个的方法示例
2017/02/24 Javascript
vue.js全局API之nextTick全面解析
2017/07/07 Javascript
浅谈手写node可读流之流动模式
2018/06/01 Javascript
微信小程序项目实践之九宫格实现及item跳转功能
2018/07/19 Javascript
vue.js单文件组件中非父子组件的传值实例
2018/09/13 Javascript
vue 右键菜单插件 简单、可扩展、样式自定义的右键菜单
2018/11/29 Javascript
bootstrap tooltips在 angularJS中的使用方法
2019/04/10 Javascript
vue.js购物车添加商品组件的方法
2019/09/17 Javascript
vue 清空input标签 中file的值操作
2020/07/21 Javascript
python使用KNN算法手写体识别
2018/02/01 Python
python爬虫之urllib库常用方法用法总结大全
2018/11/14 Python
Python3实现二叉树的最大深度
2019/09/30 Python
django中瀑布流写法实例代码
2019/10/14 Python
tensorflow模型转ncnn的操作方式
2020/05/25 Python
Python实现图片查找轮廓、多边形拟合、最小外接矩形代码
2020/07/14 Python
基于Python模拟浏览器发送http请求
2020/11/06 Python
解决CSS3的opacity属性带来的层叠顺序问题
2016/05/09 HTML / CSS
小学防溺水制度
2014/01/29 职场文书
加强机关作风建设心得体会
2014/10/22 职场文书
初婚未育证明样本
2015/06/18 职场文书
四年级作文之植物
2019/09/20 职场文书