国内开源DNS--dnspod-sr
早之前在DNSPOD的官方博客里就看其开源了一款号称秒杀BIND的DNS软件---dnspod-sr 。做为国内最大的DNS解析商,自然其在DNS块有一定的造诣,不过这么久时间过去了,关于dnspod-sr 也只是零零散散的在一些网站上看到过互相转载抄袭的文章。也去过DNSPOD-sr在git 上的项目页,里需的wiki 并不太多内容,而目前由于在了解rhel7下的unbound,所以这里顺便在测试机上玩下dnspod-sr,做一下对比。
以下先引用下其在github上介绍,dnspod-sr 是一个运行在 Linux 平台上的高性能的递归 DNS 服务器软件,具备高性能、高负载、易扩展的优势,非 BIND 等软件可以比拟。其具有以下特性:
- 高性能,比所有流行的开源 DNS 软件性能高出2倍以上
- 安全,能抵御一般攻击 稳定,有效降低解析失败率
- 主动刷新缓存,响应速度更快
- 易于扩展,非常容易部署
- 防污染,能够正确解析被污染域名
先不看这个,我们先看下如何使用起来。
一、安装运行
1git clone https://github.com/DNSPod/dnspod-sr.git
2cd dnspod-sr
3cd src
4make
5./dnspod-sr
从其安装运行上来看,有点简陋
二、配置文件
在解开的根目录会有三个配置文件:records.z、root.z、sr.conf ,这个具体也可以查看源码:
1# more src/config.h
2#ifndef __CONFIG_H__
3#define __CONFIG_H__
4#define SR_CONFIG_FILE "../sr.conf"
5#define SR_ROOT_FILE "../root.z"
6#define SR_RECORDS_FILE "../records.z"
7#endif
1、sr.conf配置文件
sr.conf 默认为主配置文件,启动时自动会读取该配置文件的内容。其中主要分为xfer部分和log_path部分。xfer部分为特定域名指定DNS服务器,最后一行以:
结束。如下为一些外国网站指定了DNS为8.8.8.8(google DNS):
1googleusercontent.com.:8.8.8.8
2google.com.:8.8.8.8
3itil.com.:10.6.18.41
4facebook.com.:8.8.8.8
5twitter.com.:8.8.8.8
6flickr.com.:8.8.8.8
log_path部分用于指定日志文件的位置,按照默认配置没有日志生成。
2、records.z配置文件
该配置文件的做用暂未确认。
3、root.z 配置文件
该配置文件用于配置相关记录,如这里增加几台A记录,如下:
1abc.com. 86400 IN A 192.168.0.102
2www.abc.com. 86400 IN A 192.168.0.110
将别一台主机的DNS服务指定为运行dnspod-sr的主机IP后,ping上面两个域名 ,结果如下:
1[[email protected] ~]# ping abc.com
2PING abc.com (192.168.0.102) 56(84) bytes of data.
364 bytes from 192.168.0.102: icmp_seq=1 ttl=64 time=0.062 ms
464 bytes from 192.168.0.102: icmp_seq=2 ttl=64 time=0.068 ms
5[[email protected] ~]# ping www.abc.com
6PING www.abc.com (192.168.0.110) 56(84) bytes of data.
764 bytes from 192.168.0.110: icmp_seq=1 ttl=64 time=0.200 ms
864 bytes from 192.168.0.110: icmp_seq=2 ttl=64 time=0.309 ms
该配置文件中默认已有N条记录,这些记录可以删除,但不删除估计会增加解析速度。
4、forward转发
默认dnspod-sr 可以请求转发,当配置记录在内存hash表和root.z中都找不到时,会通过默认配置的上级DNS服务器查找 。默认上级DNS的配置见如下init.c 文件中,源代码如下:
1read_config(config, (char *)s->logpath, s->forward, g_nameservers);
2 // add default dns server 8.8.8.8, 114.114.114.114
3 if (g_nameservers[0] == NULL) {
4 assert(g_nameservers[1] == NULL);
5 g_nameservers[0] = strdup("8.8.8.8");
6 g_nameservers[1] = strdup("8.8.4.4");
7 }
8 if (g_nameservers[1] == NULL) {
9 if (strcmp(g_nameservers[0], "8.8.8.8") == 0) {
10 g_nameservers[1] = strdup("8.8.4.4");
11 } else {
12 g_nameservers[1] = strdup("8.8.8.8");
13 }
14 }
三、其他
其解析一个域名的原理思维图如下:
从DNSPOD官方博客来看其引入本地内存hash表缓存,可以加快本地解析速度 。其中几个支撑模块的做用分别如下:
- net:网络的各种操作接口,完成socket的相关操作和数据收发。
- storage:内存存储模块,为解析记录缓存和quizzer列表提供增、删、改、查功能支持。
- memory:内存池的相关操作接口,用于内存池的创建、分配和释放。
- io:物理读写模块,包括加载配置文件和记录日志等功能。
- datas:红黑树的相关实现接口,用于自动刷新即将过期的记录。
- utils:一些杂项操作接口都丢在这里了,如获取随机数据、大小写转换等操作
由于官方和wiki里找到的文档相当少,而本身对于C语言不是很了解。建议懂C语言的人可以看下源代码,代码并不多。但对于官方所宣称的性能较BIND、unbound牛X多少倍云云 。这个我们没必要去深究。从github上源代码更新的速度来看,将近一年左右没有什么代码更迭,感觉上应该又是一个阳痿的产品。
相较之前网上看到吹嘘多少还是有些失望,至少在生产环境上我不会选择dnspod-sr,考虑到官方文档的完备度、项目的发展持续性,个人的选择会是unbound — bind —- powerdns/mydns —- 最后才会考虑选择dnspod-sr 。
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/dnspod-sr/4674.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.