DNS(Domain Name System 域名系统)

DNS是因特网的一项服务,将域名和IP地址相互映射为一个分布式数据库,使人能够更方便地访问互联网;DNS使用TCP和UDP的53端口


================================================================================


dns的分布式结构

tld:Top Level Domain(顶级域,在根之下)

    组织域:.com, .net, .org, .gov, .edu, .mil

    国家域:.iq, .tw, .hk, .jp, .cn, ...


DNS查询类型:

递归查询:本地的主机向指向的DNS服务器发起的查询请求

迭代查询:被指向的DNS服务器向其他DNS服务器发起的查询请求通常是迭代查询


DNS名称解析方式:

正向解析名称 --> IP

反向解析IP --> 名称

注意:二者的名称空间,非为同一个空间,即非为同一棵树;因此,也不是同一个解析库;


DNS服务器类型:

负责解析至少一个域

    主名称服务器;

    辅助名称服务器;

不负责域名解析

    缓存名称服务器;


一次完整的查询请求经过的流程:

Client --> hosts文件 --> DNS Local Cache --> DNS  Server(recursion递归) --> 

    1)自己负责解析的域:直接查询数据库并返回答案;

    2)不是自己负责解析域:Server Cache --> iteration(迭代查询)

解析答案类型:

    1)肯定答案:有查询到的记录;肯定答案可缓存;

    2)否定答案:不存在查询的键,因此,不存在与其查询键对应的值;

    1)权威答案:由直接负责的DNS服务器返回的答案;

    2)非权威答案:不是DNS服务器直接返回的答案,例如DNS服务器缓存的答案


================================================================================

主-辅DNS服务器:

主DNS服务器:维护所负责解析的域数据库的那台服务器;读写操作均可进行;

从DNS服务器:从主DNS服务器那里或其它的从DNS服务器那里“复制”一份解析库;但只能进行读操作,即只能进行查询操作,不能修改


从DNS服务器“复制”操作的实施方式:

    序列号:serial, 也即是数据库的版本号;当主服务器数据库内容发生变化时其版本号要递增;从服务器通过查看主服务器数据库序列号得知数据库是否更新;

    刷新时间间隔:refresh, 从服务器每隔多久到主服务器检查序列号更新状况;

    重试时间间隔:retry, 从服务器向主服务器请求同步解析库失败时,再次发起尝试请求的时间间隔;retry应小于refresh;

    过期时长:expire,从服务器始终联系不到主服务器时,多久之后放弃从主服务器同步数据;停止提供服务;

    否定答案的缓存时长

主服务器“通知”从服务器随时更新数据;

区域传送:

    全量传送:axfr, 传送整个数据库;

    增量传送:ixfr, 仅传送变化的数据;


区域(zone)和域(domain):

例如magedu.com域:区域是物理概念,域是逻辑概念

    FQDN --> IP 正向解析库;区域

    IP --> FQDN(主机名)反向解析库;区域


区域数据库文件:

资源记录:Resource Record, 简称rr;

资源记录类型:A, AAAA, PTR, SOA, NS, CNAME, MX

SOA:Start Of Authority,起始授权记录;指定有关DNS区域的权威性信息;一个区域解析库有且只能有一个SOA记录,而且必须放在第一条;

NS:Name Service,域名服务记录;标示区域内DNS服务器的主机名;一个区域解析库可以有多个NS记录;其中一个为主的;

A: Address, 地址记录,FQDN --> IPv4;

AAAA:地址记录, FQDN --> IPv6;

CNAME:Canonical Name,别名记录;

PTR:Pointer,PTR指针记录实现反向解析;IP --> FQDN;

MX:Mail eXchanger,邮件交换器;标示邮件服务器的主机名;优先级:0-99,数字越小优先级越高;

资源记录的定义格式:

语法:name  [TTL] INRR_TYPE value

name:既可以是ip(反向解析),也可能是某个主机名

[TTL]:域名解析记录在DNS服务器中的存留时间,省略时可统一分配TTL值

IN:关键字

RY_TYPE:资源记录类型

value:资源记录的值


SOA

name: 当前区域的名字;例如”mageud.com.”,或者“2.3.4.in-addr.arpa.”;

value:由多部分组成:

    1)当前区域的区域名称(也可以使用主DNS服务器名称);

    2)当前区域管理员的邮箱地址;但地址中不能使用@符号,一般使用点号来替代;

    3)(主从服务协调属性的定义以及否定答案的统一TTL值)

例如:[分号后为注释,H、M、W、D分别表示小时、分钟、周、天]

magedu.com. 86400 IN SOA magedu.com. admin.magedu.com.  (

            2017010801; serial         

            2H ; refresh                  

            10M ; retry

            1W; expire

            1D; negative answer ttl 

)

NS

name: 当前区域的区域名称

value:当前区域的某DNS服务器的主机名,例如ns.magedu.com.;

注意:一个区域可以有多个DNS服务器,因此可以有多个ns记录; 例如:

magedu.com. 86400 IN NS  ns1.magedu.com.

magedu.com. 86400 IN NS  ns2.magedu.com.

MX

name: 当前区域的区域名称

value:当前区域某邮件服务器的主机名;

注意:MX记录可以有多个;但每个记录的value之前应该有一个数字表示其优先级;例如:

magedu.com. IN MX 10  mx1.magedu.com.

magedu.com. IN MX 20  mx2.magedu.com.


A

name:某FQDN(主机名),例如www.magedu.com.

value:主机的IPv4地址;FQDN和IP可互相对应多个;

例如:

www.magedu.com.IN A1.1.1.1

www.magedu.com.IN A1.1.1.2

bbs.magedu.com.IN A1.1.1.1

AAAA

name:某FQDN(主机名)

value: 主机的IPv6地址

PTR

name:IP地址,有特定格式,即IP反过来写,而且要加特定后缀;

         例如1.2.3.4的记录应该写为4.3.2.1.in-addr.arpa.

value:FQND

例如:

4.3.2.1.in-addr.arpa.  IN         PTRwww.magedu.com.

CNAME

name:FQDN格式的别名;

value:FQDN格式的正式名字;

例如:

web.magedu.com.  IN  CNAME    www.magedu.com.

注意:

(1) TTL可以从全局继承;

(2) @表示当前区域的名称;

(3) 相邻的两条记录其name相同时,后面记录的name可省略;

(4) 对于正向区域来说,各MX,NS等类型的记录的value为FQDN,此FQDN应该有一个A记录;


================================================================================



BIND的安装配置:


BIND: Berkeley Internet Name Domain,现在由互联网系统协会ISC开发和维护

dns是一种协议;bind是dns协议的一种实现

named:bind程序的运行的进程名

bind相关的程序包:

系统自带:

bind-libs:被bind和bind-utils两个包中的程序共同用到的库文件;

bind-utils:bind客户端程序集,例如dig, host, nslookup等;

手动安装:

bind:提供了dns server程序、以及几个常用的测试程序;

bind-chroot:选装,让named进程运行于jail模式下;

wKiom1aRDm-hfk6sAAAh14w9G_s445.png


bind主配置文件:/etc/named.conf

    可包含进来其它文件;

        /etc/named.iscdlv.key

        /etc/named.rfc1912.zones

        /etc/named.root.key

    解析库文件:

        /var/named/目录下;一般名字为:ZONE_NAME.zone

注意:

(1) 一台DNS服务器可同时为多个区域提供解析;

(2) 必须要有根区域解析库文件: named.ca;

(3) 还应该有两个区域解析库文件:localhost和127.0.0.1的正反向解析库;

    正向解析库文件:named.localhost

    反向解析库文件:named.loopback

rndc:remote name domain contoller(远程名称域控制器)

工作于tcp的953端口,但默认监听于127.0.0.1地址,因此仅允许本地使用;

bind程序安装完成之后,默认即可作为缓存名称服务器使用;如果没有专门负责解析的区域,可直接启动服务;

CentOS 6: service  named  start

CentOS 7: systemctl  start  named.service

主配置文件格式:

全局配置段:options { ... }

日志配置段:logging { ... }

区域配置段:zone { ... } 定义那些由本机负责解析的区域,或转发的区域;注意:每个配置语句必须以分号结尾;

缓存名称服务器的配置:

    监听能与外部主机通信的地址;

    listen-on port 53;  //监听本机所有地址

    listen-on port 53 { 192.168.2.17; };   //监听特定的地址

学习时,建议关闭dnssec功能

    dnssec-enable no;

    dnssec-validation no;

    dnssec-lookaside no;

关闭仅允许本地查询:

    //allow-query  { localhost; };


wKiom1aRFM-A3e7PAAAG7uKLr4A889.png

wKiom1aRFa7jjukAAABo2GLBTOg997.png


检查配置文件语法错误:

    named-checkconf   [/etc/named.conf]

wKioL1aRFmOTE1u3AAAGNxqeIkI754.png


配置文件检查无误后,即可启动服务:

wKioL1aRFuvSji1LAAAn2Gr64Z4623.png

wKiom1aRF5Lzqp61AACBm0m4F1E996.png


可以将dns服务器指向自己:

wKioL1aRGWryxVFuAAAQ8qPxwI4138.png

wKioL1aRGgnTUsVzAAAZabYmtB4632.png


测试工具:dig, host, nslookup等

1、dig命令用于测试dns系统,因此其不会查询hosts文件;

dig  [-t RR_TYPE]  name  [@SERVER]  [query options]

[-t RR_TYPE]:指明资源记录类型;

name:将哪个名字解析为资源记录的值;

[@SERVER]:通过指定的DNS服务器解析,不指明则通过本机测试

wKioL1aRHu2zNJWMAAAHezMEdhU313.png

查询选项:

+[no]trace:是否跟踪解析过程;

+[no]recurse:是否进行递归解析

wKiom1aRHs-jYffBAAAbAJRNCsg335.png

注意:反向解析测试

dig  -x  IP

wKiom1aRH7GgEC9cAAAH5bBqf-4106.png

wKioL1aRH92y1jrBAAAaKPbdQsY482.png


模拟完全区域传送:

dig  -t  axfr  DOMAIN  [@server]




2、host命令:

host  [-t  RR_TYPE]  name  [SERVER_IP]

wKiom1aRIFKSPwjlAAAYakQfC1I974.png

wKioL1aRIhOTgd-LAAAk-Y0qJuY759.png

3、nslookup命令:

nslookup  [-options]  [name]  [server]

交互式模式:

nslookup>

    server  IP:以指定的IP为DNS服务器进行查询;

    set  q=RR_TYPE:要查询的资源记录类型;

    name:要查询的名称;

wKiom1aRI1bil_6PAAA1eV31Nl4540.png

4、rndc命令:named服务控制命令

rndc  status:显示服务器的状态

rndc  flush:清空服务器的缓存

rndc  reload重新加载配置文件和区域数据文件

wKiom1aRJMCSO8hDAAA5M0zSQtA535.png


================================================================================

配置解析一个正向区域:

以coffeeyep.com域为例:

(1) 定义区域

在主配置文件中或主配置文件的辅助配置文件中实现;

zone  "ZONE_NAME"  IN  {

    type  {master|slave|hint|forward};  //定义区域类型{主|从|根|转发}服务器

    file  "ZONE_NAME.zone";               //指明区域文件路径,相对路径为/var/named下

};

注意:区域名字即为域名;


/var/named.conf只定义了根,指明了遵循rfc1912规范的各区域的专用配置文件的路径

wKioL1aRKXSCffsEAAAG2c_0c3U906.png

wKiom1aRKUmBKmbAAAAXizvC5lU073.png

wKiom1aRK5Oywky6AAAIVdA1_Fg862.png

wKiom1aRK5OCh2VBAAALePL1uI4414.png


(2) 建立区域数据文件(主要记录为A或AAAA记录)

在/var/named目录下建立区域数据文件;

文件为:/var/named/coffeeyep.com.zone

wKiom1aRMSnDD-vUAABNQCrZ90A795.png


权限及属组修改:

# chgrp  named  /var/named/coffeeyep.com.zone

# chmod  o=  /var/named/coffeeyep.com.zone

wKiom1aRMvLAPoUNAABNPKUBsEk272.png

检查语法错误:

# named-checkconf 

# named-checkzone  ZONE_NAME   ZONE_FILE

wKioL1aRMe-yYMykAAAWZa1B1hg838.png

(3) 让服务器重载配置文件和区域数据文件

# rndc  reload 或

# systemctl  reload  named.service

wKiom1aRMniw0HSkAAAb0UTlTr0106.png

wKioL1aRMqWB_cugAAAk0CQ8AuU090.png


接下来就可以指定自己为DNS服务器进行解析了

wKiom1aRM8PBk3RfAAAtYkzR-sE507.pngwKioL1aRNPvTniiHAACDyic_SeE833.png


================================================================================

配置解析一个反向区域


(1) 定义区域

在主配置文件中或主配置文件辅助配置文件中实现;

zone  "ZONE_NAME"  IN  {

    type  {master|slave|hint|forward};

    file  "ZONE_NAME.zone"; 

};

注意:反向区域的名字:

反写的网段地址.in-addr.arpa 

例如:2.168.192.in-addr.arpawKiom1aRK5Oywky6AAAIVdA1_Fg862.png

wKioL1aROIXzIIdFAAAOBAhc9Js440.png

(2) 定义区域解析库文件(主要记录为PTR)

示例,区域名称为2.168.192.in-addr.arpa;

wKiom1aRPkuShabYAABEC4fpysg359.png

权限及属组修改:

    # chgrp  named  /var/named/172.16.100.zone

    # chmod  o=  /var/named/172.16.100.zone

wKioL1aRPBmBJr4dAABVhXXD7uU852.png

检查语法错误:

    # named-checkconf 

    # named-checkzone  ZONE_NAME   ZONE_FILE

wKioL1aRPrPSCJsKAAAYRo6SUrs735.png


(3) 让服务器重载配置文件和区域数据文件

# rndc  reload 或

# systemctl  reload  named.service

wKiom1aRPy6hsC9CAAAcQaMYbn4666.png

wKioL1aRP1qDDznzAAAk0MhpTw0641.png


接下来就可以进行反向解析了:

wKioL1aRP8GS1cvsAAB-ZBTOG-I790.png


================================================================================

配置主从服务器:

注意:从服务器是区域级别的概念;即可以仅从与主服务器的某个区域

注意:主从服务器时间要同步,可使用ntpdate命令同步时间服务器;

配置一个从区域:


On Master(192.168.2.17)

确保区域数据库文件中为每个从服务器都配置了NS记录,并且在正向区域文件需要每个从服务器的NS记录的主机名配置一个A记录,且此A记录后面的地址为真正的从服务器的IP地址;

wKioL1aRTpqDG4I9AABY0Rnl9OQ189.png


检查区域配置文件:

wKiom1aRTwmAXRPhAAAQg-xawtw458.png


重载区域配置文件:

wKioL1aRT8rTwSROAABCfPP2dj4976.png


On Slave(192.168.2.18)

(1) 定义区域,定义一个从区域;

zone "ZONE_NAME"  IN {

    type  slave;

    file  "slaves/ZONE_NAME.zone";    

    masters  { MASTER_IP; };

};

主服务器的slave目录对于属主属组都有写权限,专用于从服务器从主服务器同步文件、需要自动创建数据库文件时使用

wKiom1aRR72BHaNLAAAGhLxkBi0485.png

wKioL1aRSUHT-BMpAAAHRftvO7U619.png

wKiom1aRSlzSeRXfAABppeJF5rY999.pngwKiom1aRSpmTz0tZAAAqxgY1GBM623.png

wKioL1aRS7Gi1lL9AAAIQt7GT_s455.png

wKioL1aRTLyxRxT9AAAXLMTgIzc371.png



配置文件语法检查:named-checkconf

wKiom1aRTLCRGqlSAAAGelcpRZs259.png

(2) 重载配置

rndc  reload 或

systemctl  reload  named.service

wKioL1aRUWeiFBtsAAC2Rn0SUk8933.png


接下来就可以在从服务器的/var/named/slaves目录下看到从主服务器传送的区域配置文件了

wKiom1aRUayC3aeWAAAJsb6zvA8072.png


将DNS服务器指向自己解析www.coffeeyep.com:

wKioL1aRUmbBVgR-AACBSMY2qp8059.png



On Master(192.168.2.17)

再次在主DNS服务器上新增一条A记录:

wKiom1aRU0yADsAtAABXGaLsykc385.png


重载配置文件后,就可以查看DNS的状态中发送序列号更新通知到从服务器了:

wKioL1aRVI7gIHFDAAC07SFVJYY648.png



On Slave(192.168.2.18)

查看DNS状态中接收到主服务器的更新序列号通知并自动更新区域配置文件了:

wKiom1aRVVzDjaWcAAC1ezqLGgk233.png


从服务器无需重载配置文件即可查询到主DNS服务器新增的记录了:

wKioL1aRVgfz4maWAACAV_w3VwM151.png


配置从服务器的反向解析区域

On Master(192.168.2.17)

在主DNS服务器上的反向解析区域的数据库文件中添加从服务器的NS记录和PTR指针记录

wKioL1aRWh6wv7PGAABO0N-2-Ac285.png

wKiom1aRWl-xC9uMAAAbQ8YfSPs475.png


On Slave(192.168.2.18)

添加反向解析的区域配置文件

wKioL1aRS7Gi1lL9AAAIQt7GT_s455.png

wKiom1aRV8_yGTqbAAATiQyT9Os225.png


wKioL1aRWGCRkUM1AAAGjmAc4yE758.png

wKioL1aRWwzxbkboAAAUUYtzdSE231.png

wKiom1aRW0yQHMGwAACNLbNwBEw327.png



On Master(192.168.2.17)

再次在主DNS服务器上新增一条反向解析记录:

wKiom1aRXD2yEvYgAABTA04ELjI759.png


wKioL1aRXK6BS3LfAAAJA4xVKb4988.png



On Slave(192.168.2.18)

从服务器接收到主服务器的反向解析文件更新序列号通知并自动更新其区域配置文件

wKiom1aRXRHyeUZ2AACEAuxEqag508.png


手动执行区域传送

On Master(192.168.2.17)

wKiom1aR4M2RZ9RaAACPcYcLGqY333.png


On Slave(192.168.2.18)

手动执行正向区域传送

wKiom1aR4UaTxvBTAACTNMDc5xY657.png


手动执行反向区域传送

wKiom1aR4Y6yN5wAAACRC-Pga7w548.png


注意:主DNS服务器应该配置访问控制权限,只开放仅有从DNS服务器能传送的权限。




================================================================================

子域授权:

正向解析区域授权子域的方法:

在正向区域中定义子域的主从服务器的NS记录和A记录即可,子域也应有主从DNS服务器

ops.coffeeyep.com. IN NS  ns1.ops.coffeeyep.com.

ops.coffeeyep.com. IN NS  ns2.ops.coffeeyep.com.

ns1.ops.coffeeyep.com. IN A IP.AD.DR.ESS

ns2.ops.coffeeyep.com. IN A IP.AD.DR.ESS


On Master(192.168.2.17)

在父域授权子域,编辑正向解析区域文件:wKiom1aR-tvA3CZjAABl6lU_T_U165.pngwKiom1aR50rA5SRwAAAJG9JLQ-I372.png


On Subns1(子域主DNS服务器,192.168.2.19):


/* (使用本地yum源出问题了,重建下缓存)

wKioL1aR6uOy6k3XAABbulclgwQ384.png/*


wKioL1aR6xvAFwI_AAAqaMNwQew015.png


wKioL1aR7PaQbsBzAAAHepEK1bs829.png

wKiom1aR7Mqz2p2rAABpYH1oV7g992.png

wKioL1aR7PeAfDkeAAAGfu3MiWo002.png

wKioL1aR7PiQpxxzAAAq0L89XwA076.png

wKiom1aR7M3TNzbqAAA4O5QnUXQ371.png



查看当前主机的53号端口处于监听状态,就可以作为缓存名称服务器使用了

配置子域ops.coffeeyep.com的主DNS服务器的正向解析区域和区域配置文件

wKiom1aR7hWj97hHAAAIfT3myrc078.png

wKioL1aR7kLjpRhgAAAL_18fSB8421.png

wKioL1aR7_TTzcS0AAAqigqlD3I012.png

wKioL1aR8NnjmGsBAABwPDa1Zco429.png
wKiom1aR8RSxHaXSAAB2_pBacCw201.png



On Master(192.168.2.17)

在父域上可以解析子域了:



定义转发:

注意:被转发的服务器必须允许为当前服务器做递归;

(1) 区域转发:仅转发对某特定区域的解析请求;

zone  "ZONE_NAME"  IN {

    type  forward;

    forward  {first|only};

    forwarders  { SERVER_IP; };     //定义转发给哪台DNS服务器

};

first:首先转发;转发器不响应时,自行去迭代查询;

only:只转发;


On Subns1(192.168.2.19):

wKioL1aR9XDQcm6wAAAIwQTaB7s645.png

wKiom1aR9UTxGrf8AAARh4Zy7Zs961.png

wKioL1aSAzKBeL5BAAAO70cIf4c768.pngwKiom1aSBDKzBQ4EAACRlM4NJNM598.png

(2) 全局转发:针对凡本地没有通过zone定义的区域查询请求,统统转给某转发器;

options {

    ... ...

    forward  {only|first};

    forwarders  { SERVER_IP; };

    .. ...

};

On Subns1(192.168.2.19):

wKioL1aR7PaQbsBzAAAHepEK1bs829.png

wKiom1aSBQOD-W6BAAA5MG4FwHY425.png

wKiom1aSBeax4qEoAACMLbe5Shs230.png




================================================================================

bind中的安全相关的配置:


acl:访问控制列表;把一个或多个地址归并为一个命名的集合,随后通过此名称即可对此集全内的所有主机实现统一调用控制;

acl  acl_name  {

    ip;

    net/prelen;

};

示例:

acl  mynet {

    172.16.0.0/16;

    127.0.0.0/8;

};

bind有四个内置的acl

    none:没有一个主机;

    any:任意主机;

    local:本机;

    localnet:本机所在的IP所属的网络;

访问控制指令:

allow-query  {};  允许查询的主机;白名单;

allow-transfer {};  允许向哪些主机做区域传送;默认为向所有主机;应该配置仅允许从服务器;

allow-recursion {}; 允许哪此主机能向当前DNS服务器发起递归查询请求; 默认所有主机

allow-update {}; DDNS,允许动态更新区域数据库文件中内容;如果没有使用DDNS,每个区域默认都应设置为none


On Master(192.168.2.17)

定义acl,注意acl的位置需在options之前

wKioL1aSCReAd_YxAAA8y1Hsu5Q697.png


在区域中添加acl表示只对此区域生效,仅允许本机和从服务器做传送;wKioL1aR9XDQcm6wAAAIwQTaB7s645.png

wKiom1aSCXDROP1LAAAP906su10152.png

wKioL1aSCizhrZ8TAAAOjtDA5sU347.png


On Subns1(192.168.2.19):

由于不在192.168.2.17的acl白名单中,因为不能通过其做区域传送了

wKioL1aSCwjC11J6AAAaEGXTxuM355.png


On Master(192.168.2.17)

配置允许递归查询的acl

wKiom1aSDQSzzYqJAAAG7rXjlsc203.png

wKioL1aSDTLyx90MAACDIecA8GA121.pngwKioL1aSCizhrZ8TAAAOjtDA5sU347.png



================================================================================

bind view(智能DNS):


视图:

view  VIEW_NAME {

    zone

    zone

    zone

}

例如:使用view定义内网和外网的用户分别得到不同的解析结果,优先匹配的位置要放在上面定义,这样不同的view可以得到不同的解析结果,完成智能解析

view internal  {

    match-clients { 172.16.0.0/8; };

    zone "coffeeyep.com"  IN {

        type master;

        file  "coffeeyep.com/internal";

    };

};

view external {

    match-clients { any; };

    zone "coffeeyep.com" IN {

        type master;

        file coffeeyep.com/external";

    };

};