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列表(list)常用操作方法小结
Feb 02 Python
利用Python实现网络测试的脚本分享
May 26 Python
浅谈flask截获所有访问及before/after_request修饰器
Jan 18 Python
Python面向对象之类和对象属性的增删改查操作示例
Dec 14 Python
python批量获取html内body内容的实例
Jan 02 Python
Python 使用元类type创建类对象常见应用详解
Oct 17 Python
关于Pytorch的MLP模块实现方式
Jan 07 Python
快速解决Django关闭Debug模式无法加载media图片与static静态文件
Apr 07 Python
Python读取配置文件(config.ini)以及写入配置文件
Apr 08 Python
Python unittest框架操作实例解析
Apr 13 Python
基于OpenCV的路面质量检测的实现
Nov 04 Python
Python爬虫入门案例之爬取二手房源数据
Oct 16 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
PHP5.5和之前的版本empty函数的不同之处
2014/06/13 PHP
Symfony2学习笔记之系统路由详解
2016/03/17 PHP
Thinkphp5框架实现图片、音频和视频文件的上传功能详解
2019/08/27 PHP
js验证IP及子网掩码的合法性有效性示例
2014/04/30 Javascript
node.js中的fs.chown方法使用说明
2014/12/16 Javascript
js封装可使用的构造函数继承用法分析
2015/01/28 Javascript
JavaScript代码实现左右上下自动晃动自动移动
2016/04/08 Javascript
jquery实现无刷新验证码的简单实例
2016/05/19 Javascript
js检测离开或刷新页面时表单数据是否更改的方法
2016/08/02 Javascript
CentOS 安装NodeJS V8.0.0的方法
2017/06/15 NodeJs
浅谈JavaScript find 方法不支持IE的问题
2017/09/28 Javascript
Vuejs开发环境搭建及热更新【推荐】
2018/09/07 Javascript
微信小程序渲染性能调优小结
2019/07/30 Javascript
vue实现的封装全局filter并统一管理操作示例
2020/02/02 Javascript
node.js中 redis 的安装和基本操作示例
2020/02/10 Javascript
Python迭代用法实例教程
2014/09/08 Python
Python数据结构之Array用法实例
2014/10/09 Python
Python合并字典键值并去除重复元素的实例
2016/12/18 Python
详解python中字典的循环遍历的两种方式
2017/02/07 Python
Python 模块EasyGui详细介绍
2017/02/19 Python
Django+Xadmin构建项目的方法步骤
2019/03/06 Python
Django添加bootstrap框架时无法加载静态文件的解决方式
2020/03/27 Python
Python优秀开源项目Rich源码解析的流程分析
2020/07/06 Python
Python使用pickle进行序列化和反序列化的示例代码
2020/09/22 Python
css3与html5实现响应式导航菜单(导航栏)效果分享
2014/02/12 HTML / CSS
CSS3 实现的火焰动画
2020/12/07 HTML / CSS
惠普美国官方商店:HP Official Store
2016/08/28 全球购物
美国最大的骑马用品零售商:HorseLoverZ
2017/01/12 全球购物
英国家用电器购物网站:Hughes
2018/02/23 全球购物
EJB需直接实现它的业务接口或Home接口吗,请简述理由
2016/11/23 面试题
优秀党员主要事迹
2014/01/19 职场文书
教师研修随笔感言
2014/01/23 职场文书
数控专业大学毕业生职业规划范文
2014/02/06 职场文书
幼儿园元旦家长感言
2014/02/27 职场文书
入党积极分子批评与自我批评思想汇报
2014/09/14 职场文书
同乡会致辞
2015/07/30 职场文书