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中用has_key()方法查找键是否存在的教程
May 21 Python
R语言 vs Python对比:数据分析哪家强?
Nov 17 Python
windows 下python+numpy安装实用教程
Dec 23 Python
Django实战之用户认证(用户登录与注销)
Jul 16 Python
python 检查是否为中文字符串的方法
Dec 28 Python
Python3环境安装Scrapy爬虫框架过程及常见错误
Jul 12 Python
在Python中使用filter去除列表中值为假及空字符串的例子
Nov 18 Python
pytorch之添加BN的实现
Jan 06 Python
基于pygame实现童年掌机打砖块游戏
Feb 25 Python
如何理解python面向对象编程
Jun 01 Python
Python爬虫之Spider类用法简单介绍
Aug 04 Python
python入门教程之基本算术运算符
Nov 13 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读取大文件的类SplFileObject使用介绍
2014/04/09 PHP
CI框架中集成CKEditor编辑器的教程
2014/06/09 PHP
php readfile()修改文件上传大小设置
2017/08/11 PHP
Laravel配合jwt使用的方法实例
2020/10/25 PHP
jquery 入门教程 [翻译] 推荐
2009/08/17 Javascript
uploadify在Firefox下丢失session问题的解决方法
2013/08/07 Javascript
解决Jquery load()加载GB2312页面时出现乱码的两种方案
2013/09/10 Javascript
javascript正则表达式使用replace()替换手机号的方法
2015/01/19 Javascript
Angularjs编写KindEditor,UEidtor,jQuery指令
2015/01/28 Javascript
Javascript之String对象详解
2016/06/08 Javascript
checkbox 选中一个另一个checkbox也会选中的实现代码
2016/07/09 Javascript
JS实现点击事件统计的简单实例
2016/07/10 Javascript
URL的参数中有加号传值变为空格的问题(URL特殊字符)
2016/11/04 Javascript
微信小程序-详解数据缓存
2016/11/24 Javascript
从零学习node.js之利用express搭建简易论坛(七)
2017/02/25 Javascript
jQuery使用DataTable实现删除数据后重新加载功能
2017/02/27 Javascript
js实现方块上下左右移动效果
2017/08/17 Javascript
浅谈Vue.js应用的四种AJAX请求数据模式
2017/08/30 Javascript
在微信小程序中渲染HTML内容的方法示例
2018/09/28 Javascript
[41:20]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS DK
2014/05/26 DOTA
Python的Flask框架中web表单的教程
2015/04/20 Python
mac系统安装Python3初体验
2018/01/02 Python
使用卷积神经网络(CNN)做人脸识别的示例代码
2020/03/27 Python
如何理解Python中包的引入
2020/05/29 Python
Python在字符串中处理html和xml的方法
2020/07/31 Python
介绍一下linux文件系统分配策略
2013/02/25 面试题
应届生新闻编辑求职信
2013/11/19 职场文书
理工大学毕业生自荐信范文
2014/02/22 职场文书
《风筝》教学反思
2014/04/10 职场文书
环保倡议书怎么写
2014/05/16 职场文书
优秀团员事迹材料2000字
2014/08/20 职场文书
《周恩来的四个昼夜》观后思想汇报范文两篇
2014/09/10 职场文书
保险公司客户经理岗位职责
2015/04/09 职场文书
2015年物资管理工作总结
2015/05/20 职场文书
2015年财务人员个人工作总结
2015/07/27 职场文书
高中16字霸气押韵班级口号集锦!
2019/06/27 职场文书