Linux ·

DNS域名解析服务器

为什么需要DNS

域名解析服务,全称Domain Name Service,简称为DNS。
DNS是一项基础服务,那他有什么用呢?我们为什么需要他?
他最主要的作用是将全称域名转换成IP

试想一下,假如上网的时候,在浏览器上面的网址都是IP会是什么样的一个状况?
可能我们就需要像电话本一样,把他们都记录下来,需要访问的时候再查看。
因为他们都是IP地址数字,记录起来不像单词一样。

事实上也确实有这么做过,例如我们主机的hosts文件

[root@bc ~]# vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.2.201 node1 node1.bc.com
192.168.2.211 node1 node1.bc.com
192.168.2.221 node1 node1.bc.com
192.168.2.202 node2 node2.bc.com
192.168.2.212 node2 node2.bc.com
192.168.2.222 node2 node2.bc.com
192.168.2.203 node3 node3.bc.com
192.168.2.213 node3 node3.bc.com
192.168.2.223 node3 node3.bc.com
192.168.2.204 node4 node4.bc.com
192.168.2.214 node4 node4.bc.com
192.168.2.224 node4 node4.bc.com

这样我们在浏览器中输入node1.bc.com就会自动地转换成192.168.2.201这个地址。
这样的话,即使这个IP地址多么难记,我们要访问的时候只需要键入这个地址就可以了。

那我们有hosts文件了,为什么需要DNS服务呢?

因为hosts文件就像电话簿一样,是写死的。
如果有一天,对方的IP地址换了。我们键入同样的域名就访问不了了。
这个就跟别人换了电话号码,但是你的手机上的电话簿不会即时更新一样。

而DNS则是一个在线同步的电话簿,对方改了电话号码,我们也能够连通。

当我们在浏览器上键入网址,名称解析实际上做了什么?

1.首先,为了解析域名他回去才查找本地的hosts文件
假如hosts文件中有对应的条目,直接就解析成对应的IP地址访问了。

2.hosts文件中没有对应的记录的时候,就会去查找本地的DNS服务器
假如你家连的是电信网络,这个本地的DNS记录一般是由电信维护的。
你访问本地DNS服务器,DNS服务器有记录并返回一个记录。这个叫递归查询
当然,递归查询在DNS服务器中是可以关闭的。

3.本地DNS服务器中也没有的对应记录的时候,就回去找根服务器
根服务器是最顶级的域,总共有13个。
例如访问www.example.com的时候:
a.hosts文件中没有记录
b.本地dns服务器中也没有记录
c.就会去找根服务器,从13个服务器中,从中找到管理com.域名的DNS服务器。

假如,管理com.的服务器告诉我们需要我们去找ns1.example.comDNS服务器。
最后本地dns在ns1.example.com中查找到www.example.com的域名记录
这个过程,就叫做迭代查询

举个通俗的例子,学生问老师一个问题,老师告诉他答案。这叫递归查询。
假如老师也不知道答案,这时老师去问其他老师。这叫迭代查询。

DNS服务器中的资源类型

SOA记录:Start Of Authority,起始授权记录;

SOA记录包含以下信息:
    (1) 当前区域的主DNS服务器的FQDN,也可以使用当前区域的名字
    (2) 当前区域管理员的邮箱地址
        但地址中不能使用@符号,一般用.替换@
        如bocai.example.com代表[email protected]
    (3)主从服务协调属性的定义以及否定的答案的统一的TTL

区域解析库有且仅能有一个SOA记录,而必须为解析库的第一条记录;

SOA记录的一个示例:
bc.com.  86400  IN  SOA  ns1.bc.com.     nsadmin.bc.com.     (
            2015042201        ;序列号
            2H                ;刷新时间
            10M               ;重试时间
            1W                ;过期时间
            1D                ;否定答案的TTL值
)

A记录:internet Address
作用是将全称域名解析成IP地址。

  node1.bc.com.      IN      A   192.168.2.201
  node2.bc.com.      IN      A   192.168.2.202

PTR记录: PoinTeR
作用是将IP地址解析成全称域名。

  4.3.2.1.in-addr.arpa.     IN     PTR     www.bc.com

有特定格式,把IP地址反过来写,
1.2.3.4,要写作4.3.2.1;而有特定后缀:in-addr.arpa.,
所以完整写法为:4.3.2.1.in-addra.arpa.

NS记录: Name Server,
作用是标明当前区域的DNS服务器

  bc.com.        IN         NS      ns1.bc.com.
  bc.com.        IN         NS      ns2.bc.com.

CNAME记录:Canonical Name,别名记录
作用是将多个名字映射到同一台计算机。

    web.bc.com.             IN      CNAME          www.bc.com.
    mail.bc.com.            IN      CNAME          www.bc.com.
    www.bc.com.             IN      A              1.1.1.1

这样的话,当在浏览器中键入web.bc.com或者mail.bc.com实际上都是访问1.1.1.1
这样有利于修改的时候可以只修改一条A记录就达成目的。
MX记录: Mail eXchanger,邮件交换器
记录是邮件交换记录,它指向一个邮件服务器,
用于电子邮件系统发邮件时根据收信人的地址后缀来定位邮件服务器。

  bc.com.        IN          MX  10  mx1.bc.com.

这个一般用来设置个性邮箱名字才使用的
例如你的个性域名是[email protected],实际上是交给了mx1.bc.com这个邮件服务器去处理。

搭建两个DNS服务器并配置主从复制

主机名 主机地址 角色
node1 192.168.2.201 主DNS服务器
node2 192.168.2.202 从DNS服务器

以上节点均关闭了iptables和selinux

一、修改配置文件:

1./etc/named.conf

这个配置文件用于设置全局配置

[root@node1 named]# vim /etc/named.conf

options {
        listen-on port 53 { 192.168.2.201;127.0.0.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     { any; };

        dnssec-enable no;
        dnssec-validation no;
        #可以用于防止DNS毒化,但是需要购买证书。

}
#定义一个叫bc.com的域,也就是说这台DNS服务器可以解析这个域
#这里的file使用了相对路径,也就是需要在/var/named/bc.com.zone这个文件里面定义资源记录。

注意:
listen-on port 写成0.0.0.0并不能监听在全部网址的53号端口上.
往后的相对路径全部都是相对于directory而言的。

2./etc/named.rfc1912.zones

用于设置服务器可以解析的域

zone "bc.com" IN {
        type master;
        file "bc.com.zone";
};
3.定义资源记录
[root@node1 named]# vim /var/named/bc.com.zone 
TTL 86400ORIGIN bc.com.
@       IN      SOA     ns1.bc.com.     admin.bc.com (
                        2016042201
                        1H
                        5M
                        7D
                        1D )

                IN      NS      ns1
                IN      NS      ns2
ns1     IN      A               192.168.2.201
ns2     IN      A               192.168.2.202
node1   IN      A               192.168.2.201
node1   IN      A               192.168.2.211
node1   IN      A               192.168.2.221
node2   IN      A               192.168.2.202
node2   IN      A               192.168.2.212
node2   IN      A               192.168.2.222
node3   IN      A               192.168.2.203
node3   IN      A               192.168.2.213
node3   IN      A               192.168.2.223
node4   IN      A               192.168.2.204
node4   IN      A               192.168.2.214
node4   IN      A               192.168.2.224
*               IN      A       192.168.2.201
检查脚本的语法错误(不检查逻辑上的错误)
 [root@node1 named]# named-checkconf

假如没有问题的话,不会有任何输出。
下面我们删除一个分号再运行一次检查错误。

 [root@node1 named]# named-checkconf
  /etc/named.conf:57: missing ';' before '}'
没有问题,就可以重启服务了。
[root@node1 named]# service named restart
Redirecting to /bin/systemctl restart  named.service

需要注意的是,DNS的包名叫做bind,服务器名字叫做named
所以yum install named或者yum install dns也是没有办法安装服务的。

二、测试能否解析域名
[root@node1 named]# dig -t A node1.bc.com @192.168.2.201

; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7_2.4 <<>> -t A node1.bc.com @192.168.2.201
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12316
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 2, ADDITIONAL: 3

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;node1.bc.com.            IN    A

;; ANSWER SECTION:
node1.bc.com.        86400    IN    A    192.168.2.211
node1.bc.com.        86400    IN    A    192.168.2.221
node1.bc.com.        86400    IN    A    192.168.2.201

;; AUTHORITY SECTION:
bc.com.            86400    IN    NS    ns2.bc.com.
bc.com.            86400    IN    NS    ns1.bc.com.

;; ADDITIONAL SECTION:
ns1.bc.com.        86400    IN    A    192.168.2.201
ns2.bc.com.        86400    IN    A    192.168.2.202

;; Query time: 0 msec
;; SERVER: 192.168.2.201#53(192.168.2.201)
;; WHEN: Wed Oct 05 03:20:59 EDT 2016
;; MSG SIZE  rcvd: 157
在输出结果中,我们需要关注的几个字段:
;; ANSWER SECTION:
node1.bc.com.        86400    IN    A    192.168.2.211
node1.bc.com.        86400    IN    A    192.168.2.221
node1.bc.com.        86400    IN    A    192.168.2.201

;; AUTHORITY SECTION:
bc.com.            86400    IN    NS    ns2.bc.com.
bc.com.            86400    IN    NS    ns1.bc.com.

;; ADDITIONAL SECTION:
ns1.bc.com.        86400    IN    A    192.168.2.201
ns2.bc.com.        86400    IN    A    192.168.2.202
首先我们的命令是向192.168.2.201这台主机查询node1.bc.com这个域名的IP地址。
  dig -t A node1.bc.com @192.168.2.201

;; ANSWER SECTION:指的就是答案,也就是说查找得到的A记录,也就是IP地址。
;; AUTHORITY SECTION:指的是,负责解析这个域的DNS服务器。
;; ADDITIONAL SECTION:指的是负责解析的服务器的A记录,也就是IP地址。

三、配置node2为从服务器
从服务器安装DNS服务的软件包
  [root@node2 ~]# yum install named -y
修改全局配置文件
[root@node2 ~]# vim /etc/named.conf 
options {
        listen-on port 53 { 192.168.2.202;127.0.0.1; };
        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     { any; };

        recursion yes;

        dnssec-enable no;
        dnssec-validation no;
}
修改区域配置文件
  [root@node2 ~]# vim /etc/named.rfc1912.zones 
  zone "bc.com" IN {
        type slave;
        masters { 192.168.2.201; };
        file "slaves/named.bc.com.zone";
  };
重启服务
  [root@node2 ~]# service named restart
  Redirecting to /bin/systemctl restart  named.service
查看监听端口是否开启
[root@node2 ~]# ss -tnlp
State       Recv-Q Send-Q    Local Address:Port      Peer Address:Port 
LISTEN      0      10        192.168.2.202:53          *:*              users:(("named",4689,21))
LISTEN      0      10        127.0.0.1:53              *:*              users:(("named",4689,20))
四、同步需要注意的几点

1.主从的时间必须同步,否则容易出错。
2.bind程序的版本应该保持一致;否则,应该从高主低;
3.dnssec功能的开启会影响查询。
4.主服务器一旦发生更改,主服务器会通知解析库中有NS记录的从服务器
5.防火墙徐璈开放53号端口的tcp和udp连接,UDP用于查询,TCP用于同步。
6.可以通过手动修改SOA记录中的序列号,手动+1,可以让主从同步。
也就是说,假如主从不同步,可以从这几个方面检查有没有设置好。

五、测试从服务器是否同步成功。
向node2查询node1.bc.com这个域名的A记录
[root@node1 named]# dig -t A node1.bc.com @192.168.2.202

; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7_2.4 <<>> -t A node1.bc.com @192.168.2.202
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47173
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 2, ADDITIONAL: 3

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;node1.bc.com.            IN    A

;; ANSWER SECTION:
node1.bc.com.        86400    IN    A    192.168.2.221
node1.bc.com.        86400    IN    A    192.168.2.211
node1.bc.com.        86400    IN    A    192.168.2.201

;; AUTHORITY SECTION:
bc.com.            86400    IN    NS    ns2.bc.com.
bc.com.            86400    IN    NS    ns1.bc.com.

;; ADDITIONAL SECTION:
ns1.bc.com.        86400    IN    A    192.168.2.201
ns2.bc.com.        86400    IN    A    192.168.2.202

;; Query time: 1 msec
;; SERVER: 192.168.2.202#53(192.168.2.202)
;; WHEN: Fri Dec 30 14:37:18 CST 2016
;; MSG SIZE  rcvd: 157

成功向node2这个DNS服务器查找到node1的A记录。
因为从服务器只配置了一个zone,资源记录是空的。
如果没有从master同步到资源记录,是解析不了的。

查看node2是否同步到记录
[root@node2 ~]# vim  /var/named/slaves/named.bc.com.zone 

^@^@^@^B^@^@^@^AXeþ<86>^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@S^@^A^@^F^@^@^@^AQ<80>^@^@^@^A^@^H^Bbc^Ccom^@^@5^Cns1^Bbc^Ccom^@^Eadmin^Bbc^Ccom^Bbc^Ccom^@x+<95>u^@^@^N^P^@^@^A,^@        :<80>^@^AQ<80>^@^@^@8^@^A^@^B^@^@^@^AQ<80>^@^@^@^B^@^H^Bbc^Ccom^@^@^L^Cns1^Bbc^Ccom^@^@^L^Cns2^Bbc^Ccom^@^@^@^@$^@^A^@^A^@^@^@^AQ<80>^@^@^@^A^@
^A*^Bbc^Ccom^@^@^DÀ¨^BÉ^@^@^@4^@^A^@^A^@^@^@^AQ<80>^@^@^@^C^@^N^Enode1^Bbc^Ccom^@^@^DÀ¨^BÉ^@^DÀ¨^BÓ^@^DÀ¨^BÝ^@^@^@4^@^A^@^A^@^@^@^AQ<80>^@^@^@^C^@^N^Enode2^Bbc^Ccom^@^@^DÀ¨^BÊ^@^DÀ¨^BÔ^@^DÀ¨^BÞ^@^@^@4^@^A^@^A^@^@^@^AQ<80>^@^@^@^C^@^N^Enode3^Bbc^Ccom^@^@^DÀ¨^BË^@^DÀ¨^BÕ^@^DÀ¨^Bß^@^@^@4^@^A^@^A^@^@^@^AQ<80>^@^@^@^C^@^N^Enode4^Bbc^Ccom^@^@^DÀ¨^BÌ^@^DÀ¨^BÖ^@^DÀ¨^Bà^@^@^@&^@^A^@^A^@^@^@^AQ<80>^@^@^@^A^@^L^Cns1^Bbc^Ccom^@^@^DÀ¨^BÉ^@^@^@&^@^A^@^A^@^@^@^AQ<80>^@^@^@^A^@^L^Cns2^Bbc^Ccom^@^@^DÀ¨^BÊ
`如果不想是乱码,zone可以定义成这样。
zone "bc.com" IN {
        type slave;
        masters { 192.168.2.201; };
        masterfile-format text; 
        file "slaves/named.bc.com.zone";
};
同步而来的slave文件,显得十分规范。
[root@node2 ~]# cat /var/named/slaves/named.bc.com.zone

ORIGIN .TTL 86400      ; 1 day
bc.com                  IN SOA  ns1.bc.com. admin.bc.com.bc.com. (
                                2016122230 ; serial
                                3600       ; refresh (1 hour)
                                300        ; retry (5 minutes)
                                604800     ; expire (1 week)
                                86400      ; minimum (1 day)
                                )
                        NS      ns1.bc.com.
                        NS      ns2.bc.com.
$ORIGIN bc.com.
*                       A       192.168.2.201
node1                   A       192.168.2.201
                        A       192.168.2.211
                        A       192.168.2.221
node2                   A       192.168.2.202
                        A       192.168.2.212
                        A       192.168.2.222
node3                   A       192.168.2.203
                        A       192.168.2.213
                        A       192.168.2.223
node4                   A       192.168.2.204
                        A       192.168.2.214
                        A       192.168.2.224
ns1                     A       192.168.2.201
ns2                     A       192.168.2.202

这样、我们就配置出一个简单的DNS主从服务器了。
由于篇幅的原因,域名服务器的子域授权以及智能解析 见 http://www.linuxidc.com/Linux/2017-10/147595.htm

参与评论