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的urllib库提交WEB表单
Feb 24 Python
Python函数中定义参数的四种方式
Nov 30 Python
按日期打印Python的Tornado框架中的日志的方法
May 02 Python
python生成IP段的方法
Jul 07 Python
python机器学习之神经网络(三)
Dec 20 Python
获取python文件扩展名和文件名方法
Feb 02 Python
在Pycharm中自动添加时间日期作者等信息的方法
Jan 16 Python
Python实现计算文件MD5和SHA1的方法示例
Jun 11 Python
详解Python可视化神器Yellowbrick使用
Nov 11 Python
tornado+celery的简单使用详解
Dec 21 Python
python多进程 主进程和子进程间共享和不共享全局变量实例
Apr 25 Python
python:删除离群值操作(每一行为一类数据)
Jun 08 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
Linux下 php5 MySQL5 Apache2 phpMyAdmin ZendOptimizer安装与配置[图文]
2008/11/18 PHP
PHP 日期加减的类,很不错
2009/10/10 PHP
php 在文件指定行插入数据的代码
2010/05/08 PHP
在Mac OS的PHP环境下安装配置MemCache的全过程解析
2016/02/15 PHP
php生成无限栏目树
2017/03/16 PHP
Prototype使用指南之ajax
2007/01/10 Javascript
JS启动应用程序的一个简单例子
2008/05/11 Javascript
js获得当前系统日期时间的方法
2015/05/06 Javascript
jQuery替换textarea中换行的方法
2015/06/10 Javascript
javascript html实现网页版日历代码
2016/03/08 Javascript
下雪了 javascript实现雪花飞舞
2020/08/02 Javascript
JavaScript每天必学之事件
2016/09/18 Javascript
Node.js命令行/批处理中如何更改Linux用户密码浅析
2018/07/22 Javascript
layui实现table加载的示例代码
2018/08/14 Javascript
JS+canvas画布实现炫酷的旋转星空效果示例
2019/02/13 Javascript
vue表单验证你真的会了吗?vue表单验证(form)validate
2019/04/07 Javascript
JavaScript实现更换背景图片
2019/10/18 Javascript
详解Python的collections模块中的deque双端队列结构
2016/07/07 Python
Python简单检测文本类型的2种方法【基于文件头及cchardet库】
2016/09/18 Python
Python 中 Virtualenv 和 pip 的简单用法详解
2017/08/18 Python
python内置数据类型之列表操作
2018/11/12 Python
详解Python3中ceil()函数用法
2019/02/19 Python
Python2.7版os.path.isdir中文路径返回false的解决方法
2019/06/21 Python
使用python 将图片复制到系统剪贴中
2019/12/13 Python
Django2.1.7 查询数据返回json格式的实现
2020/12/29 Python
python压包的概念及实例详解
2021/02/17 Python
Moss Bros官网:英国排名第一的西装店
2020/02/26 全球购物
CHARLES & KEITH加拿大官网:新加坡时尚品牌
2020/03/26 全球购物
电气专业推荐信范文
2013/11/18 职场文书
党的群众路线教育实践活动心得体会
2014/03/03 职场文书
教师对学生的寄语
2014/04/03 职场文书
小学评语大全
2014/04/22 职场文书
领导班子党的群众路线教育实践活动对照检查材料
2014/09/25 职场文书
2014年党风廉政建设工作总结
2014/11/19 职场文书
2015年公路路政个人工作总结
2015/07/24 职场文书
Python实战之OpenCV实现猫脸检测
2021/06/26 Python