用python自建一个DNS服务器
class DNSServer(object):
@staticmethod
def start():
# 缓存队列,收到的请求都先放在这里,然后从这里拿数据处理
DNSServer.deq_cache = Queue(maxsize=deq_size) if deq_size > 0 else Queue()
# LRU Cache,使用近期最少使用覆盖原则
DNSServer.dns_cache = pylru.lrucache(lru_size) # 启动协程,循环处理缓存队列
gevent.spawn(_init_cache_queue) # 启动DNS服务器
print 'Start DNS server at %s:%d\n' % (ip, port)
dns_server = SocketServer.UDPServer((ip, port), DNSHandler)
dns_server.serve_forever()
class DNSHandler(SocketServer.BaseRequestHandler):
def handle(self):
# 若缓存队列没有存满,把接收到的包放进缓存队列中(存满则直接丢弃包)
if not DNSServer.deq_cache.full():
# 缓存队列保存元组:(请求包,请求地址,sock)
DNSServer.deq_cache.put((self.request[0], self.client_address, self.request[1]))
def _init_cache_queue():
while True:
data, addr, sock = DNSServer.deq_cache.get()
gevent.spawn(handler, data, addr, sock)
dns.header.set_qr(dnslib.QR.RESPONSE)
qname = dns.q.qname try:
dns = dnslib.DNSRecord.parse(data)
except Exception as e:
print 'Not a DNS packet.\n', e
response = DNSServer.dns_cache.get(qname) if response:
# goto 5
else:
# goto 6
response[:2] = data[:2]
sock.sendto(response, addr)
answers, soa = query(str(qname).rstrip('.'))
answer_dns = pack_dns(dns, answers, soa)
DNSServer.dns_cache[qname] = answer_dns.pack()
sock.sendto(answer_dns.pack(), addr)
.png)


.png)
第一、在开启服务器时将内容全部加载到内存,这样可以去掉LRUCache;
第二、使用redis或mysql之类的数据库;
第三、注意数据的验证,例如判断ip的正则,域名的内容等等。
用python自建一个DNS服务器的更多相关文章
- IP地址,子网掩码,默认网关,DNS服务器知识详解(转)
转自:http://www.cnblogs.com/JuneWang/p/3917697.html 为了更深入的学习TCP/IP协议,最近看了不少有关资料,收集整理记录如下,以备后面的使用和方便各位学 ...
- IP地址,子网掩码,默认网关,DNS服务器详解
为了更深入的学习TCP/IP协议,最近看了不少有关资料,收集整理记录如下,以备后面的使用和方便各位学习: IP地址,子网掩码,默认网关,DNS服务器是什么意思? (一) 问题解析 001. 问: ...
- Windows Server 2008 R2 DNS服务器迁移
一.实验模拟环境: Zhuyu公司有一个DNS服务器,因DNS服务器比较老旧,准备迁移至新的DNS服务器上(DNS备份也可以这么操作). 旧DNS服务器: 主机名: test-zhuAD ...
- 配置域从DNS服务器以及缓存DNS服务器
一.域从DNS服务器的作用 我们在之前上一篇随笔里有提到,DNS服务器一般有三种类型,一个是Primary DNS Server(主DNS服务器),一个是Secondary DNS Server(从D ...
- 如何配置DNS服务器(局域网——域名指向某个IP地址)
单击“开始”,指向“管理工具”,然后单击“DNS”,打开 DNS 管理器. 如有必要,向管理单元添加适用的服务器,然后连接该服务器.在控制台树中,单击适用的 DNS 服务器. 在“操作”菜单上 ...
- linux杂谈(十八):DNS服务器的配置(一)
原文地址: http://blog.chinaunix.net/uid-29622064-id-4242123.html 1.DNS服务器简介 域名系统(英文:Domain Name System,縮 ...
- 检查dns服务器是否可用
#%windir%\system32\WindowsPowerShell\v1.0\powershell.exe D:\PSScript\ERP_Production_Script\ERPRF_Upd ...
- Linux系统下搭建DNS服务器——DNS原理总结
2017-01-07 整理 DNS原理 域名到IP地址的解析过程 IP地址到域名的反向域名解析过程 抓包分析DNS报文和具体解析过程 DNS服务器搭建和配置 这个东东也是今年博主参见校招的时候被很多公 ...
- 使用bind实现主从DNS服务器数据同步
一.bind简介 Linux中通常使用bind来实现DNS服务器的架设,bind软件由isc(www.isc.org)维护.在yum仓库中可以找到软件,配置好yum源,直接使用命令yum instal ...
随机推荐
- Delphi下OpenGL2d绘图(01)-初始化
一.前言: Delphi默认支持OpenGl,可以uses OpenGL单元进行引用,便可以使用OpenGL的函数.OpenGl是跨平台的,而且Windows很早就支持并集成在系统中,存在于syste ...
- PHP学习8——图像处理
主要内容: 加载GD库 创建图像 绘制点,线,矩形,多边形,椭圆,弧线 绘制文字 通过GD库生成验证码 其实吧,学习图像方法的最大作用,好像就是为了制作验证码. 所以此专题,不如叫做制作验证码. 1. ...
- 第2天:JavaScript基础(运算符、案例、循环、冒泡以及prompt提示输入框)
一元运算在前在后的区别 加加 var num1 = 10; //++在后面 先参与运算 再自加1 var sum1 = num1++ +10; console.log("sum1的值:&qu ...
- log4js日志
安装log4js:npm install log4js express中配置log4js中间件: var log = require("./modules/utils/logUtil.js& ...
- poi-word导出,导出多图片到word
一.添加依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-scratc ...
- 小任务之Canvas绘制时钟
背景图的绘制(大圆.数字.小圆点) 掌握基础知识:圆的绘制(arc方法),关于圆的弧度的计算,数学中关于sin cos的用法 圆的弧度为2*Math.PI 12个数字分得弧度每个为2*Math.PI/ ...
- java unsupported major.minor version 51.0 解决
1.概述 出现如题所述异常 是因为jdk高版本 编译后的class文件 运行在低版本的jre环境下(如jdk7编译 运行在jdk6环境下) 2. 解决方案 在eclipse等ide中重新编译 指定编译 ...
- HDU4336:Card Collector(min-max容斥)
题面 传送门 Sol 方法一 直接状压就好了 # include <bits/stdc++.h> # define RG register # define IL inline # def ...
- 记录开发Nodejs c++ addon的一些经验(二、数据类型的转换(尤其是Buffer))
常见的数据类型的转换基本比较容易,结合nan应该不是一件难事 参考链接: http://blog.jobbole.com/109598/ http://deadhorse.me/nodejs/2012 ...
- 关于开发Cesium造成的电脑风扇狂飙的问题
最近在开发Cesium的项目,每次一打开浏览器渲染3D 模型.风扇就狂飙起来,进任务管理器查看发现集显使用率100%,独显使用率0%.使用的是集显进行渲染.怪不得风扇会飙起来.既然知道问题所在,解决的 ...