用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)
第一、在开启服务器时将内容全部加载到内存,这样可以去掉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#操作Redis String字符串
/// <summary> /// Redis String 操作 /// </summary> public static void Redis_String() { Red ...
- YII框架一个请求的生命周期
用户向入口脚本 web/index.php 发起请求. 入口脚本加载应用配置并创建一个应用实例去处理请求. 应用通过请求组件解析请求的路由. 应用创建一个控制器实例去处理请求. 控制器创建一个操作实例 ...
- VMware workstation 非正常关机导致开机失败,解决方法
问题:VMware workstation 非正常关机导致开机失败!如下图:
- Config 代码片段
class Config { private static Config _instance = null; public static Config Instance { get { if (_in ...
- 怎样在ado.net中存取excel和word呢?
办公软件指可以进行文字处理.表格制作.幻灯片制作.图形图像处理.简单数据库的处理等方面工作的软件.当然啦,这也包括了word.Excel以及PPT等.现在我们就一起来学习一下:怎样在ado.net中存 ...
- Make sure that the controller has a parameterless public constructor.
An error occurred when trying to create a controller of type 'CCD.Web.Controllers.TWAccountControlle ...
- C# 委托,事件, 异步
委托 委托可以说是方法的集合,里面放着方法列表,当调用的时候就会调用全部的方法列表 个人理解 : 当声明和创建时委托时, 它是个 对象 当使用委托,调用方法时,它是个 方法 声明委托类型 de ...
- 获取指定包名下继承或者实现某接口的所有类(扫描文件目录和所有jar)
import java.io.File; import java.io.FileFilter; import java.io.IOException; import java.net.JarURLCo ...
- laravel上传到七牛图片插件
1.首先引入两个插件 2.在https://developer.qiniu.com/kodo/sdk/1241/php找到安装命令 在终端运行composer require qiniu/php-sd ...
- sql: T-SQL 统计计算(父子關係,樹形,分級分類的統計)
---sql: T-SQL 统计计算(父子關係,樹形,分級分類的統計) ---2014-08-26 塗聚文(Geovin Du) CREATE PROCEDURE proc_Select_BookKi ...