当前位置: 首页 > 软件库 > 服务器软件 > DNS服务器 >

smartdns

基于 twisted 实现的智能 dns 系统
授权协议 未知
开发语言 Python
所属分类 服务器软件、 DNS服务器
软件类型 开源软件
地区 国产
投 递 者 傅英喆
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

smartdns 是 python 语言编写,基于 twisted 框架实现的dns server,能够支持针对不同的dns请求根据配置返回不同的解析结果。smartdns获取dns请求的源IP或者客户端IP(支持edns协议的请 求可以获取客户端IP),根据本地的静态IP库获取请求IP的特性,包括所在的国家、省份、城市、ISP等,然后根据我们的调度配置返回解析结果。

smartdns的使用场景:

  1. 服务的多机房流量调度,比如电信流量调度到电信机房、联通流量调度到联通机房;

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

举个简单的例子,我们的一个站点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记录的查询,支持DNS forward功能

性能

在虚拟机2.4G CPU上能够处理1000QPS查询请求,打开debug日志后可以到800QPS。3-5台dns server组成的集群已经能够满足大部分站点的需求。

目前我们正在实现和小流量测试go语言实现的smartdns,能够达到3wQPS以上,后续测试稳定后会开源出来,大家敬请期待:)

原理

smartdns响应dns请求的处理流程如下:

dns请求处理流程

IPPool类的初始化和该类中FindIP方法进行解析处理是smartdns中最关键的两个要素,这两个要素在下面详细介绍。其他的特性比如继 承twisted中dns相关类并重写处理dns请求的方法、升级twisted代码支持解析和处理edns请求等大家可以通过代码了解。edns知识可 以猛戳这里:DNS support edns-client-subnet

IPPool初始化

IPPool初始化流程

ip.csv内容格式如下:200000001, 200000010,中国,陕西,西安,电信

其中各个字段含义分别为 IP段起始,IP段截止,IP段所属国家,IP段所属省份,IP段所属城市,IP段所属ISP

a.yaml配置文件格式:

test.test.com:
  ttl: 3600
  default: 5.5.5.5 2.2.2.2
  中国,广东,,联通: 1.1.1.1 3.3.3.1
  中国,广东,,电信: 1.1.1.2 3.3.3.2

配置中地域信息的key包括四个字段,分别带有不同的权重:

  • 国家:    8

  • 省份: 4

  • 城市: 2

  • 运营商:  1

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

iphash数据结构

其中,iphash的key为ip.csv每一条记录的起始IP,value为一个list,list长度为6,list前5个字段分别为以该 key为起始IP记录的IP段截止、IP段所属国家、IP段所属省份、IP段所属城市、IP段所属ISP,第六个字段是一个hash,key为 a.yaml里面配置的域名,value为长度为2的list,iphash[IP段起始][6][域名1][0]为域名1在该IP段的最优解 析,iphash[IP段起始][6][域名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)的。具体流程如下:

ippool的findip方法

  • SmartDNS是一个运行在本地的DNS服务器,SmartDNS接受本地客户端的DNS查询请求,从多个上游DNS服务器获取DNS查询结果,并将访问速度最快的结果返回给客户端,提高网络访问速度。 同时支持指定特定域名IP地址,并高性匹配,达到过滤广告的效果。 与dnsmasq的all-servers不同,smartdns返回的是访问速度最快的解析结果。 (详细差异请看FAQ) 支持树莓派,openw

  • 简介 SmartDNS是一个运行在本地的DNS服务器,SmartDNS接受本地客户端的DNS查询请求,从多个上游DNS服务器获取DNS查询结果,并将访问速度最快的结果返回给客户端,提高网络访问速度。 同时支持指定特定域名IP地址,并高性匹配,达到过滤广告的效果。 与dnsmasq的all-servers不同,smartdns返回的是访问速度最快的解析结果。 (详细差异请看FAQ) 支持树莓派,op

  • yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager  --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum install docker-ce docker-ce-cli containe

  • centos8安装docker使用smartdns+adguardhome,完美高效加速dns和去广告。 centos 8.0 64位安装教程略,mini最小安装即可,加上systembase。 以下命令复制粘贴即可: #安装依赖 yum install -y yum-utils device-mapper-persistent-data lvm2 #安装docker yum-config-ma

  • 交叉编译环境配置,使用PandoraBox提供的SDK:apt install build-essential -y wget https://downloads.pangubox.com/pandorabox/18.10/targets/ralink/mt7621/PandoraBox-SDK-ralink-mt7621_gcc-5.5.0_uClibc-1.0.x.Linux-x86_64.t

  • smart安装链接 [https://github.com/pymumu/smartdns/releases](https://github.com/pymumu/smartdns/releases) wget https://github.com/pymumu/smartdns/releases/download/all-best-ip/smartdns.1.2022.05.03-1046.x

 相关资料
  • 本文向大家介绍基于JavaScript实现智能右键菜单,包括了基于JavaScript实现智能右键菜单的使用技巧和注意事项,需要的朋友参考一下 通过本文给大家介绍智能右键菜单,需要引入的文件再文末会给出,先给大家展示下代码: 具体代码如下所示: $('th') 指定加右键的标签,根据实际来确定 我这里是加在表格的表头上,所以是th标签 e.which = 3 表示是右键 这里列出了两种情况 一种是

  • 本文向大家介绍Python基于twisted实现简单的web服务器,包括了Python基于twisted实现简单的web服务器的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python基于twisted实现简单的web服务器,分享给大家供大家参考。具体方法如下: 1. 新建htm文件夹,在这个文件夹中放入显示的网页文件 2. 在htm文件夹的同级目录下,建立web.py,web.py的内

  • 本文向大家介绍基于jquery实现智能表单验证操作,包括了基于jquery实现智能表单验证操作的使用技巧和注意事项,需要的朋友参考一下 很多网站的注册模块都可以实现即时检查格式是否正确,这样极大的增强了用户体验,对开发非常有利。 先给大家展示下表单效果图,具体效果如下所示: 1.前台一开始用JQuery实现,先来上HTML标记: 2,是CSS代码: 3.编写JQUery代码前需要引入JQuery支

  • 本文向大家介绍基于JavaScript实现抽奖系统,包括了基于JavaScript实现抽奖系统的使用技巧和注意事项,需要的朋友参考一下 用JavaScript实现一个简单的抽奖系统,有【开始】按钮和【停止】按钮。 功能: - 点开始按钮开始抽奖,随机出现奖品名称; - 点停止按钮即可停止抽奖; - 按下回车键可切换开始抽奖和停止抽奖。 html代码: 创建html结构,最基础的要含有显示的奖品名称

  • 我们迄今为止看到的模型可能具有“基于规则”的特征,因为它们涉及受简单规则支配的系统。 在本章和以后的章节中,我们将探索基于智能体(agent)的模型。 基于智能体的模型包含智能体,它旨在模拟人和其他实体,它们收集世界的信息,制定决策并采取行动。 智能体通常位于空间或网络中,并在本地彼此交互。 他们通常有不完整的,不全面的世界信息。 智能体之间经常存在差异,而不像以前的所有模型,它们的所有成分都相同

  • 本文向大家介绍基于java swing实现答题系统,包括了基于java swing实现答题系统的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了java swing实现答题系统的具体代码,供大家参考,具体内容如下 如上图所示,代码亲测可用,如下: 更多学习资料请关注专题《管理系统开发》。 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。