用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 ...
随机推荐
- 【c++】输出文件的每个单词、行
假设文件内容为 1. hello1 hello2 hello3 hello4 2. dsfjdosi 3. skfskj ksdfls 输出每个单词 代码 #include <iostream& ...
- 【HTML基础】表格和表单
本次博客的主要内容如下: meta和link 表格 表单 meta和link meta meta的属性有两种:name和http-equiv. name属性主要用于描述网页内容,对应与网页内容. 1. ...
- ddddddeeeessssssttttrrrrrrooooooyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
我遥远的 POI 计划啊 https://loj.ac/problems/search?keyword=POI2011 atcoder 一套 动态 DP SAM 随便看 XSY 的题 UOJ Roun ...
- Shell脚本之awk详解
一.基本介绍 1.awk: awk是一个强大的文本分析工具,在对文本文件的处理以及生成报表,awk是无可替代的.awk认为文本文件都是结构化的,它将每一个输入行定义为一个记录,行中的每个字符串定义为一 ...
- C#导入Excel|读取Excel方法
OleDbConnection读取 /// <summary> /// 返回Excel数据源 /// </summary> /// < ...
- 利用SqlDataAdapter进行分页
利用SqlDataAdapter进行记录分页 说到分页,很多地方都会用到,不管是windows程序还是web程序,为什么要进行分页?很简单,如果BlueIdea BBS帖子列表不分页的话,几十万条记录 ...
- MongoDb 学习笔记(一) --- MongoDb 数据库介绍、安装、使用
1.数据库和文件的主要区别 . 数据库有数据库表.行和列的概念,让我们存储操作数据更方便 . 数据库提供了非常方便的接口,可以让 nodejs.php java .net 很方便的实现增加修改删除功能 ...
- Java 基础(5)——数据转换 & 特殊的引用类型
数据转换 变量在第(3)篇中有讲到过八种数据类型,分别是能够用来表示整型的 byte.short.int.long 和表示浮点型的 float.double 以及字符型 char.布尔型 boolea ...
- SpringCloud实战之初级入门(三)— spring cloud config搭建git配置中心
目录 1.环境介绍 2.配置中心 2.1 创建工程 2.2 修改配置文件 2.3 在github中加入配置文件 2.3 修改启动文件 3. 访问配置中心 1.环境介绍 上一篇文章中,我们介绍了如何利用 ...
- JavaEE之servlet相关技术
相关技术:为了灵活实现的不同路径(/hello)执行不同的资源( HeIIoMyServlet)我们需要使用XML进行配置;为了限定XML内容,我们需要使用xml约束(DTD或schema);为了获得 ...