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的线程来解决生产者消费问题的示例
Apr 02 Python
python字典的常用操作方法小结
May 16 Python
R vs. Python 数据分析中谁与争锋?
Oct 18 Python
Python实现从SQL型数据库读写dataframe型数据的方法【基于pandas】
Mar 18 Python
PyQt5 加载图片和文本文件的实例
Jun 14 Python
numpy数组广播的机制
Jul 12 Python
Python + Flask 实现简单的验证码系统
Oct 01 Python
150行Python代码实现带界面的数独游戏
Apr 04 Python
Python 如何批量更新已安装的库
May 26 Python
Python利用Xpath选择器爬取京东网商品信息
Jun 01 Python
pytorch 移动端部署之helloworld的使用
Oct 30 Python
用pushplus+python监控亚马逊到货动态推送微信
Jan 29 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 操作数组(合并,拆分,追加,查找,删除等)
2012/07/20 PHP
解析php多线程下载远程多个文件
2013/06/25 PHP
PHP过滤★等特殊符号的正则
2014/01/27 PHP
PHP中feof()函数实例测试
2014/08/23 PHP
PHP页面间传递值和保持值的方法
2016/08/24 PHP
php基于websocket搭建简易聊天室实践
2016/10/24 PHP
PHP实现接收二进制流转换成图片的方法
2017/01/10 PHP
替换php字符串中的单引号为双引号的方法
2017/02/16 PHP
微信公众平台开发教程④ ThinkPHP框架下微信支付功能图文详解
2019/04/10 PHP
关于Javascript模块化和命名空间管理的问题说明
2010/12/06 Javascript
js自动生成的元素与页面原有元素发生堆叠的解决方法
2013/10/24 Javascript
自己用jQuery写了一个图片的马赛克消失效果
2014/05/04 Javascript
用html+css+js实现的一个简单的图片切换特效
2014/05/28 Javascript
chrome不支持form.submit的解决方案
2015/04/28 Javascript
通过XMLHttpRequest和jQuery实现ajax的几种方式
2015/08/28 Javascript
Position属性之relative用法
2015/12/14 Javascript
深入分析jQuery的ready函数是如何工作的(工作原理)
2015/12/17 Javascript
javascript函数中的3个高级技巧
2016/09/22 Javascript
微信小程序删除处理详解
2017/08/16 Javascript
JavaScript中利用Array filter() 方法压缩稀疏数组
2018/02/24 Javascript
使用Layui搭建后台管理界面的操作方法
2019/09/20 Javascript
vue抽出组件并传值实例
2020/07/31 Javascript
[36:52]DOTA2真视界:基辅特锦赛总决赛
2017/05/21 DOTA
python 文件操作api(文件操作函数)
2016/08/28 Python
Python爬虫_城市公交、地铁站点和线路数据采集实例
2018/01/10 Python
对python cv2批量灰度图片并保存的实例讲解
2018/11/09 Python
pycharm打开命令行或Terminal的方法
2019/01/16 Python
python实现名片管理系统项目
2019/04/26 Python
python实现桌面气泡提示功能
2019/07/29 Python
css3圆角边框和边框阴影示例
2014/05/05 HTML / CSS
Merchant 1948澳大利亚:新西兰领先的鞋类和靴子供应商
2018/03/24 全球购物
化工工艺专业求职信
2013/09/22 职场文书
两则小学生的自我评价分享
2013/11/14 职场文书
民生工程实施方案
2014/03/22 职场文书
读后感怎么写?书写读后感的基本技巧!
2019/12/10 职场文书
Ajax异步刷新功能及简单案例
2021/11/20 Javascript