Authoritative DNS Server -- http://gdnsd.org/
Overview
gdnsd is an Authoritative-only DNS server. The initial g stands for Geographic, as gdnsd offers a plugin system for geographic (or other sorts of) balancing, redirection, and service-state-conscious failover. The plugin system can also do things like weighted address/cname records. If you don't care about these features you can ignore them :).
gdnsd is written in C, and uses pthreads with libev and liburcu to attain very high performance, low latency service. It does not offer any form of caching or recursive service, and does not support DNSSEC. There's a strong focus on making the code efficient, lean, and resilient. The code has a decent regression testsuite with full branch coverage on the core packet parsing and generation code, and some scripted QA tools for e.g. valgrind validation, clang-analyzer, etc.
The geographically-aware features also support the EDNS Client Subnet spec from RFC 7871 for receiving more-precise network location information from intermediate shared caches.
Resources
Project site: https://gdnsd.org/
Release downloads: https://github.com/gdnsd/gdnsd/releases/
The code is hosted at Github: https://github.com/gdnsd/gdnsd/
Bug reports: https://github.com/gdnsd/gdnsd/issues
Wikified docs: https://github.com/gdnsd/gdnsd/wiki
Google Group for discussion: https://groups.google.com/forum/#!forum/gdnsd
See the INSTALL file for details on prerequisites and build procedure for working from the source tree or a source tarball.
The documentation is included in the source tree in POD format and installed as manpages and textfiles on installation.
from https://github.com/gdnsd/gdnsd
-------------------------------------------------
众所周知,天朝的网络环境,国内访问国外慢,同理国外访问国内也慢,所以我们很有必要搭建 CDN 并且使用 DNS 进行分区解析.
而国内比较知名的权威 DNS 服务商如 CloudXNS, DNSpod 他们免费版的 DNS 服务器都在国内,这样会造成国外的用户解析你的域名很慢,同理,如果使用国外的权威 DNS 服务商如 Cloudflare, AWS Route53, 他们的 DNS 服务器都部属在国外,国内访问基本要走美国节点,这样会造成国内的用户解析你的域名很慢,
所以我们需要选择一家对国内外速度都友好的webhost来托管你的权威 DNS 服务器,如果您没有找到合适的,我们这里推荐阿里云国际版.
以下安装步骤都在
首先,您需要在您的域名注册商注册 Name Servers. 由于每个注册商的控制面板不同,我们
进入您的域名管理页面,
分别注册
好了,到这里我们已经注册好 NS 服务器,接下来开始搭建 gdnsd.
如果加了 Backports 则可以使用
Debian 8.x 则是
记得检查系统或服务商的防火墙,我们需要打开的端口是 TCP / UDP 的 53 端口,请安装后检查服务商是否给您打开了这个端口,否则 DNS 是无法工作的
这里假设阁下的网站域名是
那我们的逻辑就是,当国内用户请求
首先登陆
gdnsd 需要有一个对应的
我们来一条一条解释
这里因为我们开启了监控,并且使用的插件是
这一段才是最重要的,也是本文的精髓所在,这里我们启用了 GeoIP 插件,设置的默认解析到国外的节点,国内用户对应一个
更多的 GeoIP 配置信息可以在 Github Wiki 页面中找到
这里默认设置的 TTL 是 86400 也就是一天,可以根据需要修改
接着需要创建
如果最后三行输出如下,即成功配置
首先,在 ns1 和 ns2 都安装 rsync
然后我们以 ns1 作为 master ,ns2 作为 slave ,每次修改 ns1 的文件并且自动同步到 ns2,以下命令均在 ns1 操作
生成 SSH Key
查看并复制公钥
把公钥的内容复制到 ns2 服务器的 ~/.ssh/authorized_keys 即可
然后执行同步
也可以写入 bash 脚本,比如
赋予权限
之后就可以直接执行脚本,不需要每次输入代码
另外这里还有肥猫写的更新 GeoIP 数据库的脚本
首先安装必要的 DNS 工具
Debian / Ubuntu 下
CentOS 下
然后我们使用
首先检测 NS 记录是否生效
检测
国内对应解析到
国外对应解析到
更多节点检测的话可以去 ping.chinaz.com 或 just-ping.com 查看全国以及全世界各地的解析情况
检测 DNS 是否生效的话可以使用 IntoDNS
如有疑问欢迎在下方留言,之后会详细介绍如何使阁下搭建的 gdnsd 服务完美符合 DNS RFC 标准.
-------------------------------------------------
Debian 使用 gdnsd 自建 DNS 服务并分区解析
gdnsd 是一款权威 DNS (Authoritative-only DNS)服务器软件,因为自带 GeoIP 插件,所以很适合自建 CDN 做分区解析,著名的喂鸡百科就是使用 gdnsd 进行全球 CDN 分区解析.众所周知,天朝的网络环境,国内访问国外慢,同理国外访问国内也慢,所以我们很有必要搭建 CDN 并且使用 DNS 进行分区解析.
而国内比较知名的权威 DNS 服务商如 CloudXNS, DNSpod 他们免费版的 DNS 服务器都在国内,这样会造成国外的用户解析你的域名很慢,同理,如果使用国外的权威 DNS 服务商如 Cloudflare, AWS Route53, 他们的 DNS 服务器都部属在国外,国内访问基本要走美国节点,这样会造成国内的用户解析你的域名很慢,
所以我们需要选择一家对国内外速度都友好的webhost来托管你的权威 DNS 服务器,如果您没有找到合适的,我们这里推荐阿里云国际版.
以下安装步骤都在
root
用户下完成,请自行使用 su
命令切换到 root
用户1、注册 DNS 服务器
假设您的 DNS 域名是 example.com ,购买并安装好了两台 NS 服务器,分别为ns1.example.com 对应 IPv4 192.0.2.2 IPv6 2001:DB8::2
ns2.example.com 对应 IPv4 192.0.2.3 IPv6 2001:DB8::3
进入您的域名管理页面,
分别注册
ns1
和 ns2
即可.好了,到这里我们已经注册好 NS 服务器,接下来开始搭建 gdnsd.
2、安装 gdnsd
Debian 9.x 自带的 gdnsd 已有编译好的版本,所以我们不需要编译安装,直接一条命令即可,同样适合 Debian 8.xapt-get install gdnsd
apt-get -t stretch-backports install gdnsd
apt-get -t jessie-backports install gdnsd
3、配置 gdnsd
gdnsd 的 Github Wiki 上已经提供了很详细的 config 以及 zonefile 配置,但是对新手来说坑比较多,由于我们的需求是根据国内外分区解析,所以这里我简单的提供一下本站的配置文件,感谢肥猫童鞋的细心指导这里假设阁下的网站域名是
example.org
国内服务器节点 IPv4 为 192.0.2.4
IPv6 为 2001:DB8::4
国外服务器节点 IPv4 为 192.0.2.5
IPv6 为 2001:DB8::5
那我们的逻辑就是,当国内用户请求
example.org
解析的时候, gdnsd 判断用户本地的 DNS 是否在国内,是的话解析到国内对应的服务器节点,如果不是,则默认解析到国外服务器节点,能理解这个逻辑以后我们就开始配置吧.首先登陆
ns1.example.com
ssh root@ns1.example.com
config
文件,需要自己创建,这里默认新建一个 /etc/gdnsd/config
文件,输入以下内容options => {
listen => any
dns_port => 53
chaos_response => "SBDNS"
}
service_types => {
example_monitor => {
plugin => http_status
ok_codes => [200, 301, 302, 403, 404]
vhost => example.org
url_path => /
}
}
plugins => { geoip => {
maps => {
china_map => {
geoip_db => GeoLiteCity.dat
datacenters => [default-dc, cn-dc]
map => {
AS => {CN => [cn-dc, default-dc]}
}
}
}
resources => {
example_org => {
map => china_map
service_types => example_monitor
dcmap => {
cn-dc => {
addrs_v4 => 192.0.2.4
addrs_v6 => 2001:DB8::4
},
default-dc => {
addrs_v4 => 192.0.2.5
addrs_v6 => 2001:DB8::5
},
}
}
}
}
}
options => {
listen => any
dns_port => 53
chaos_response => "SBDNS"
}
options
是 gdnsd 的配置选项,一般无特殊需求的话可以监听本机的所有 IP ,所以这里 listen
选的是 any
, DNS 服务器端口选默认的 53
,chaos_response
则是 DNS 返回的软件版本,可以自己随便指定个名字service_types => {
example_monitor => {
plugin => http_status
ok_codes => [200, 301, 302, 403, 404]
vhost => example.org
url_path => /
}
}
http_status
,如果不需要监控的话可以忽略plugins => { geoip => {
maps => {
china_map => {
geoip_db => GeoLiteCity.dat
datacenters => [default-dc, cn-dc]
map => {
AS => {CN => [cn-dc, default-dc]}
}
}
}
resources => {
example_org => {
map => china_map
service_types => example_monitor
dcmap => {
cn-dc => {
addrs_v4 => 192.0.2.4
addrs_v6 => 2001:DB8::4
},
default-dc => {
addrs_v4 => 192.0.2.5
addrs_v6 => 2001:DB8::5
},
}
}
}
}
}
datacenter
叫做 cn-dc
,只要 gdnsd 判断该用户是国内请求的解析,那么就返回我们设置的国内 IP ,否则就返回默认的国外节点,如果不需要 IPv4 则可以直接写cn-dc => 192.0.2.4
default-dc => 192.0.2.5
4、安装 GeoIP 数据库
我们的数据库使用的是 Maxmind 免费的 GeoLite City,大多数情况下也足够使用,下载和解压的命令如下cd /etc/gdnsd/geoip && wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz && gzip -df GeoLiteCity.dat.gz
5、配置 zonefile
首先,细心的读者肯定发现我们还没配置 DNS 域名example.com
所以新建一个 /etc/gdnsd/zones/example.com
文件,举例如下$TTL 86400
@ IN SOA ns1.example.com. hostmaster.example.com. (
1 ; serial
7200 ; refresh
900 ; retry
1209600 ; expire
10800 ; ncache
)
@ NS ns1.example.com.
@ NS ns2.example.com.
ns1 A 192.0.2.2
ns2 A 192.0.2.3
ns1 AAAA 2001:DB8::2
ns2 AAAA 2001:DB8::3
接着需要创建
/etc/gdnsd/zones/example.org
文件,举例如下$TTL 3600
@ IN SOA ns1.example.com. hostmaster.example.com. (
1 ; serial
7200 ; refresh
900 ; retry
1209600 ; expire
10800 ; ncache
)
@ NS ns1.example.com.
@ NS ns2.example.com.
@ DYNA geoip!example_org
www CNAME example.org.
6、检查 gdnsd 配置
一条命令即可gdnsd checkconf
# info: rfc1035: Loaded 71 zonefiles from '/etc/gdnsd/zones/'
# info: rfc1035: quiescence time is 3 seconds
# info: Configuration and zone data loads just fine
7、重启 gdnsd
如果修改了config
文件,那么我们则需要重启 gdnsd 服务,如果之后只是修改 zonefile 那么则无需这个步骤gdnsd restart
8、安装配置 ns2.example.com 并同步
由于 gdnsd 是个轻量级的 DNS 服务器,不带同步功能,所以您需要按照上面的步骤重新配置一次ns2.example.com
并且让他重启生效,为了今后方便同步,我们可以使用 rsync
来进行首先,在 ns1 和 ns2 都安装 rsync
apt-get install rsync
生成 SSH Key
ssh-keygen -t ed25519
id_ed25519.pub
cat ~/.ssh/id_ed25519.pub
然后执行同步
rsync -avz --delete /etc/gdnsd/ ns2.example.com:/etc/gdnsd/
sync.sh
CONFDIR=/etc/gdnsd
rsync -avz --delete $CONFDIR/ ns2.example.com:/etc/gdnsd/
chmod +x sync.sh
./sync.sh
geoip.sh
URL=http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
FILENAME=GeoLiteCity.dat.gz
DIR=/etc/gdnsd/geoip
cd $DIR; rm -f $FILENAME; wget $URL; gzip -df $FILENAME
9、修改域名 DNS 服务器
这个应该大多数读者会,直接去您的注册商把example.com
和 example.org
的 DNS 服务器设置为 ns1.example.com
和 ns2.example.com
并耐心等待生效10、测试生效
一般耐心等待一段时间(取决于您的旧 DNS 服务器 TTL 失效时间)后,我们自建的 gdnsd 已经生效,建议找一台国内的机器和国外的 Linux 机器来分别测试,Windows 下命令不好记,嘎嘎首先安装必要的 DNS 工具
Debian / Ubuntu 下
apt-get install dnsutils
yum install bind-utils
dig
命令来检测首先检测 NS 记录是否生效
root@debian ~ # dig NS example.com +short
ns1.example.com.
ns2.example.com.
A
记录或 AAAA
记录是否生效国内对应解析到
192.0.2.4
和 2001:DB8::4
root@china ~ # dig A example.com +short @223.5.5.5
192.0.2.4
root@china ~ # dig AAAA example.com +short @223.5.5.5
2001:DB8::4
192.0.2.5
和 2001:DB8::5
root@australia ~ # dig A example.com +short @8.8.8.8
192.0.2.5
root@australia ~ # dig AAAA example.com +short @8.8.8.8
2001:DB8::5
检测 DNS 是否生效的话可以使用 IntoDNS
如有疑问欢迎在下方留言,之后会详细介绍如何使阁下搭建的 gdnsd 服务完美符合 DNS RFC 标准.