路漫漫其修远兮
吾将上下而求索

dns学习:bind服务搭建

DNS基础01

  1. Sockets:C/S:

    1. Client:发起应用请求的程序

    2. Server:响应请求(提供服务)的程序;

    3. 传输层协议:TCP,  UDP,  SCTP

      1. TCP:Transmission Control Protocol

        1. 面向连接的协议:双方通信前要先建立虚连接

      2. UDP:User Datagram Protocol

        1. 无连接协议:双方无需通信前需要事先建立连接

  2. DNS:Domain Name Service,应用层协议,名称转换,人最易记字母,机器最易记数字,所以要进行名称转换,将人易记得名字转换为机器易识别的数字。

    1. 53端口/UDP,UDP用于解析,TCP用于传送,

    2. www.xxx.com: FQDN( Full Qualfied Domain Name )

    3. tld:Top Level Domain

      1. 组织域:.com  .org  .edu  .mil  .gov

      2. 国家域:.cn .hk  .tw

    4. 访问域名时,当第一次查host文件,有域名,完成,没有的话查本地缓存,有域名,完成,没有的话查DNS服务器,返回结果,

    5. 每个缓存都应该有生存时间,过期要重新去DNS查询,以防对方IP发生变化解析错误。当服务器自己的IP发生变化的时候要向DNS请求更改,以便正常工作。

  3. DNS查询:

    1. 递归查询:

    2. 迭代查询:

  4. 示例:假如电脑现在要和www.sina.com.cn通信,要先知道这个域名对应的ip地址,然后才能进行通信。查询IP的过程:电脑的网络设置上面填写有DNS服务器地址,电脑首先去本机的host文件中查找,如果没有,再去本地的缓存中去寻找,如果没有,将查找的请求发送给设置的DNS服务器A。DNS服务器收到查询请求后,先查询自己的缓存,如果没有,将这个请求发送给根域名服务器,根域名服务器,看到该顶级域名为.cn,则将.cn对应域名解析服务器B的地址发送给A,A再根据根域名服务器返回的地址去找B查询,B看到请求时.cn的请求,是自己下面的域名,查询到自己下面的.com域名服务器C地址,将C的地址返回给A,A去C .com服务器上查询地址,C查询到sina的服务器地址后,将sina服务器对应的IP地址返回给A,A将www.sina.com.cn保存在本地一份,以防其他人再查询,A再将最终地址返回给客户主机,这样,主机就能正常通行了。因为本地DNS服务器有.cn的缓存,当再次请求以.cn结尾的域名的时候,会直接去.cn的DNS服务器请求,不会去根那里访问的,因为,已经有.cn的DNS服务器的IP地址了,提高解析效率。

  5. 全世界所有电脑,每次查询都是去根域名服务器查询请求,所以根域名服务器非常重要,而中国没有一台根域名服务器,大部分在美国。当发生战争,美国把根域名服务器线路掐断,那么中国的所有电脑都不能成功解析域名。不能访问目标站点,全部瘫痪。后果非常严重。

  6. DNS劫持:

dns.graphml

  1. DNS名称解析方式:

    1. 域名—IP:正向解析

    2. IP—域名:反向接卸

  2. 当注册了域名:xxx.com,下面的子域名都属于自己所有,要其中一个服务器A运行DNS程序,来管理这个域的所有主机,里面包含了每个子域名对应的IP地址,当有请求要查询mail.xxx.com的时候,.com的DNS服务器会将管理xxx.com的服务器A的IP返回给请求服务器E,请求的服务器E去A那里查寻mail.xxx.com的地址,A返回给E  B的地址,进行通信,就是说xxx.com里面是自治的,自己管理自己,但是要去.com服务器去注册,让对方知道自己的域名。

    1. ftp.xxx.com

    2. mail.xxx.com

    3. cloud.xxx.com

    4. www.xxx.com

server.graphml

  1. 但现在很多服务器都没有安装DNS解析,假如在万网上注册了一个域名,万网可以帮实现域名解析,只要在万网上面将自己的服务器的IP地址填到万网的服务器上面,万网会帮用户来进行解析,并将用户填写的IP返回给请求的服务器。

  2. DNS服务器类型:

    1. 负责解析至少一个域:

      1. 主名称服务器;

      2. 辅助名称服务器

    2. 不负责解析:

      1. 缓存名称服务器:比如上面的E,与客户机直接连接的服务器

01完


DNS基础02

  1. 解析结果:

    1. 肯定答案:有结果;同时缓存

    2. 否定答案:不存在查询的结果,不存在与其对应的值;同时缓存

  2. 主-辅DNS服务器

    1. 当负责解析的服务器挂了,怎么办。

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

    3. 从DNS服务器:从主DNS服务器那里或者其他从DNS服务器“复制”一份解析库,但只能进行读操作,

      1. 复制操作的实施方案:

        1. 序列号:serial、也即是数据库的版本号,主服务器数据库内容发生变化时,其版本号递增;

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

        3. 重试时间间隔:retry,当主服务器没有应答的时候有两种状况(服务器忙,没时间,主服务器挂了);从服务器器从主服务器请求同步解析库失败时,再次发起尝试请求的时间间隔;

        4. 过期时间:expire、从服务器始终联系不到主服务器时,多久之后放弃从服务器同步数据,停止服务;——————-???为什么要放弃

        5. 否定答案的缓存时长:统一协商否定答案的TTL————-指的是哪个阶段的服务器.com?   只有本地的服务器有缓存?  .com服务器每次都让去找其他人?自己不缓存?那不是很浪费资源,每次都问

      2. 定时更新从服务器也有弊端,当从服务器更新完数据后,主服务器更新了数据,然后挂了,这样从服务器就会丢失数据。主服务器应该每次发生数据变化就及时“通知”从服务器更新数据。

  3. 客户机向指定的DNS服务器A发请求的时候,A是直接去根域名服务器去查询的,而不是自己的上一级服务器域名查询,因为根知道的域名种类更多,概率更大。所以DNS服务器A必须要知道根域名服务器的IP地址,从而能够成功请求。

  4. 区域数据库文件:

    1. 资源记录:Resouce Record,简称rr;

      1. 记录类型:A,AAAA,PTR,SOA,NS,CNAME,MX

      2. SOA:start of authority,起始授权记录,一个区域解析库有且只能有一个SOA记录,而且必须放在第一条

      3. NS:name service,域名服务记录,一个区域解析库可以有多个NS记录,其中一个为主的,

      4. A:address,地址记录,FQDN–> IPV4;

      5. AAAA:地址记录,FQDN–>IPV6

      6. CNAME:canonical name,别名记录;

      7. PTR:pointer,IP–>FQDN

      8. MX:mail exchanger,邮件交换器

        1. 优先级:0-99,数字越小优先级越高

    2. 资源记录定义格式:

      1. 语法:name    [TTL]    IN    RR_TYPE    value

    3. SOA:

      1. name:当前区域的名字;例如:“xxx.com”

      2. value:有多部分组成

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

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

        3. 主从服务协调属性的定义以及否定答案的TTL

      3. 例如:

        1. xxx.com.    86400   IN   SOA    xxx.com.    admin.xxx.com(

        2. 2017010801; serial

        3. 2H               ; refresh

        4. 10M            ; retry

        5. 1W             ;expire    一周

        6. 1D             ; negative answer ttl

        7. )

    4. NS:

      1. name:当前区域的区域名称

      2. value:当前区域的某DNS服务器的名称,例如:ns.xxx.com

        1. 一个区域可以有多个NS记录

      3. 例如:

        1. xxx.com.    86400   IN   NS   ns1.xxx.com.

        2. xxx.com.    86400   IN   NS    ns2.xxx.com.

    5. MX:

      1. name:当前区域的区域名称

      2. value:但钱区域的某邮件交换器的主机名

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

      3. 例如:

        1. xxx.com.     IN   MX    10   mx1.xxx.com.

        2. xxx.com.     IN   MX    20   mx2.xxx.com.

    6. A:

      1. name:某FQDN,例如:www.xxx.com

      2. value:某IPV4地址;

      3. 例如:

        1. www.xxx.com.    IN   A   1.1.1.1

        2. www.xxx.com.    IN   A   2.2.2.2

        3. bbs.xxx.com.    IN   A   1.1.1.1

    7. AAAA:

name:某FQDN,例如:www.xxx.com

    1. value:某IPV6地址;

  • PTR:

    1. name:IP地址,有特定格式,IP反过来写,而且要加特定的后缀,例如:1.2.3.4的记录应该写成4.3.2.1.in-addr.arpa

    2. value:FQND

    3. 例如:

      1. 4.3.2.1.in-addr.arpa    IN   PTR   www.xxx.com

  • CHAME:

    1. name:FQDN格式的别名;

    2. value:FQDN格式的正式名称

    3. 例如:

      1. web.xxx.com   IN  CHAME    www.xxx.com

  • 注意:

    1. TTL可以从全局继承;

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

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

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

02完


03 bind基础配置

  1. bind安装配置:

    1. [root@localhost ~]#yum info bind   查看信息

    2. bind:dns协议的一种实现方式

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

  2. 程序包

    1. bind-libs:被bind和bind-utils包中程序共同用到的库文件

    2. bind-utils:bind客户端程序集

    3. bind:提供dns server的程序,以及几个常用的测试程序

    4. bind-chroot:选装,让一个程序运行在沙箱内,named运行在jall模式下,当进程被劫持了,进程能操作的就只能在沙箱,不怕危害整个系统,为了安全着想,

  3. bind:

    1. 区域解析库存放位置:/var/named

    2. 配置文件:/etc/named.conf     可以使用include来包含其他的文件

      1. /etc/named.iscdlv.key

      2. /etc/named.rfc1912.zones

      3. /etc/named.root.key

    3. 解析库文件:

      1. /var/named/目录下面

        1. 一般名字为:ZONE_NAME.zone

      2. 注意:

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

        2. 必须要有根区域解析库文件:/var/named/named.ca

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

          1. 正向:named.localhost

          2. 反向:named.loopback

    4. rndc:renote name domain contoller

      1. 953/tcp,但默认监听于127.0.0.1地址,因此仅允许本地使用,不允许远程,为了安全

    5. bind程序安装完成后,默认即可做缓存名称服务器使用。(客户机可以将DNS服务器地址设置为该地址),如果没有专门负责解析的区域话,开启服务就可以直接使用

      1. centos6:service named start

      2. centos7:systemctl start named.service

    6. 主配置文件介绍:/etc/named.conf

      1. 配置为缓存名称服务器步骤:本机既当客户端,又当DNS服务器,

        1. 为了安全起见,默认监听端口是53端口{ 127.0.0.1; },只监听本地的IP。因此将{ 127.0.0.1; }改为listen-on port 53 { any; }; 表名监听所有的IP,表示监听外网所有IP的地址。假如说只监听一个IP的DNS请求则只写一个IP地址就可以:listen-on port 53 { 172.16.100.67; };   表示只监听这一个IP

        2. 学习时建议将dnssec关闭,它是对DNS提供给DNS客户端(解析器)的DNS数据来源进行认证

          1. dnssec-enable no;

          2. dnssec-validation no;

        3. 关闭仅允许本地查询:

          1. //allow-query { localhost; };

        4. 这个配置文件是C语言形式的风格,注释的话使用://

        5. [root@cloud /etc]#named-checkconf    检查配置文件的语法错误

        6. 将DNS服务器的地址更改为自己的IP地址,

        7. 关闭防火墙;

        8. [root@cloud /etc]#service named start    打开服务

        9. 查看监听端口:ss -tunlp   是不是53端口和935端口打开

      1. 全局配置段:

        1. options{ … }

      2. 日志配置段:

        1. logging{ … }

      3. 区域配置段:

        1. zone{ … }

          1. 那些由本机负责解析的区域,或者转发的区域,就是胡同主,在这里配置

      4. 注意:每一个配置语句必须以分号结尾,否则,语法错误

  • 测试工具:

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

      1. dig [-t type] [queryopt…] [@server]   以指定IP的DNS服务器来进行查询

      2. 查询选项:

        1. +[no]trace:跟踪解析过程

        2. +[no]recurse:进行递归解析

      3. dig -t A www.baidu.com

      4. 反向解析测试

        1. dig -x IP

      5. 模拟完全区域传送:

        1. dig -t axfr DOMAIN [@server]

    2. host命令:

      1. host [-t RR_TYPE]  name SERVER_IP

    3. nslookup命令:

      1. nslookup [-option] [name] [server]

        1. 交换模式:

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

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

          3. name:查询的名称

        2. 示例:

          1. server 172.18.19.20

          2. set q=A

          3. www.sohu.com

    4. rndc 命令:

      1. rndc  status

      2. rndc flush  清空缓存

  • 假如在互联网上注册了一个域:xxx.com,要为这个域提供解析,首先是一个互联网主机,并且有互联网IP,向互联网注册商申请将DNS地址指向为该主机,就可以开始解析了

    1. 配置解析一个正向区域:

    2. 以xxx.com域为例

      1. 定义区域

        1. 在主配置文件中或主配置文件辅助文件中完成

        2. zone "ZONE_NAME"  IN{

        3. type{master|slave|hint|forward}       指明是主服务器还是从服务器还是根服务器,还是转发服务器

        4. file "ZONE_NAME.zone"             指明配置文件路径

        5. }

      2. 建立区域数据文件

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

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

      4. 具体看下面的操作

    3. 配置解析一个反向区域:

      1. 定义区域

        1. 在主配置文件中或主配置文件辅助文件中完成

        2. zone "ZONE_NAME"  IN{

        3. type{master|slave|hint|forward}       指明是主服务器还是从服务器还是根服务器,还是转发服务器

        4. file "ZONE_NAME.zone"             指明配置文件路径

        5. }

        6. 注意:反向区域的名字;

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

下面的操作都是在一台centos7虚拟机(172.18.19.20)完成

虚拟机配置:可以经过网关访问互联网

TYPE=Ethernet

DEVICE=eno16777736

IPADDR=172.18.19.20

PREFIX=24

DNS1=172.18.19.20

GATEWAY=172.18.19.1

配置正向区域解析

创建配置文件,但是里面的区域数据文件不存在,在最后添加

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

zone "xxx.com"  IN{

type master;

file "xxx.com.zone";

};

所以要在:/var/named文件夹下创建数据文件,named服务是以一个named用户的身份在运行

[root@localhost ~]#cat /etc/passwd |grep named

named:x:25:25:Named:/var/named:/sbin/nologin

这个文件夹的属组是named,而文件夹里面的所有文件的属组都是named组,修改完文件要注意属组的问题

[root@localhost /var]#ll

drwxr-x—.  5 root named 4096 Sep 21 22:21 named

编写下面的文件

[root@localhost /var/named]#cat xxx.com.zone

$TTL 3600

$ORIGIN xxx.com.

@ IN SOA ns1.xxx.com. dnsadmin.xxx.com.  (

2017010801

1H

10M

3D

1D)

IN NS ns1

IN MX 10 mx1

IN MX 20 mx2

ns1 IN A 172.18.19.21

mx1 IN A 172.18.19.22

mx2 IN A 172.18.19.23

www IN A 172.18.19.24

web IN CNAME WWW

bbs IN A 172.18.19.25

bbs IN A 172.18.19.26

检查配置和zone文件语法错误,指明zone和zone的文件位置

[root@localhost /var/named]#named-checkconf

[root@localhost /var/named]#named-checkzone xxx.com  /var/named/xxx.com.zone

zone xxx.com/IN: loaded serial 2017010801

OK

更改属组为named

[root@localhost /var/named]#chown :named *

更改其他权限为0

[root@localhost /var/named]#chmod o= *

没有语法错误,重载,当前有101个zone

[root@localhost ~]#rndc status

version: 9.9.4-RedHat-9.9.4-29.el7 <id:8f9657aa>

CPUs found: 1

worker threads: 1

UDP listeners per interface: 1

number of zones: 101

debug level: 0

xfers running: 0

xfers deferred: 0

soa queries in progress: 0

query logging is OFF

recursive clients: 0/0/1000

tcp clients: 0/100

server is up and running

[root@localhost ~]#rndc reload  或者systemctl reload named.service

server reload successful

重载成功,有102个zone

[root@localhost ~]#rndc status

version: 9.9.4-RedHat-9.9.4-29.el7 <id:8f9657aa>

CPUs found: 1

worker threads: 1

UDP listeners per interface: 1

number of zones: 102

debug level: 0

xfers running: 0

xfers deferred: 0

soa queries in progress: 0

query logging is OFF

recursive clients: 0/0/1000

tcp clients: 0/100

server is up and running

设置成功后开始解析,可以解析成功,本机既当客户端(将本机的DNS服务器地址设置为本机的IP),又当DNS服务器,解析成功后将结果返回给本机的客户端。如果本机的DNS服务器解析不了,将请求经过网关发送给互联网根服务器,迭代请求成功后将结果发送给本机的客户端。

[root@localhost ~]#dig trace -t A bbs.xxx.com

; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7 <<>> trace -t A bbs.xxx.com

;; global options: +cmd

;; Got answer:

;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 24250

;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:

; EDNS: version: 0, flags:; udp: 4096

;; QUESTION SECTION:

;trace. IN A

;; Query time: 2028 msec

;; SERVER: 172.18.19.20#53(172.18.19.20)

;; WHEN: Thu Sep 22 00:18:41 CST 2016

;; MSG SIZE  rcvd: 34

;; Got answer:

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49568

;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:

; EDNS: version: 0, flags:; udp: 4096

;; QUESTION SECTION:

;bbs.xxx.com. IN A

;; ANSWER SECTION:

bbs.xxx.com. 3600 IN A 172.18.19.25

bbs.xxx.com. 3600 IN A 172.18.19.26

;; AUTHORITY SECTION:

xxx.com. 3600 IN NS ns1.xxx.com.

;; ADDITIONAL SECTION:

ns1.xxx.com. 3600 IN A 172.18.19.21

;; Query time: 1 msec

;; SERVER: 172.18.19.20#53(172.18.19.20)

;; WHEN: Thu Sep 22 00:18:41 CST 2016

;; MSG SIZE  rcvd: 109

[root@localhost ~]#dig +trace -t  A www.qq.com     #互联网的域名也可以解析成功,可以看到具体的解析过程

配置反向区域解析:

在最后添加配置zone,注意网络段要反写,意思是解析这个网络段里面的其他主机

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

zone "19.18.172.in-addr.arpa" IN {

type master;

file "172.18.19.zone";

};

添加反向解析配置文件

[root@localhost /var/named]#cat 172.18.19.zone

$TTL 3600

$ORIGIN 19.18.172.in-addr.arpa.

@ IN SOA ns1.xxx.com. nsadmin.xxx.com. (

2017010801

1H

10M

3D

12H)

IN NS ns1.xxx.com.

67 IN PTR ns1.xxx.com.

68 IN PTR mx1.xxx.com.

69 IN PTR mx2.xxx.com.

70 IN PTR bbs.xxx.com.

71 IN PTR bbs.xxx.com.

67 IN PTR www.xxx.com.

[root@localhost /var/named]#chgrp named 172.18.19.zone

[root@localhost /var/named]#chmod o= *

[root@localhost /var/named]#named-checkconf

[root@localhost /var/named]#named-checkzone 19.18.172.in-addr.arpa  /var/named/172.18.19.zone     #区域名必须要和配置文件中定义的名字保持一致

zone 19.18.172.in-addr.arpa/IN: loaded serial 2017010801

OK

[root@localhost /var/named]#rndc reload

server reload successful

[root@localhost /var/named]#rndc status

[root@localhost ~]#dig -x 172.18.19.67   #可以解析出来一个ip对应有两个名字,成功。

; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7 <<>> -x 172.18.19.67

;; global options: +cmd

;; Got answer:

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58193

;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:

; EDNS: version: 0, flags:; udp: 4096

;; QUESTION SECTION:

;67.19.18.172.in-addr.arpa. IN PTR

;; ANSWER SECTION:

67.19.18.172.in-addr.arpa. 3600 IN PTR ns1.xxx.com.

67.19.18.172.in-addr.arpa. 3600 IN PTR www.xxx.com.

;; AUTHORITY SECTION:

19.18.172.in-addr.arpa. 3600 IN NS ns1.xxx.com.

;; ADDITIONAL SECTION:

ns1.xxx.com. 3600 IN A 172.18.19.21

;; Query time: 0 msec

;; SERVER: 172.18.19.20#53(172.18.19.20)

;; WHEN: Thu Sep 22 13:49:50 CST 2016

;; MSG SIZE  rcvd: 130

换另一个虚拟机当做客户端,将DNS服务器指向上面这台DNS服务器(172.18.19.20),并发起DNS请求,看是否能够解析成功。

另一台虚拟机配置:可以访问互联网

DEVICE=eth2

IPADDR=172.18.19.10

PREFIX=24

DNS1=172.18.19.20

GATEWAY=172.18.19.1

[root@localhost ~]#dig +trace -t A www.souhu.com   #可以解析成功

03 完


04 bind高级应用(配置主从服务器架构)

02650AE7B3884C77BCA386AC702049B5.jpg

  1. 主从服务器:

    1. 从服务器是区域级别的概念

    2. 主从DNS服务器负载均衡:两台DNS服务器,A和B,可以将DNS服务器A配置为正向解析的主服务器,反向解析的从服务器,将DNS服务器B配置为正向解析的从服务器,反向解析的主服务器,为了将两台服务器负载均衡,可以将本地区域内的一半客户机的/etc/resove.conf文件中DNS1配置为A,DNS2配置为B,本地区域另一半客户机的/etc/resove.conf文件中DNS1配置为B,DNS2配置为A,这样有一半的客户机去A请求解析,一半的客户机去B请求解析,这样,就可以用简单的方法实现解析的负载均衡。而对应互联网上的要求解析xxx.com的请求,要实现负载均衡的解析,(A和B同时工作),则要向上级.com域名解析那里建立两个DNS记录,两个DNS服务器的IP。响应的时候让.com对发来的请求发送给A,下一次请求发送给B ,这样轮询。来达到均衡。

    3. 当然互联网上的其他客户机也可以将DNS解析服务器设置为A和B,客户的请求发送给A和B,本地的DNS服务器去互联网迭代请求,最后将请求返回给客户机,一般不这样做,因为资源有限,只会解析本地的客户机的DNS请求,和互联网上需要解析本地服务器的请求,就是请求xxx.com的域名对应的IP要返回请求,要最终答案的。其他迭代请求不予理会。要做访问控制列表来控制。

  2. 配置从服务器(三台虚拟机,主DNS,从DNS,客户机)

    1. 定义一个从区域:

      1. zone "ZONE_NAME"  IN {

      2. type  slave;

      3. file "slaves/ZONE_NAME.zone";

      4. masters  { MASTER_IP; };

      5. }

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

      7. 重载配置:rndc reload

      8. 具体见下面的操作

      9. 注意时间同步,ntpdate命令;两台服务器要时间同步,才能保证正常的工作。

www.qq.com

www.163.com

www.alipay.com

www.baidu.com

www.taobao.com

andy-blog.org

www.jd.com


实验说明:

三台虚拟机(主DNS服务器centos6:172.18.19.10,  从DNS服务器centos7:172.18.19.20,  客户机centos7:172.18.19.30)

配置正向解析的从DNS服务器(172.18.19.20)

[root@localhost ~]#yi bind    #安装DNS命令

[root@localhost /etc]#iptables -F         #不然后面的实验失败,报文进不来

[root@localhost ~]#vim /etc/named.conf

listen-on port 53 { 127.0.0.1; 172.18.19.20; };      #监听ip加上自己的ip,监听(172.18.19.20:53)这个套接字,如果数据从这里进来,要进行处理

dnssec-enable no;    #关闭校验机制

dnssec-validation no;

#allow-query     { localhost; };    #注释只允许本机查询,表示接受其他客户端的请求

网关设置为(172.18.19.1)表示可以连接互联网

[root@localhost /etc]#systemctl restart named.service     #开启DNS服务

当需要重新测试功能的时候可以使用:rndc flush 命令来清空DNS的缓存,试验结果为真实的结果

——————————————————————————

上面配置完成后就可以当做一台缓存DNS服务器来使用,本机和其他(DNS设置为20)的客户机可以通过20的DNS服务器来解析域名

——————————————————————————

[root@localhost /etc]#vim named.rfc1912.zones    #在最后添加

zone "xxx.com"  IN {

type slave;

file "slaves/xxx.com.zone"

masters { 172.18.19.10; };

};

[root@localhost /etc]#named-checkconf   #检查错误

默认情况下:/var/named文件夹属主root,属组named,named进程是named用户来执行,但是属组没有写权限,这是为了以防named用户被黑客劫持后将这个文件夹里面的数据全部删除掉,但是作为从服务器要同步主服务器的数据,要往里面写数据,所以在文件夹里面单独创建一个属组有写权限的文件夹(slaves)来同步数据。里面的数据会自动同步后生成,不用人工干预。

[root@localhost /var]#ll

drwxr-x—.  5 root named 4096 Sep 23 21:10 named

[root@localhost /var/named]#ll

drwxrwx—. 2 named named    6 Mar 16  2016 slaves

配置正向解析的主DNS服务器(172.18.19.10)

[root@localhost ~]#yum info bind       #确保已经安装DNS服务器工具bind

[root@localhost ~]#yi bind    #安装DNS命令

[root@localhost /etc]#iptables -F         #不然后面的实验失败,报文进不来

[root@localhost ~]#vim /etc/named.conf

listen-on port 53 { 127.0.0.1; 172.18.19.10; };      #监听ip加上自己的ip,监听(172.18.19.10:53)这个套接字,如果数据从这里进来,要进行处理

dnssec-enable no;    #关闭校验机制

dnssec-validation no;

#allow-query     { localhost; };    #注释只允许本机查询,表示接受其他客户端的请求

网关设置为(172.18.19.1)表示可以连接互联网

[root@localhost ~]#service named restart     #开启DNS服务

当需要重新测试功能的时候可以使用:rndc flush 命令来清空DNS的缓存,试验结果为真实的结果

——————————————————————————

上面配置完成后就可以当做一台缓存DNS服务器来使用,本机和其他(DNS设置为10)的客户机可以通过10的DNS服务器来解析域名

——————————————————————————

[root@localhost ~]#vim /etc/named.rfc1912.zones    #添加配置

zone "xxx.com"  IN{

type master;

file "xxx.com.zone";

};

[root@localhost /var/named]#cat xxx.com.zone

$TTL 3600

$ORIGIN xxx.com.

@ IN SOA ns1.xxx.com. dnsadmin.xxx.com. (

2017010801

1H

10M

3D

1D)

IN NS ns1

IN NS ns2

IN MX 10 mx1

IN MX 20 mx2

ns1 IN A 172.18.19.10

ns2 IN A 172.18.19.20

mx1 IN A 172.18.19.21

mx2 IN A 172.18.19.22

www IN A 172.18.19.10

web IN CNAME www

bbs IN A 172.18.19.23

bbs IN A 172.18.19.24

更改属组为named

[root@localhost /var/named]#chown :named *

更改其他权限为0

[root@localhost /var/named]#chmod o= *

[root@localhost /var/named]#rndc reload

设置本机的DNS解析地址指向自己,可以看到解析成功

[root@localhost /var/named]#dig -t A bbs.xxx.com

在正向解析从DNS机器上操作(172.18.19.20)

[root@localhost /var/named/slaves]#rndc reload

server reload successful

[root@localhost /var/named/slaves]#systemctl status named    #在状态里面可以看到详细的同步过程。

[root@localhost /var/named/slaves]#ll       #可以发现slaves目录下面出现了同步过来的数据

total 4

-rw-r–r–. 1 named named 567 Sep 24 15:10 xxx.com.zone

解析一个域名,指明用从DNS服务器来解析,检查是否同步正常。

[root@localhost /var/named/slaves]#dig -t A web.xxx.com @172.18.19.20

; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7_2.3 <<>> -t A web.xxx.com @172.18.19.20

;; global options: +cmd

;; Got answer:

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 37946

;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 3

;; OPT PSEUDOSECTION:

; EDNS: version: 0, flags:; udp: 4096

;; QUESTION SECTION:

;web.xxx.com. IN A

;; ANSWER SECTION:

web.xxx.com. 3600 IN CNAME www.xxx.com.

www.xxx.com. 3600 IN A 172.18.19.10

;; AUTHORITY SECTION:

xxx.com. 3600 IN NS ns1.xxx.com.

xxx.com. 3600 IN NS ns2.xxx.com.

;; ADDITIONAL SECTION:

ns1.xxx.com. 3600 IN A 172.18.19.10

ns2.xxx.com. 3600 IN A 172.18.19.20

;; Query time: 0 msec

;; SERVER: 172.18.19.20#53(172.18.19.20)

;; WHEN: Sat Sep 24 15:14:38 CST 2016

;; MSG SIZE  rcvd: 145

在正向解析主DNS机器上操作(172.18.19.10)

添加一条记录,

[root@localhost /var/named]#vim xxx.com.zone

2017010802 #同时更改记录+1 ,很重要,这样检查到序列号不一样,会自动同步

pops    IN      A       172.18.19.25

[root@localhost /var/named]#rndc reload  #主DNS上重新加载,这样从DNS服务器就会自动同步好,这样就直接可以用从DNS来解析pops域名了

server reload successful

在正向解析从DNS机器上操作(172.18.19.20)

[root@localhost /var/named/slaves]#systemctl status named

Sep 24 15:23:08 localhost.localdomain named[6487]: zone xxx.com/IN: transferred serial 2017010802

[root@localhost /var/named/slaves]#dig -t A pops.xxx.com @172.18.19.20   可以成功解析,换成客户端也是可以成功解析的

在正向解析主DNS机器上操作(172.18.19.10)

反向解析从服务器配置:

[root@localhost /etc]#vim named.rfc1912.zones

zone "19.18.172.in-addr.arpa" IN {

type slave;

file "slaves/172.18.19.zone";

master { 172.18.19.10; };

};

[root@localhost /etc]#named-checkconf  #检查错误

[root@localhost /var/named]#cat /var/named/172.18.19.zone

$TTL 3600

$ORIGIN 19.18.172.in-addr.arpa.

@ IN SOA ns1.xxx.com. nsadmin.xxx.com. (

2017010801

1H

10M

3D

12H)

IN NS ns1.xxx.com.

IN NS ns2.xxx.com.

67 IN PTR ns1.xxx.com.

68 IN PTR ns2.xxx.com.

69 IN PTR mx1.xxx.com.

[root@localhost /var/named]#named-checkzone 19.18.172.in-addr.arpa /var/named/172.18.19.zone

zone 19.18.172.in-addr.arpa/IN: loaded serial 2017010801

OK

[root@localhost /var/named]#chmod o= *

[root@localhost /var/named]#chown :named *

[root@localhost /etc]#rndc reload

在反向解析从DNS机器上操作(172.18.19.20)

[root@localhost /var/named/slaves]#rndc reload

server reload successful

[root@localhost /var/named/slaves]#systemctl status named    #在状态里面可以看到详细的同步过程。

[root@localhost /var/named/slaves]#ll       #可以发现slaves目录下面出现了同步过来的数据

total 4

-rw-r–r–. 1 named named 567 Sep 24 15:10 172.18.19.zone

解析一个域名,指明用从DNS服务器来解析,检查是否同步正常。

[root@localhost /var/named/slaves]#dig -x 172.18.19.69 @172.18.19.20   可以正常工作。


子域授权,ops.xxx.com   三级域解析

在父域主域正向DNS服务器zone中添加一条

在正向解析主DNS机器上操作(172.18.19.10)

[root@localhost /var/named]#vim xxx.com.zone

2017010803 #更新序列号

ops IN NS ns1.ops

ns1.ops IN A 172.18.19.30

[root@localhost /var/named]#rndc reload

server reload successful

因为里面的条目没有xxx.com的都会自动添加上去,因此上面添加的实际是

ops.xxx.com IN NS ns1.ops.xxx.com  

ns1.ops.xxx.com IN A 172.18.19.30

在正向解析子DNS机器上操作(172.18.19.30)

安装配置好为一个能正常工作的缓存域名服务器

[root@localhost ~]#vim /etc/named.rfc1912.zones  #添加一条配置文件来解析该域下的所有服务器。

zone "ops.xxx.com" IN {

type master;

file "ops.xxx.com.zone";

};

[root@localhost /var/named]#cat ops.xxx.com.zone #添加一个zone文件

$TTL 3600

$ORIGIN  ops.xxx.com.

@ IN SOA ns1.ops.xxx.com. nsadmin.ops.xxx.com. (

2018010801

1H

10M

1D

2H )

IN NS ns1

ns1 IN A 172.18.19.30

www IN A 172.18.19.30

[root@localhost /var/named]#named-checkzone ops.xxx.com /var/named/ops.xxx.com.zone     #注意zone名称要和named.rfc1912.zones里面的名称一样,切记,坑,坑

zone ops.xxx.com/IN: loaded serial 2018010801

OK

[root@localhost /var/named]#chmod o= *

[root@localhost /var/named]#chown :named *

[root@localhost /var/named]#rndc reload

server reload successful

这样就可以解析三级域了,不管是父域还是子域都可以解析(10,20,30)都可以

dig -t A www.ops.xxx.com

——————————————————————————————–

这是可以在(172.18.19.30)这台机器上安装httpd服务,在:/var/www/html目录里面建立一个网页,将物理电脑的DNS填写为(172.18.19.20),在浏览器里面输入:www.ops.xxx.com,就可以看到定义的网页了。

原理:在电脑的浏览器里面输入:www.ops.xxx.com,电脑会去设定的DNS服务器去请求解析,而(172.18.19.20)收到请求,发现是xxx.com的子域名,就会查找本地的DNS解析表,找到子域的DNS服务器IP,向子域DNS(172.18.19.30)请求子域名的ip,将结果返回给(172.18.19.20),(172.18.19.20)将结果(172.18.19.30)返回给电脑物理机,物理机根据返回的解析结果和(172.18.19.30:80)进行httpd通信,将页面显示在浏览器里面,(172.18.19.30)既是一个DNS服务器,又是一个httpd服务器。

注意:本地有dns缓存,为了提高访问速度。指向的DNS服务器也有缓存,为了提高访问速度,如果访问过一次,再次测试的时候,要清除缓存,这样实验结果才是准确的,不然都是电脑直接读的缓存。

物理机:ipconfig /displaydns 查看本地缓存的DNS信息;输入 ipconfig /flushdns 清除本地缓存的DNS信息

dns服务器:清除缓存:rndc  flush

—————————————————————————————–

当客户机将DNS服务器的IP设置为(172.18.19.30)的时候,请求xxx.com域名,服务器会去向根找xxx.com,然后一层一层解析,可以直接指定子DNS服务器如果请求xxx.com直接向指定的服务器去请求,不用再去根那里绕一大圈,

在子DNS(172.18.19.30)里面配置

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

zone  "xxx.com"  IN {

type forward;

forward only;

forwarders { 172.18.19.10;  172.18.19.20; };

}

—————————————————————————————-

定义转发:

区域转发:仅转发对特定区域的解析请求:

zone  "ZONE_NAME"  IN {

type forward;

forward {first|only};

forwarders { SERVICE_IP };

}

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

only:只转发,

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

在:/etc/named.conf文件里面

options {

……

forward {only|first};

forwarders { SERVER_IP; };

…….

}


bind中的安全相关的配置:

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

acl acl_name{

ip;

net/prelen;  #网段也可以

}

示例:

acl mynet{

172.18.19.0/24;

127.0.0.0/8;

}

bind有四个内置的acl

none:没有一个主机

any:任意主机

local:本机

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

访问控制指令:

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

allow-transfer {};  允许向哪些主机做传送,默认为向所有主机,但是不安全,应该设置为只允许本地区域的从服务器

allow-recursion {};  允许哪些主机向此DNS服务器发起递归查询请求;

allow-update {};  DDNS, 允许动态更新区域数据库文件中内容(一般关闭掉,)

————————————————————————————————-

[root@localhost ~]#dig -t axfr xxx.com #区域传送,表示将目标DSN服务器的DNS条目发送给自己,将可以看到目标DNS解析的域的的所有解析条目信息。为了安全,应该一般情况下只允许本区域的其他DNS来请求此消息,互联网上的客户机和本地的客户机都不应该允许他们请求此消息。

设置:(172.18.19.10)

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

zone "xxx.com" IN {

type master;

file "xxx.com.zone";

allow-transfer { slaves; };   #表面只允许定义的slave区域传送

};

[root@localhost ~]#vim /etc/named.conf

acl slaves {    #最前面添加定义的主机

172.18.19.20;

127.0.0.1;

};

listen-on port 53 { 172.18.19.10; };    #只监听(172.18.19.10:53)这个套接字;

[root@localhost ~]#rndc reload

server reload successful

[root@localhost ~]#dig -t axfr xxx.com @172.18.19.10    #在(172.18.19.10)主机操作

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6 <<>> -t axfr xxx.com @172.18.19.10

;; global options: +cmd

; Transfer failed.

[root@localhost ~]#dig -t axfr xxx.com @172.18.19.10    #在(172.18.19.20)主机操作

可以显示数据

[root@localhost ~]#dig -t axfr xxx.com @172.18.19.10    #在(172.18.19.30)主机操作

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6 <<>> -t axfr xxx.com @172.18.19.10

;; global options: +cmd

; Transfer failed.

分析

因为(172.18.19.10)主机既当客户端,又当DNS服务器,但是属于同一主机的不同的两个进程,上面设置的DNS进程监听的是(172.18.19.10:53)这个套接字,但是(172.18.19.10)这个客户机不在slaves名单里面,所有不能够获得区域传送数据,

因为(172.18.19.20)IP在slaves列表里面,所以可以访问,

因为(172.18.19.30)IP不在slaves列表里面,所以不可以访问,

可以认为是(172.18.19.10)在一块网卡上面,(127.0.0.1)在这台主机的另一块网卡上面, 要监听这个网卡的套接字(127.0.0.1:53)才能访问。就像电脑有三块网卡,无线网卡,物理网卡(10.1.250.1),环回网卡(127.0.0.1),当监听(10.1.250.1)这个地址,并且在名单里面,则10这个网段的所有主机都可以访问

[root@localhost ~]#vim /etc/named.conf

acl slaves {    #最前面添加定义的主机

172.18.19.20;

127.0.0.1;

};

listen-on port 53 { 172.18.19.10; 127.0.0.1; };  #配置为同时监听这两个IP的套接字

[root@localhost ~]#rndc reload

server reload successful

[root@localhost ~]#dig -t axfr xxx.com @127.0.0.1

可以显示数据,因为监听了这块网卡,并且在名单里面,

[root@localhost ~]#dig -t axfr xxx.com @172.18.19.10

不可以,虽然监听了这个网段,但是172.18.19.10  不在名单,

—————————————————————————————–

配置只允许某些IP递归

[root@localhost ~]#vim /etc/named.conf

acl mynet {

172.18.19.30;

}

allow-recursion{ mynet; };    #设置为只有172.18.19.30这个主机才能给递归查询。

测试:将20,30的DNS设置为10,则

[root@localhost ~]#dig -t A andy.org    #(172.18.19.20)

查不到结果

[root@localhost ~]#dig -t A andy.org    #(172.18.19.30)

可以查询到结果,说明给递归查询了。

———————————————————————————————-

两个从DNS应该都不允许传送,(172.18.19.20)(172.18.19.30)

因此设置为

[root@localhost ~]#vim /etc/named.rfc1912.zones    #在(172.18.19.20)

zone "xxx.com"  IN {

type slave;

file "slaves/xxx.com.zone";

masters { 172.18.19.10; };

allow-transfer { none; };

};

这样,在(172.18.19.30)就查询不到传送数据了

[root@localhost ~]#dig -t axfr xxx.com @172.18.19.20     #操作在(172.18.19.30)

; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7_2.3 <<>> -t axfr xxx.com @172.18.19.20

;; global options: +cmd

; Transfer failed.

———————————————————————————————-

bind view :

视图:

view VIEW_NAME{

zone

zone

zone

}

view internal {

match-client { 172.18.19.0/24; };       #对应(172.18.19.0/24;)的网段解析到这个zone

zone "xxx.com" IN{

type master;

file "xxx.com/internal";

};

};

view external {

match-client { any; };   #其余解析到这个zone中。匹配是从上往下的,如果上面匹配到以后就不会匹配下面的地址,也可以定义一个acl,将地址都放到里面,这样比较简单。

zone "xxx.com" IN {

type master;

file "xxx.com/external";

};

};

whois命令;

04完

未经允许不得转载:江哥架构师笔记 » dns学习:bind服务搭建

分享到:更多 ()

评论 抢沙发

评论前必须登录!