本文介绍如何在Ubuntu环境中使用Bind9搭建权威DNS服务器。
1、安装Bind9
ubuntu@ubuntu:~$ sudo apt-get install bind9
2、配置Bind9
编辑/etc/bind/named.conf文件内容为:
include "/etc/bind/named.conf.options"; include "/etc/bind/named.conf.local"; include "/etc/bind/named.conf.default-zones";
编辑/etc/bind/named.conf.options文件内容为
options { directory "/var/cache/bind"; allow-query { any; }; # 允许任何主机从服务器获取信息 recursion no; # 权威DNS服务器一定要禁用递归查询 version none; hostname none; server-id none; datasize default; auth-nxdomain no; # conform to RFC1035 // 指定要监听的端口和地址,例如listen-on port 53 { 127.0.0.1; }; listen-on { any; }; listen-on-v6 { any; }; };
编辑/etc/bind/named.conf.local文件内容为:
include "/etc/bind/zones.rfc1918"; zone "example.com." { # 要解析的域名 type master; file "/etc/bind/example.com.zone"; # 区域文件,一定要用绝对路径 }; # 不要忘了分号
检查/etc/bind/named.conf文件的语法:
ubuntu@ubuntu:~$ named-checkconf
编辑/etc/bind/example.com.zone文件(区域文件)内容为:
$TTL 300 $ORIGIN example.com. ; SOA record ; name class type nameserver contact (sn ref ret ex min) @ IN SOA ns1.example.com. admin.example.com. ( 2017031088 ; serial number 3600 ; refresh 180 ; update retry 1209600 ; expiry 300 ; nxdomain ttl ) ; [name] [ttl] [class] type data ; NS records @ 36000 IN NS ns1.example.com. @ 36000 IN NS ns2.example.com. ; A records or CNAME records ns1 3600 IN A 202.*.*.* ns2 3600 IN A 202.*.*.* @ 300 IN A 202.*.*.* www 300 IN A 202.*.*.* test 300 IN CNAME test.example.com.c.cdnhwc1.com.
检查/var/named/example.com.zone区域文件的语法:
# named-checkzone example.com /var/named/example.com.zone
3、Bind9区域文件格式
区域文件定义了一个域名的解析规则,由若干资源记录(RR,resource records)和分析器指令组成。RR的顺序为:SOA RR 应该放在最前面,NS RR 紧跟其后,其他 RR 的顺序无关紧要。分析器指令用于为 RR 的输入提供方便,例如,$ORIGIN 用于设置默认域(或初始域),$TTL 用于为 RR 定义缺省的 TTL 值。
- SOA RR 格式
; name class type namesever contact (sn ref ret ex min)
name字段用于说明 RR 引用的对象名,一般为相对域名或全域名,全域名应该以字符”.”结束,一般用字符”@”表示主域名。class字段用于指定网络类型,可选的值有包括 IN、CH 和 HS,其中 IN (Internet)是该字段的默认值,但通常会显示地指出。type字段用于说明 RR 的类型,可选的值包括SOA、NS、A、CNAME等。namesever字段用于存放该区域的名称服务器的主机名。contact字段用于存放管理该区域的管理员的邮件地址,由于字符”@”在区域文件中有特殊含义,因此需要用字符”.”替代。
sn – serial number,序列号,可以是 32 位的任意整数。每当更新区域文件时都应该增加此序列号的值,否则 bind9 不会把该区域的更新数据传送到从服务器。
ref – refresh,刷新间隔,设置从服务器多长时间向主服务器查询以更新数据。每次查询时,从服务器会向主服务器请求SOA记录,若发现记录中的序列号改变,会向主服务器请求传送域名的当前数据。
ret – retry,重试间隔,设置从服务器更新数据失败之后多长时间再次尝试更新。
ex – expire,过期时间,设置从服务器无法更新数据时已有数据多长时间失效。
min – minimum ttl,最小缓存时长,设置否定回答(NXDOMAIN)的缓存时长,肯定回答的默认缓存时长可以在区域文件开始处使用 $TTL 语句进行设置。
- 其他 RR 格式
[name] [ttl] [class] type data
name、class、type三个字段的格式同 SOA RR 格式。ttl字段用于定义该 RR 缓存时长,通常省略该字段,而是在区域文件开始处使用 $TTL 语句设置缺省值。data字段取决于 RR 的类型,一般为具体的IP地址或域名。
其中,type字段值为 NS 的资源记录用于标识一个域的权威DNS服务器,包括主服务器和从服务器。
4、启动Bind9并测试
ubuntu@ubuntu:~$ sudo service bind9 start ubuntu@ubuntu:~$ dig @localhost example.com
5、注册权威DNS服务器
权威DNS服务器需要在域名注册商那里注册之后才能真正作为权威 DNS 服务器来使用,不同域名注册商步骤不一,这里以freenom为例。
首先,在freenom上注册glue records,添加主从名称服务器:
然后,在freenom上自定义名称服务器,设置为glue records的值:
按理说,我们设置的权威DNS服务器应该可以正常工作了。但实际并非如此,使用dig example.com解析无法成功,使用dig example.com +trace发现失败原因是名称服务器找不到地址。这可能是因为没有成功注册glue records,尽管freenom平台上显示成功注册了。
因此需要曲线救国,使用另一个域名test.com,将ns1.test.com和ns2.test.com的A记录设置为我们配置的权威DNS服务器IP地址:
然后在freenom上自定义名称服务器,设置为ns1.test.com和ns2.test.com,解析成功。