dnsmasq github,开源dns管理系统
智能DNS
使用场景
Smartdns是用python语言编写的,基于twisted框架实现的dns服务器。根据不同dns请求的配置,支持不同的分析结果。Smartdns获取dns请求的源IP或客户端IP(客户端IP是支持dns协议的请求),基于本地静态IP库,基于调度,获取被请求IP的特征(如国家、州、城市、ISP)。
智能dns使用场景:
多个房间的服务调度,例如将通信业务调度到通信房间或者将通信业务调度到通信房间。
用户访问控制将用户调度到离用户最近或链路质量最高的节点。
举个简单的例子,我们的网站test.test.com同时部署在电信和联通的两个机房。这个网站的ip地址是电信机房的1.1.1.1和联通机房的2.2.2.2。当该网站的域名通过smartdns解析后,当源ip判断为电信ip时,可以返回给1.1.1.2。
支持的功能
支持查询A、SOA和NS记录,支持d NS前端功能
表演
虚拟机的2.4G CPU可以处理1000QPS的查询请求,调试日志可以达到800QPS。一个由3-5台DNS服务器组成的集群现在可以满足大多数站点的需求。
现在已经实现了小流量测试的go语言和smartdns,可以达到3wQPS以上。后续测试稳定后会变成开源,敬请期待:)
原则
smartdns响应dns请求的过程如下。
IPPool类的初始化和基于该类的FindIP方法的分析处理是smartdns中最重要的两个要素。这两个元素将在下面详细解释。您可以了解代码中的其他特性,例如继承twisted的dns相关类,重写处理dns请求的方法,升级twisted代码以支持e dns请求的解析和处理等。Edns知识可以戳这里:dns支持edns-client-subnet
IPPool初始化
ip.csv的内容格式如下:
2000001,2000010,中国,陕西,xi,电信
每个字段的含义是IP段起始、IP段结束、IP段国家、IP段省份、IP段城市、IP段ISP。
A.yaml配置文件格式:
test.test.com:
ttl: 3600
缺省值
3.3.3.1、1.1.1.1、中国、广东和中国联通
3.3.3.2、1.1.1.2、中国、广东和电信
中的配置区域信息的关键字包含四个字段,每个字段具有不同的权重。
国家:8个
省份:4个
城市:2
操作员:1
在初始化阶段,会生成一个名为iphash的dict。具体数据结构如下图所示。
其中,iphash的关键字是ip.csv的每条记录的起始IP,值是一个列表,列表的长度是6。列表的前五个字段以此键开头,表示IP记录的IP段截断、IP段所属城市的IP设置、ISPIP段所属的地址。第六个字段是值为2的列表;混合IP列[IP段开始][6][域名1][0]是该IP段中域名1的第一个字段。
IP hash初始化过程中最重要的是计算IP hash的最佳解析[IP段开始][6][域名1]。最简单直接的方法就是直接遍历域名1的所有调度配置,选择满足条件且总权重最高的方案。该方法中,IP洗牌的整体时间复杂度取为o(XYZ),X取为ip.csv记录数,Y取为域名总数,Z取为每个域名要记录的调度结构数。为了优化启动速度,对寻找最优解的方法进行了优化。生成一棵树,通过dict提前模拟每个域名的调度配置。如果需要优化方案,最多搜索15次就能得到最好的结果,即时间复杂度为o(15xy),而不用遍历所有调度配置,参考IPPool。
利用初始化的IP散列数据结构,每当处理请求时,o(1)确定所请求的IP在哪个IP段中,找到IP段的报头IP,从IP散列中检索最佳分析,并检索最佳分析。具体流程如下。
密码
固定
依赖性:
Python 2.6或2.7
扭转12.2.0
接口4.0.1
安装:
将git克隆smartdns移动到本地路径,移动到脚本目录,然后运行install_smartdns.sh,在不影响系统环境的情况下,管理与python环境相关的依赖关系。
开始:
进入rou
测试当地挖test.test.com @ 127 . 0 . 0 . 1
或者将内置的smartdns添加到测试域名的ns中进行测试。
支持
github: xhdty8
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。