使用bind9搭建顶级域名NS(DNS服务器)(1)主服务器搭建、域名托管商设置

我们在购买一个顶级域名后,往往使用的是域名服务提供商的DNS解析服务。如果你想自己实现更加灵活的配置,又或者实现一些提供商需要付费的功能,就可以尝试自己搭建一个服务于本域的权威DNS服务器。

工作原理

基本术语

域名:形如 blog.mewwoof.cn 之类的,注意不同于“网址”,域名是网址的一部分,网址除了域名还包含开头的协议和后面的访问路径
顶级域名(TLD):形如 .cn, .com, .net 之类的,为最顶级的。别称:一级域名。
根域名:凌驾于顶级域名之上的最顶端的那个地方。想象一棵树,根域名就是那个主干,向上的第一次分叉为顶级域名。注意根域名表示为最后的一个点。日常使用中根域名常常被省略,比如你也可以使用https://blog.mewwoof.cn. 访问我的博客。
二级域名:即形如 mewwoof.cn 。但事实上,各个域名托管商都习惯将二级域名称为顶级域名,这篇博客同样也用顶级域名代指二级域名。毕竟我们没法主动搭建一个世界级的NS
域名托管商:卖域名的,同时也负责管这些域名。
顶级域名托管商:管 .cn, .com, .net 这些域名的机构,如CNNIC管理 .cn。ICANN只与顶级域名托管商联系,CNNIC又与国内各商业托管商联系。
CNNIC:中国互联网络信息中心
ICANN:世界上域名管理最高机构
NS:Name Server,名称服务器。
DNS:Domain Name Service. 注意NS才是真正提供DNS服务的那台服务器。DNS指的是一种服务。

参考文章:http://www.ruanyifeng.com/blog/2018/05/root-domain.html

DNS递归查询

众所周知,DNS的基本工作原理是递归查询。如查询www.mewwoof.cn,会先从根服务器查询cn的地址,然后再在cn服务器上查询mewwoof,再在mewwoof服务器上查询www的地址。

先不论DNS缓存服务、mDNS等。这也是非常简化的流程,省略了相当多的细节。事实上,流程并不如这么简单。一些常识告诉我们,显然告诉我们www.mewwoof.cn地址的服务器可以与mewwoof.cn服务器本身的地址不同。也就是说,mewwoof.cn的地址可以是123.123.123.123,而告诉我们www.mewwoof.cn地址的服务器地址可以是其他如234.234.234.234。

事实上,DNS有很多中记录,有记录ipv4地址的A记录、记录ipv6地址的AAAA记录、记录文本的TXT记录等,还有一个重要记录——NS记录,这个记录的是dns服务器的域名。DNS查询其实就是不断获取NS、A或AAAA记录的过程,直到获得最终域名的指定记录。

接下来我们来模拟一下事实上的DNS递归查询流程:

模拟请求返回
1从电脑内置配置文件中找根服务器
dig . NS
. 30997   IN      NS      g.root-servers.net.
2按照给出的NS域名查找,配置文件中有
dig g.root-servers.net. A
g.root-servers.net. 75553 IN A 192.112.36.4
3从根服务器查询 cn. NS记录
dig cn. NS @192.112.36.4
;; AUTHORITY SECTION:
cn. 172800 IN NS e.dns.cn.

;; ADDITIONAL SECTION:
e.dns.cn. 172800 IN A 203.119.29.1
4从cn.的NS查询 mewwoof.cn. NS记录
dig mewwoof.cn. NS @203.119.29.1
;; AUTHORITY SECTION:
mewwoof.cn. 86400 IN NS ns1.mewwoof.cn.

;; ADDITIONAL SECTION:
ns1.mewwoof.cn. 86400 IN A 39.108.4.111
5最后从mewwoof.cn.的NS查询 blog.mewwoof.cn A记录
dig blog.mewwoof.cn. A @39.108.4.111
;; ANSWER SECTION:
blog.mewwoof.cn. 3600 IN A 39.108.4.149

你可能还不能完全看懂这些返回的结果,不过不用担心,接下来我们会学习编写这些条目。

需要注意的是,查询NS记录时,服务器还会顺带返回这些记录的A或AAAA记录,否则会陷入死循环。如上面第4步,要查询ns1.mewwoof.cn的地址,就要查询mewwoof.cn的NS,但查询mewwoof.cn的NS,返回的结果又是ns1.mewwoof.cn,如此陷入死循环。

所以,根据DNS查询的工作原理,我们只需执行以下几个步骤,就能完成NS的搭建:
第一步,安装软件,编写配置,测试服务
第二步,通知域名托管商修改NS服务器,并填写相应IP地址,之后域名托管商会将你的NS信息同步到顶级域名托管商。

搭建主服务器

安装bind9

bind9基本配置

安装好bind9后,进入目录/etc/bind/,可以看到一些配置文件。

主配置文件/etc/bind/named.conf,保持默认即可:

include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.sites";

建议不要修改主配置文件,在options和sites配置文件中作自定义即可。

/etc/bind/named.conf.options,保持默认即可:

options {
        listen-on port 53 { any; };
        directory "/var/cache/bind";
        dnssec-validation auto;
        auth-nxdomain no;    # 注:RFC1035 https://bbs.csdn.net/topics/394071845
        listen-on-v6 { any; };
        allow-query-cache { none; }; # 不要缓存。加不加无所谓,因为默认就是这样
        recursion no; # 不要递归查询。加不加无所谓,我们不查询只响应
}

修改/etc/bind/named.conf.sites,bind9中将你的域名视为一个区域,称为”zone”:

zone "example.com" {
        type primary;     # 表示目前是主服务器
        file "/etc/bind/example.com.db";   # 指向等下要创建的区域解析文件
        allow-query {any;};
};

区域配置文件编写

刚刚就完成了bind9大体的配置,现在要给出区域解析文件。创建并编写/etc/bind/example.com.db文件。

在开始之前我们还是要学习一下这个文件的基本写法。我们先看一个简单的例子:

$ORIGIN example.com.

@                    IN SOA  ns1 root 1234567890 3H 15M 1D 30

@               3600 IN NS   ns1
ns1             3600 IN A    1.2.3.4
ns1             3600 IN AAAA 2001:2345::1
www             3600 IN A    123.123.123.123
                3600 IN AAAA 2001:2222::123
www2.example.com. 3600 IN A  123.123.123.124
_acme-challenge 3600 IN TXT  lalalalalalala
dkim._domainkey.mail 3600 IN TXT ("v=DKIM1; p=aaaaaaaaaaaaaaaaaaa"
    "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
    "ccccccccccccccccccccccccccccccc"
    "ddddddddddddddddddddddddddddddd" )

区域解析记录格式

每一条区域解析记录都是按照“域名 TTL 类型 资源类型 记录“组成。正如:

www             3600 IN A    123.123.123.123

www指的是域名。在区域解析文件中,若域名后未加根域名“.”,系统会默认在后面加上$ORIGIN中的内容。这里实际上是www.example.com.。使用“@”表示本域,即example.com。使用“*”表示所有子域,如*.example.com。

3600指的是有效时间,这个一般用来告诉缓存,超过这个时间,缓存的这条记录失效,应该重新向上游获取。区域解析文件中还可以用W、D、H、M这些时间单位。可以在文件开头定义$TTL,比如,如果设置$TTL 3600,那么下面所有的3600都可以省略。

IN我们一般保持默认,表示这是一个用于因特网的记录,其他类型的网络有其他写法。

A表示后面记录的类型,表示后面的记录为ipv4地址

123.123.123.123为记录。可以用括号跨行。

所有的条目都可以继承上一个域,如这样写是可以的:

www             3600 IN A    123.123.123.123
                3600 IN AAAA 2001:2222::123

记录类型

SOA记录

SOA记录是一个区域文件的灵魂。“Start of Authority”,即“权威记录的开始”,表明自己是权威的,是这个区域的掌门人。其记录有点特殊。格式如下:

zone      IN      SOA   Hostname  Contact (
                        SerialNumber
                        Refresh
                        Retry
                        Expire
                        Minimum )

zone表示哪个域,也可写完整:”example.com.”
Hostname表示存放这个域的域名服务器主机名,也可写完整:”ns1.example.com.”
Contact表示管理员联系方式(电子邮件),因为“@”容易被误解,所以用“.”来代替。也可只写个用户名省略后面的。如”root@example.com”写为“root.example.com.”,简写为”root”
SerialNumber为序列号,可以用于判断缓存数据新旧,更新数据后必须递增。32 位的任何整数(最大4294967295)
Refresh:辅助域名服务器多长时间更新数据库
Retry:辅助域名服务器更新数据失败时的重试时间
Expire:辅助域名服务器存储数据的失效时间
Minimum:设置被缓存的否定回答的存活时间(肯定回答存储于各个条目)

NS记录

NS记录除了刚刚所说的记录NS服务器之外,顺带地表示了对该NS服务器管理其子域的授权。就像一根接力棒,需要前面的运动员授权性地将接力棒交给下一位。

其他类型的记录就先不赘述了。可以参考https://www.jianshu.com/p/d1b653b60888

保存文件,启动bind9服务,打开防火墙udp53端口,使用dig尝试是否能正确解析。

dig www.你的域名 @你的ip地址

修改域名托管商设置

首先要向顶级域名注册你的自建NS,将你的NS服务器名称和对应IP地址存储到顶级域名的NS服务器中。这一步各个托管商方法不一样,Oray为例:

填写自建NS域名和对应IP地址

然后再在域名管理面板修改解析为我们自建服务器的域名:

填写自建NS域名

其他的托管商不清楚具体的操作流程,大家可以自己去找找。

阿里云:https://help.aliyun.com/document_detail/54157.html

完成后等待最多48小时,新的域名解析配置就能全球生效了。

发表评论