DNS的出现及演化

网络出现的早期是使用IP地址通讯的,那时就几台主机通讯。但是随着接入网络主机的增多,这种数字标识的地址非常不便于记忆,UNIX上就出现了建立一个叫做hosts的文件(Linux和Windows也继承保留了这个文件)。这个文件中记录着主机名称和IP地址的对应表。这样只要输入主机名称,系统就会去加载hosts文件并查找对应关系,找到对应的IP,就可以访问这个IP的主机了。
但是后来主机太多了,无法保证所有人都能拿到统一的最新的hosts文件,就出现了在文件服务器上集中存放hosts文件,以供下载使用。互联网规模进一步扩大,这种方式也不堪重负,而且把所有地址解析记录形成的文件都同步到所有的客户机似乎也不是一个好办法。这时DNS系统出现了,随着解析规模的继续扩大,DNS系统也在不断的演化,直到现今的多层架构体系。

DNS概述入门

DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议运行在UDP协议之上,使用端口号53。
DNS 的分布式数据库是以域名为索引的,每个域名实际上就是一棵很大的逆向树中路径,这棵逆向树称为域名空间(domain name space)。如图所示树的最大深度不得超过127 层,树中每个节点都有一个可以长达63 个字符的文本标号。

域名系统

DNS域名解析过程

首先,客户端先在本地缓存查找有没有域名缓存,如果没有,客户端发出DNS请求翻译IP地址或主机名。DNS服务器在收到客户机的请求后:

  1. 检查DNS服务器的缓存,若查到请求的地址或名字,即向客户机发出应答信息;
  2. 若没有查到,则在数据库中查找,若查到请求的地址或名字,即向客户机发出应答信息;
  3. 若没有查到,则将请求发给根域DNS服务器,并依序从根域查找顶级域,由顶级查找二级域,二级域查找三级,直至找到要解析的地址或名字,即向客户机所在网络的DNS服务器发出应答信息,DNS服务器收到应答后现在缓存中存储,然后,将解析结果发给客户机。
  4. 若没有找到,则返回错误信息。

DNS的分类

主DNS服务器:就是一台存储着原始资料的DNS服务器。
从DNS服务器:使用自动更新方式从主DNS服务器同步数据的DNS服务器。也成辅助DNS服务器。
缓存服务器:不负责本地解析,采用递归方式转发客户机查询请求,并返回结果给客户机的DNS服务器。同时缓存查询回来的结果,也叫递归服务器。
转发器:这台DNS发现非本机负责的查询请求时,不再向根域发起请求,而是直接转发给指定的一台或者多台服务器。自身并不缓存查询结果。

DNS中记录类型

SOA可以理解为一段为自己dns做备注说明的文本,一般与ns一致
NS域的授权名称服务器
MX域的邮件交换器,要跟着一个优先级值,越小越高
AIPv4主机地址
AAAAIPv6主机地址
PTR解析IP的指针,反向记录
CNAME权威(正式)名称,定义别名记录

DNS命名规范

  1. 26个英文字母
  2. “0,1,2,3,4,5,6,7,8,9”十个数字
  3. “-”(英文中的连词号)
  4. 最多63字节长度

要不按照这个,bind支不支持,支持,合适么,不合适。
非要不按照这个,怎么办?
在·master-view·文件上配置check-names ignore;

DIG、NSLOOKUP、HOST的介绍

Host命令也是大多数系统、软件库调用的解析命令,比如php中。

[root@localhost ~]# host baidu.com
baidu.com has address 39.156.66.10
baidu.com has address 110.242.68.66
baidu.com mail is handled by 15 mx.n.shifen.com.
baidu.com mail is handled by 10 mx.maillb.baidu.com.
baidu.com mail is handled by 20 usmx01.baidu.com.
baidu.com mail is handled by 20 mx50.baidu.com.
baidu.com mail is handled by 20 mx1.baidu.com.
baidu.com mail is handled by 20 jpmx.baidu.com.

Nslookup能够反映出是哪个dnsserver返回的结果

[root@localhost ~]# nslookup baidu.com
Server:         192.168.31.53
Address:        192.168.31.53#53

Non-authoritative answer:
Name:   baidu.com
Address: 39.156.66.10
Name:   baidu.com
Address: 110.242.68.66

Dig返回整个解析过程的详细路径,类似traceroute

[root@localhost ~]# dig baidu.com

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.9 <<>> baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 30326
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 5, ADDITIONAL: 8

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

;; ANSWER SECTION:
baidu.com.              523     IN      A       39.156.66.10
baidu.com.              523     IN      A       110.242.68.66

;; AUTHORITY SECTION:
baidu.com.              86323   IN      NS      ns3.baidu.com.
baidu.com.              86323   IN      NS      dns.baidu.com.
baidu.com.              86323   IN      NS      ns4.baidu.com.
baidu.com.              86323   IN      NS      ns7.baidu.com.
baidu.com.              86323   IN      NS      ns2.baidu.com.

;; ADDITIONAL SECTION:
ns2.baidu.com.          170522  IN      A       220.181.33.31
ns7.baidu.com.          170522  IN      A       180.76.76.92
ns4.baidu.com.          170522  IN      A       14.215.178.80
dns.baidu.com.          170522  IN      A       110.242.68.134
ns3.baidu.com.          170522  IN      A       112.80.248.64
ns7.baidu.com.          170522  IN      AAAA    240e:bf:b801:1002:0:ff:b024:26de
ns7.baidu.com.          170522  IN      AAAA    240e:940:603:4:0:ff:b01b:589a

;; Query time: 0 msec
;; SERVER: 192.168.31.53#53(192.168.31.53)
;; WHEN: Thu Jul 21 14:50:51 UTC 2022
;; MSG SIZE  rcvd: 296

部署Bind服务

Bind是一款开放源码的DNS服务器软件,Bind由美国加州大学Berkeley分校开发和维护的,全名为Berkeley Internet Name Domain它是目前世界上使用最为广泛的DNS

准备环境

# 关闭selinux设置
[root@dns ~]# sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/sysconfig/selinux

# 关闭防火墙
[root@dns ~]# systemctl disable firewalld
[root@dns ~]# systemctl stop firewalld

Yum安装Bind相关服务工具

[root@dns ~]# yum install -y bind-utils bind bind-devel bind-chroot

[root@dns ~]# rpm -qa | grep bind
bind-9.11.4-26.P2.el7_9.9.x86_64
bind-chroot-9.11.4-26.P2.el7_9.9.x86_64
bind-devel-9.11.4-26.P2.el7_9.9.x86_64
bind-libs-9.11.4-26.P2.el7_9.9.x86_64
bind-utils-9.11.4-26.P2.el7_9.9.x86_64

配置/etc/named.conf文件

[root@dns ~]# vim /etc/named.conf
options {
        version "1.1.1";
        listen-on port 53 { any; };
        directory       "/var/named";
        pid-file "/run/named/named.pid";
        allow-query     { any; };
        dump-file       "/var/named/data/cache_dump.db";
        zone-statistics yes;
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        empty-zones-enable no;
        forwarders { 8.8.8.8;114.114.114.114; };

        recursing-file  "/var/named/data/named.recursing";
        secroots-file   "/var/named/data/named.secroots";
        recursion yes;
        dnssec-enable yes;
        dnssec-validation yes;
        bindkeys-file "/etc/named.root.key";
        managed-keys-directory "/var/named/dynamic";
        session-keyfile "/run/named/session.key";
};

logging {
  channel warning {
    file "/var/named/chroot/var/log/dns_warning" versions 10 size 10m;
    severity warning;
    print-category yes;
    print-severity yes;
    print-time yes;
  };
  channel general_dns {
    file "/var/named/chroot/var/log/dns_log" versions 10 size 100m;
    severity info;
    print-category yes;
    print-severity yes;
    print-time yes;
  };
  category default {
    warning;
  };
  category queries {
    general_dns;
  };
};

include "/etc/named.zones";

配置named.zones文件

[root@dns ~]# vim /etc/named.zones 

zone "if010.com" IN {
        type master;
        file "if010.com.zone";
        allow-update { none; };
};

zone "31.168.192.in-addr.arpa" IN {
        type master;
        file "31.168.192.zone";
        allow-update { none; };
};

配置if010.com.zone文件

[root@dns named]# vim /var/named/if010.com.zone 
$TTL 1D
@       IN SOA  @ dns.if010.com. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      dns.if010.com.
cloud   A       192.168.31.4
dns     A       192.168.31.82

配置31.168.192.zone文件

[root@dns named]# vim /var/named/31.168.192.zone
$TTL 1D
@       IN SOA  @ dns.if010.com. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      dns.if010.com.
4       PTR     cloud.if010.com.
82      PTR     dns.if010.com.

启动服务

[root@dns ~]# cd /var && chown -R named.named named/
[root@dns var]# systemctl enable named
Created symlink from /etc/systemd/system/multi-user.target.wants/named.service to /usr/lib/systemd/system/named.service.
[root@dns var]# systemctl start named

测试

[root@dns ~]# dig @192.168.31.82 cloud.if010.com

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.9 <<>> @192.168.31.82 cloud.if010.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50334
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

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

;; ANSWER SECTION:
cloud.if010.com.        86400   IN      A       192.168.31.4

;; AUTHORITY SECTION:
if010.com.              86400   IN      NS      dns.if010.com.

;; ADDITIONAL SECTION:
dns.if010.com.          86400   IN      A       192.168.31.82

;; Query time: 1 msec
;; SERVER: 192.168.31.82#53(192.168.31.82)
;; WHEN: Sun Jul 24 13:25:22 UTC 2022
;; MSG SIZE  rcvd: 94
最后修改:2022 年 07 月 24 日
-