smart dns openwrt,SmartDNS 服务器

  smart dns openwrt,SmartDNS 服务器

  智能dns

  使用场景

  Smartdns是用python语言编写并基于twisted框架实现的dns服务器,可以支持不同的dns请求根据配置返回不同的解析结果。Smartdns获取dns请求的源IP或客户端IP(支持edns协议的请求可以获取客户端IP),根据本地静态IP库获取被请求IP的特征,包括国家、省、市、ISP等。然后根据我们的调度配置返回解析结果。

  智能dns的使用场景:

  服务多室流量调度,比如电信流量调度到电信室,联通流量调度到联通室;

  用户访问控制,将用户调度到离用户最近或链路质量最好的节点。

  举个简单的例子,我们的一个站点,test.test.com,同时部署在中国电信和中国联通的两个机房。该站点在中国联通机房的ip是1.1.1.1,在中国联通机房的ip是2.2.2.2,这样该站点通过smartdns在判断源IP是中国电信的IP时可以返回1.1.1.1,在判断源IP是中国联通的IP时可以返回2.2.2.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代码支持解析和处理edns请求,都可以通过代码了解。Edns知识可以戳这里:dns支持edns-客户端-子网

  IPPool初始化

  Ip.csv内容格式如下:

  20000001,20000010,中国,陕西,xi,电信

  每个字段的含义是IP段起点、IP段终点、IP段国家、IP段省份、IP段城市和IP段ISP。

  A.yaml配置文件格式:

  test.test.com:

  ttl: 3600

  默认:5.5.5.52.2.2.2

  中国联通:中国广东省1.1.1.1 3.3.3.1市

  电信:中国1.1.1.2 3.3.3.2

  在中配置区域信息的关键字包括四个不同权重的字段:

  国家:8个

  省份:4个

  城市:2

  操作员:1

  在初始化阶段,会生成一个名为iphash的dict,具体数据结构如下:

  其中,iphash的键是ip.csv中每条记录的起始IP,值是一个列表,列表长度为6。列表的前五个字段分别是IP段截止日期、IP段国家、IP段省份、IP段城市和IP段ISP。第六个字段是hash,key是a.yaml中配置的域名,Value是一个长度为2的列表,iphash[IP segment start][6][domain name 1][0]是域名1在这个IP段的最优解析,iphash[IP segment start][6][domain name 1][1]是这个最优解析的总权重,暂时仅供参考。

  在iphash初始化的过程中,最关键的是iphash[IP段开始][6][域名1]最优解析的计算。最简单直接的方法是直接遍历域名1的所有调度配置,选择满足条件且总权重最高的解析,即为最优解析。这样,记录整个iphash的时间复杂度为O(xyz),X为ip.csv记录数,Y为域名总数,Z为每个域名的调度配置数。为了优化启动速度,优化了寻找最优解的方法:预先将每个域名调度配置生成一棵树,用dict模拟这棵树,这样在需要最优解时,不需要遍历所有调度配置,最多搜索15次就能找到最优解,即时间复杂度为O(15xy)。具体实现参考IPPool的LoadRecord和JoinIP两种方法。

  有了初始化的iphash数据结构,每次处理一个请求,只需要定位被请求IP所在的IP段,找到该IP段的初始IP,然后从iphash中取出最优的解析。取出最佳分辨率的过程是O(1)。具体流程如下:

  密码

  固定

  依赖性:

  Python 2.6或2.7

  扭曲12.2.0

  接口4.0.1

  安装:

  Git将smartdns克隆到本地路径,进入脚本目录,执行install_smartdns.sh在本地安装smartdns。同时,python环境及相关依赖项由virtualenv管理,不会影响系统环境。

  开始:

  进入smartdns的勤奋希望路径,执行sh run_dns.sh启动smartdns。

  试验

  测试当地挖test.test.com @ 127 . 0 . 0 . 1

  或者将内置的smartdns添加到测试域名的ns中进行测试。

  支持

  Github:听话的柠檬8

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: