前言
DNS(Domain Name Server,域名服务器)是进行域名(domain name)和与之相对应的IP地址 (IP address)转换的服务器。DNS中保存了一张域名(domain name)和与之相对应的IP地址 (IP address)的表,以解析消息的域名。 域名是Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。域名是由一串用点分隔的名字组成的,通常包含组织名,而且始终包括两到三个字母的后缀,以指明组织的类型或该域所在的国家或地区。
概述
域名
域名:域名是Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。域名是由一串用点分隔的名字组成的,通常包含组织名,而且始终包括两到三个字母的后缀,以指明组织的类型或该域所在的国家或地区。
域名解析:
域名解析是指将域名解析为IP的过程。简单来说,DNS就像是一个通讯录,AnyISalIn的电话是1829888,有了通讯录,我们只需通过输入AnyISalIn这个名字就能够自动拨打其电话。DNS主要是用来定义
FQDN:完整主机名。
正向解析 FQDN ---> IP
反向解析 IP--->FQDNIP地址和域名的关系。
DNS资源记录类型
SOA:起始授权记录,一个区域的解析库中有且只能有一条SOA记录,必须为解析库中的第一条记录,定义主DNS服务器地址和相关事件时间定义。
A :实现FQDN---->IPV4
AAAA:FQDN------>IPV6
MX:标明提供邮件服务的主机
NS:标明当前域内的DNS服务器
AAAA:FQDN ==> IPv6
CNAME:Canonical Name,别名记录
PTR:IP ==> FQDN
DNS解析答案类型
肯定答案:正确解析了请求的内容
否定答案:请求的条目不存在等原因无法返回结果
权威答案:通过迭代的方式从所查询域名的所在域的DNS服务器返回的结果
非权威答案:请求的DNS服务器缓存的结果
DNS资源记录定义方法
A记录:IP IN A Value ; 示例:192.168.1.1 IN A www.anyisalin.com.
NS记录:domain IN NS Value; 示例:anyisalin.com. IN NS ns1.anyisalin.com. #一条NS记录必须要有一条与之对应的A记录
MX记录:domain IN NS priority Value; 示例:anyisalin.com. IN MX 10 mail1.anyisalin.com. #一条MX记录必须要有与之对应的A记录, 优先级0-99,越低优先级越高
PTR记录:IP.in-addr.arpa. IN PTR Value; 示例:1.1.168.192.in-addr.arpa. IN PTR www.anyisalin.com. #PTR记录的写法比较诡异,我们在后面进行叙述
AAAA记录:和A记录相似,只是将IPv4地址换为IPv6
(二)DNS域名结构
DNS域名结构
根域 ,一级域名,二级域名....... 最多27级域名
域名查询
递归查询
递归查询是将查询的封包发送出去问,就等待正确名称的正确响应,这种方式之处理响应回来的封包是否正确响应或是说是找不到该名称的错误信息。
迭代查询
(三) BIND安装和基础配置
前面我们介绍了DNS的一些基础知识,但是DNS是一种模型,需要使用软件去实现。BIND(Berkeley Internet Name Domain)就是一伴随着DNS出生到现在的软件。
安装bind
yum install -y bind bind-utils
修改配置文件:
vim /etc/named.conf #/etc/named.conf 里面有一些默认的配置,先不用管,只要改一下我们需要的配置即可
options {
listen-on port 53 { 192.168.1.80; };
listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
allow-query { 192.168.1.80; };
......
将listen-on 改成本地的IP
将allow-query 添加本地的IP
配置正向解析
在 /etc/named.rfc1912.zones 里面定义一个Zone (注:原来的默认文件先不用管,直接在文件的末尾添加即可)
zone "deepnet.com" IN {
type master;
file "deepnet.com.zone";
};
其中的zone文件(deepnet.com.zone)描述了域名服务器中包含的主机,所提供的服务类型等信息,BIND通过将zone文件中的信息加载到内存数据结构中并有效组织起来,然后对外部的DNS请求提供验证和查询请求。需要注意的是,zone文件的格式不是由BIND制定的,而是DNS标准文档制定的(见RFC1035)。
创建区域解析库文件。
$TTL 600
$ORIGIN deepnet.com.
@ IN SOA ns1.deepnet.com. admin.deepnet.com. (
20181207 ;序列号
1H ;刷新时间
5M ;重试时间
1W ;超时时间
10M ;否定答案缓存TTL值
)
IN NS ns1
ns1 IN A 192.168.1.80
IN MX 10 mail1
mail1 IN A 192.168.1.141
www IN A 192.168.1.142
cname IN CNAME www
deepnet.com.:这是区域的根。这表明该区域文件用于 deepnet.com 域名。通常,你会看到这个用 @ 代替,它只是一个占位符,表示我们之前定义的 $ORIGIN 变量的内容。
IN SOA:”IN” 部分表示互联网(它会出现在许多记录中)。 SOA 是表示这是开始权限记录。
ns1.deepnet.com.:这定义了该域的主名称服务器。名称服务器可以是主服务器或从服务器,如果配置了动态 DNS,就像这里,则一个服务器需要是 “主服务器”。如果你未配置动态 DNS,那么这只是你其中一个主名称服务器。
admin.deepnet.com.:这是这个区域文件管理员的邮箱地址。邮箱地址的 @ 这里用一个 . 代替。如果你的名字中也有 . 它会用 \ 代替。(比如 your.name@deepnet.com变成 your\name@deepent.com
20181207:这是区域文件的序列号。每次编辑区域文件时,必须增加此序列号以使区域文件能够正确传播。从服务器将检查主服务器的区域序列号是否大于它们在系统上的序列号。如果是,它请求新的区域文件,如果不是,它继续服务原始文件。
1h:这是区域的刷新间隔。这是从服务器向主服务器轮询检查区域文件是否变更之间等待的时间量。
5m:这是此区域的重试间隔。如果从机在刷新周期结束时无法连接到主机,则它将等待此时间并重试轮询主机。
3w:这是到期时间。如果从服务器在此时间内无法与主服务器联系,则它不再作为此区域的权威来源的返回响应。
1oM:这是名称服务器在此文件中找不到所请求的名称时缓存找不到结果的时间量。
IN NS ns1
ns1 IN A 192.168.1.80:表示该zone配置了一个ns1.deepnet.com的域名,该域名的ip是192.168.1.80
IN MX 10 mail1
mail1 IN A 192.168.1.141 该zone配置了一个邮件服务器,域名是mail1.deepnet.com,IP地址是192.168.1.141
www IN A 192.168.1.142 该zone配置了一个对外的万维网服务器,域名www.deepnet.com,IP地址为www.deepnet.com ,别名为cname.deepnet.com
启动测试服务
systemctl start named
dig -t A www.deepnet.com @192.168.1.80
; <<>> DiG 9.9.4-RedHat-9.9.4-72.el7 <<>> -t A www.deepnet.com @192.168.1.80
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33382
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.deepnet.com. IN A
;; ANSWER SECTION:
www.deepnet.com. 600 IN A 192.168.1.142
;; AUTHORITY SECTION:
deepnet.com. 600 IN NS ns1.deepnet.com.
;; ADDITIONAL SECTION:
ns1.deepnet.com. 600 IN A 192.168.1.80
;; Query time: 0 msec
;; SERVER: 192.168.1.80#53(192.168.1.80)
;; WHEN: Mon Dec 10 19:25:36 CST 2018
;; MSG SIZE rcvd: 94
配置反向解析
在 /etc/named.rfc1912.zones 里面定义一个Zone (注:原来的默认文件先不用管,直接在文件的末尾添加即可)
zone "1.168.192.in-addr.arpa" IN {
type master;
file "1.168.192.zone";
};
配置/var/named/1.168.192.zone 文件
$TTL 600
@ IN SOA ns1.deepnet.com. admin.deepnet.com. (
20181207 ;序列号
1H ;刷新时间
5M ;重试时间
1W ;超时时间
10M ;否定答案缓存TTL值
)
IN NS ns1.deepnet.com.
IN MX 10 mail1.deepnet.com
80 IN PTR ns1.deepnet.com.
141 IN PTR mail1.deepnet.com.
142 IN PTR www.deepnet.com.
80 IN PTR ns1.deepnet.com. 表示192.168.1.80这个地址会解析到ns1.deepnet.com.
141 IN PTR mail1.deepnet.com. 表示192.168.1.141这个地址会解析到mail1.deepnet.com.
142 IN PTR www.deepnet.com. 表示192.168.1.142这个地址会解析到www.deepnet.com.
启动测试服务
systemctl restart named
dig -x 192.168.1.142 @192.168.1.80
; <<>> DiG 9.9.4-RedHat-9.9.4-72.el7 <<>> -x 192.168.1.142 @192.168.1.80
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14139
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;142.1.168.192.in-addr.arpa. IN PTR
;; ANSWER SECTION:
142.1.168.192.in-addr.arpa. 600 IN PTR www.deepnet.com.
;; AUTHORITY SECTION:
1.168.192.in-addr.arpa. 600 IN NS ns1.deepnet.com.
;; ADDITIONAL SECTION:
ns1.deepnet.com. 600 IN A 192.168.1.80
;; Query time: 1 msec
;; SERVER: 192.168.1.80#53(192.168.1.80)
;; WHEN: Mon Dec 10 19:33:57 CST 2018
;; MSG SIZE rcvd: 118
(四) 主从服务器的配置
从服务器配置
从服务器的配置就比较简单了,首先同样在/etc/named.conf配置ip,然后在/etc/named.rfc1912.zones 配置文件下增加如下配置:
zone "deepnet.com" IN {
type slave;
file "slaves/deepnet.com.zone";
masters{192.168.1.80;};
};
zone "1.168.192.in-addr.arpa" IN {
type slave;
file "slaves/1.168.192.zone";
masters{192.168.1.80;};
};
启动服务验证
systemctl restart named
dig -t A www.deepnet.com @192.168.1.143
; <<>> DiG 9.9.4-RedHat-9.9.4-37.el7.centos <<>> -t A www.deepnet.com @192.168.1.143
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 22251
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.deepnet.com. IN A
;; ANSWER SECTION:
www.deepnet.com. 600 IN A 192.168.1.142
;; AUTHORITY SECTION:
deepnet.com. 600 IN NS ns1.deepnet.com.
;; ADDITIONAL SECTION:
ns1.deepnet.com. 600 IN A 192.168.1.80
;; Query time: 0 msec
;; SERVER: 192.168.1.143#53(192.168.1.143)
;; WHEN: Mon Dec 10 20:23:00 CST 2018
;; MSG SIZE rcvd: 94
dig -x 192.168.1.142 @192.168.1.143
; <<>> DiG 9.9.4-RedHat-9.9.4-37.el7.centos <<>> -x 192.168.1.142 @192.168.1.143
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53397
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;142.1.168.192.in-addr.arpa. IN PTR
;; ANSWER SECTION:
142.1.168.192.in-addr.arpa. 600 IN PTR www.deepnet.com.
;; AUTHORITY SECTION:
1.168.192.in-addr.arpa. 600 IN NS ns1.deepnet.com.
;; ADDITIONAL SECTION:
ns1.deepnet.com. 600 IN A 192.168.1.80
;; Query time: 0 msec
;; SERVER: 192.168.1.143#53(192.168.1.143)
;; WHEN: Mon Dec 10 20:23:25 CST 2018
;; MSG SIZE rcvd: 118
主从同步数据的安全性
DNS服务器的数据同步默认是没有限定主机的,也就是说,网络上只要有一台DNS服务器向你的DNS服务器请求数据,都能实现数据同步,那么这样就相当的不安全了。我们可以使用一个选项allow-transfer,指定可以同步数据的主机IP。主DNS服务器的数据可以给别的服务器同步,相对的,辅助DNS服务器的数据也是可以给其它辅助DNS服务器同步,于是,所有的主从DNS服务器都要设置该参数。
修改主服务器上的/etc/named.rfc.1912.zones 文件
zone "deepnet.com" IN {
type master;
file "deepnet.com.zone";
allow-transfer{192.168.1.143;};
};
zone "1.168.192.in-addr.arpa" IN {
type master
file "1.168.192.zone";
allow-transfer{192.168.1.143;};
};
重启服务用dig测试
systemctl restart named
dig -t axfr deepnet.com @192.168.1.143
; <<>> DiG 9.9.4-RedHat-9.9.4-72.el7 <<>> -t axfr deepnet.com @192.168.1.143
;; global options: +cmd
deepnet.com. 600 IN SOA ns1.deepnet.com. admin.deepnet.com. 20181207 3600 300 604800 600
deepnet.com. 600 IN NS ns1.deepnet.com.
cname.deepnet.com. 600 IN CNAME www.deepnet.com.
mail1.deepnet.com. 600 IN A 192.168.1.141
ns1.deepnet.com. 600 IN MX 10 mail1.deepnet.com.
ns1.deepnet.com. 600 IN A 192.168.1.80
www.deepnet.com. 600 IN A 192.168.1.142
deepnet.com. 600 IN SOA ns1.deepnet.com. admin.deepnet.com. 20181207 3600 300 604800 600
;; Query time: 1 msec
;; SERVER: 192.168.1.143#53(192.168.1.143)
;; WHEN: Mon Dec 10 20:47:25 CST 2018
;; XFR size: 8 records (messages 1, bytes 219)
在从服务器修改配置如下:
zone "deepnet.com" IN {
type slave;
file "slaves/deepnet.com.zone";
masters{192.168.1.80;};
allow-transfer{none};
};
zone "1.168.192.in-addr.arpa" IN {
type slave;
file "slaves/1.168.192.zone";
masters{192.168.1.80;};
allow-transfer{none};
};
(五)子域授权
什么是子域
每一个大域,里面都会有若干个小域。比如deepnet.com就是一个大域,里面会有www域(即www.deepnet.com),会有bbs域,会有movies域,会有data域等等等等。如果土豪企业或个人,可以不用域名服务商提供的DNS服务器,而自己搭建企业DNS服务器,但是需要把自己的DNS服务器的NS指向域名服务商的DNS服务器。如果这个企业壕的过分,壕的惨无人道。可以专门给自己的子域配上DNS服务器。
父域服务器配置
在服务器下的/var/named/deepnet.com.zone文件下增加如下配置:
blog.deepnet.com. IN NS dns.blog.deepnet.com.
dns.blog.deepnet.com. IN A 192.168.1.82
子域服务器配置(192.168.1.82)
在子域(82)服务器上修改配置文件/etc/named如下:
vim /etc/named.conf #/etc/named.conf
options {
listen-on port 53 { 192.168.1.82;192.168.1.80; };
listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
allow-query { 192.168.1.82;192.168.1.80; };
......
在 /etc/named.rfc1912.zones 里面定义一个Zone (注:原来的默认文件先不用管,直接在文件的末尾添加即可)
zone "blog.deepnet.com" IN {
type master;
file "blog.deepnet.com.zone";
};
创建zone文件/var/named/blog.deepneet.con.zone
$TTL 600
@ IN SOA dns.blog.deepnet.com. dnsadmin.blog.deepnet.com. (
2018120101
1H
5M
3D
1D )
@ IN NS dns.blog.deepnet.com.
dns IN A 192.168.1.82
www IN A 192.168.1.146
重启80和82上的bind服务器,在80上运行dig命令:
dig -t NS blog.deepnet.com @192.168.1.80
; <<>> DiG 9.9.4-RedHat-9.9.4-72.el7 <<>> -t NS blog.deepnet.com @192.168.1.80
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54774
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;blog.deepnet.com. IN NS
;; ANSWER SECTION:
blog.deepnet.com. 600 IN NS dns.blog.deepnet.com.
;; Query time: 3 msec
;; SERVER: 192.168.1.80#53(192.168.1.80)
;; WHEN: Tue Dec 11 11:33:16 CST 2018
;; MSG SIZE rcvd: 63
(六)ACL (Access control list)
acl顾名思义就是访问控制列表,可以将一个或多个地址归并为一个命名的集合,随后通过此名称即可对该集合内的所有主机实现统一调用。
在bind程序中,acl格式如下:
acl acl_name {
ip;
ipnet/prelen;
};
其中,acl_name是自定义名称,ip指的是IP地址,ipnet/prelen指的是IP网段。
(七) DNS服务器View功能的实现。
什么是View功能?
View功能提供了不同用户访问同一个域名,把域名解析成不同的IP地址,使用户能够访问离他最近的服务器上的数据。例如,当我们网站的数据同步在两台web服务器上时,一台是电信服务器,一台是网通服务器,那么我们肯定希望全国访问我们网站的用户在打开网站的时候,能够自动实现,电信用户访问电信服务器,网通用户访问网通服务器。配置这种情况的前提是,web服务器必须要有一个电信的IP地址和一个网通的IP地址。DNS服务器的这种解析功能通常也被称之为智能解析。
DNS服务器的视图通常在配置文件中是使用view实现的。把要使用某些IP地址作单独访问的zone区域,统一放在一个命名的view段落中,并且在view中定义请求的IP地址或IP地址段,把IP地址写入match-clients选项中。如果像上面说的,区分电信和网通路线的话,那么可以使用两个acl访问控制列表写上电信或网通IP地址,定义电信网通路线,把acl名字写入view段落match-clients选项中。如下所示:
acl telecomip{ tele_IP; ... };
acl netcomip{ net_IP; ... };
view telecom {
match-clients { telecomip; };
zone "ZONE_NAME" IN {
type master;
file "ZONE_NAME.telecom";
};
};
view netcom {
match-clients { netcomip; };
zone "ZONE_NAME" IN {
type master;
file "ZONE_NAME.netcom";
};
};
(1)、如果使用了视图的功能,那么配置文件中的所有zone区域都要必须写在视图里面,如,配置文件里默认要配置的三个区域,根、127.0.0.1、1.0.0.127.in-addr.arpa都要写入视图。
(2)、在acl中定义IP地址,IP地址的写法可以是单个IP地址也可以是一个IP地址段加掩码,如:192.168.0.0/24。
(3)、视图是根据配置文件从上往下匹配的,所以希望优先访问的资源记录文件,区域应该尽量写前面。
(4)、如果定义的若干个视图的IP地址不全的话,那么可以在最后定义一个默认视图,match-clients选项中的IP地址写上any,代表如果此次访问的IP地址上面没有一个能匹配到,则在此处归类。
我们在主服务器的/etc/named.rfc1912.zones 修改配置如下(为了方便我们把原来默认的zone干掉)。
acl local {192.168.1.80;};
acl net {192.168.1.82;};
view newcom {
match-clients {net;};
zone "deepnet.com" IN {
type master;
file "deepnet.com.net.zone";
};
};
view localcom {
match-clients {local;};
zone "deepnet.com" IN {
type master;
file "deepnet.com.zone";
allow-transfer {192.168.1.143;};
};
zone "1.168.192.in-addr.arpa" IN {
type master;
file "1.168.192.zone";
allow-transfer {192.168.1.143;};
};
};
为了简单一点/etc/named.config 访问控制注释掉
// allow-query { localhost; 192.168.1.80; };
在deepnet.com.net.zone文件中配置如下:
$TTL 600
$ORIGIN deepnet.com.
@ IN SOA ns1.deepnet.com. admin.deepnet.com. (
20181207 ;序列号
1H ;刷新时间
5M ;重试时间
1W ;超时时间
10M ;否定答案缓存TTL值
)
IN NS ns1
ns1 IN A 192.168.1.80
IN MX 10 mail1
mail1 IN A 192.168.1.142
www IN A 192.168.1.141
cname IN CNAME www
可以看到对mail1和www的IP进行了一个小的调整,重启named服务。
在80上用dig命令验证:
; <<>> DiG 9.9.4-RedHat-9.9.4-72.el7 <<>> -t A www.deepnet.com @192.168.1.80
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47550
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.deepnet.com. IN A
;; ANSWER SECTION:
www.deepnet.com. 600 IN A 192.168.1.142
;; AUTHORITY SECTION:
deepnet.com. 600 IN NS ns1.deepnet.com.
;; ADDITIONAL SECTION:
ns1.deepnet.com. 600 IN A 192.168.1.80
;; Query time: 2 msec
;; SERVER: 192.168.1.80#53(192.168.1.80)
;; WHEN: Tue Dec 11 14:35:16 CST 2018
;; MSG SIZE rcvd: 94
在82上面执行dig
dig -t A www.deepnet.com @192.168.1.80
; <<>> DiG 9.9.4-RedHat-9.9.4-72.el7 <<>> -t A www.deepnet.com @192.168.1.80
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 44323
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.deepnet.com. IN A
;; ANSWER SECTION:
www.deepnet.com. 600 IN A 192.168.1.141
;; AUTHORITY SECTION:
deepnet.com. 600 IN NS ns1.deepnet.com.
;; ADDITIONAL SECTION:
ns1.deepnet.com. 600 IN A 192.168.1.80
;; Query time: 1 msec
;; SERVER: 192.168.1.80#53(192.168.1.80)
;; WHEN: Tue Dec 11 14:26:25 CST 2018
;; MSG SIZE rcvd: 94
可以看到在80上 解析www.deepnet.com,其解析出来的地址是192.168.1.142,而在82解析出来的地址是192.168.1.141