一、DNS

1、HOSTS文件

#本地名称解析配置文件

#DNS出现前,就使用此文件进行解析

cat /etc/hosts

 

注意:

  • 本地hosts文件和DNS查询的顺序由/etc/nsswitch.conf定义

  • 文件/etc/nsswitch.conf(name service switch configuration,名字服务切换配置)规定通过哪些途径以及按照什么顺序来查找特定类型的信息

 

cat /etc/nsswitch.conf

hosts:      files dns myhostname

  • hosts,表示要查找主机名称信息时,按后面跟的方法,从左往右进行查询,查到为止。

  • files,指本地文件,也就是/etc/hosts

  • dns,表示去dns查

  • myhostname,表示自己的主机名

 

2、DNS架构

    DNS,采用的是C/S架构,使用一种分布式数据库,有严格的上下级关系,上级仅知道其直接下级,而下级只知道根的位置。当我们要解析某个主机名的时候,先从最上级进行查找,然后逐级往下查找,最终返回结果。

最上级的是根域,用.表示根域,根域下又有许多TLD。

 

TLD,Top Level Domain顶级域,顶级域又分为:

  • 组织域:如:.com,.org,.net,.cc等等

  • 国家域:如:.cn,.hk,.iq,.ir,.jp,.us等等

 

图片

 

树型结构

  • 所有域名都是从根开始,默认域名后面是自带有一个点(.),表示根

  • 比如:www.redhat.com,这是FQDN(完全合格域名)

  • 全球共有13个根域服务器,10个在美国,2个在欧洲,1个在日本

  • 对于每一个域而言,一定会至少有一个DNS服务器为它解析

  • 对于DNS服务器而言,记录了该域的下级域的DNS服务器的IP地址

  • 每个子域服务器一定会有根域的DNS服务器IP,可在DNS服务器下/var/named/named.ca文件查看到所有的根DNS服务器的域名和IP

  • 叶子DNS服务器会记录这个域的主机名字和对应的IP,所谓叶子DNS服务器,也就是说它下面没有子域了

 

3、FQDN

    域名(Domain Name)分为两种,一种是绝对域名(Absolute Domain Name,也称为 Fully-Qualified Domain Name,简称 FQDN),另一种是相对域名(Relative Domain Name,也称为 Partially Qualified Domain Name,简称PQDN)。FQDN 是完整域名,它能够唯一地在DNS名字空间中确定一个记录。比如最高级别的域名A包括子域名B它又包括子域名C,那么FQDN 是 C.B.A.,比如ww.baidu.com.。有时候我们也会使用PQDN,它是不完全的、模糊的。

    FQDN 能被直接到DNS名字服务器中查询;而PQDN需要先转化为FQDN 再进行查询。其做法是将PQDN附加一个搜索域名(search domain)来生成一个 FQDN。在域名系统中,域名结尾是否是点(.)被用来区分FQDN和PQDN。比如 www.baidu.com. 表示一个FQDN,而www则表示一个PQDN

 

4、DNS查询过程

  • 递归查询:只发出一次请求,就返回结果,如:客户端向DNS服务器的查询

  • 迭代查询:发出多次请求,比如:DNS服务器从根开始查询

 

    在实际的网络中,一般采用两段式查询过程,即先递归,后迭代。客户端主机到本地域名服务器采用递归查询,而从本地域名服务器到最终结果则采用迭代方式查询。

图片

 

 

我们以查询www.redhat.com为例来了解DNS查询的过程:

  • 本地客户端将www.redhat.com的查询提交给本地DNS服务器,此时采用递归查询方式。

  • 本地DNS服务器检查区域数据文件,由于此服务器不负责redhat.com的解析,因此,本地DNS服务器将查询传递到根服务器,请求解析主机名称。根服务器把.com服务器IP返回给本地服务器,此时采用的是迭代查询方式。

  • 本地DNS服务器将请求发给.com服务器,此服务器根据请求将redhat.com服务器IP地址返回给本地DNS服务器,此时依然是迭代查询。

  • 本地DNS服务器向redhat.com服务器发送请求,由于此服务器负责该域名解析,因此将www.redhat.com的IP地址返回给本地DNS服务器。

  • 本地DNS服务器最终将结果发给本地客户端。

 

注意:主机会先查看本地/etc/hosts文件,没有,才会去找DNS服务器

 

5、DNS服务器类型

DNS服务器类型主要分为以下几种:

  • 主DNS服务器(primary name server):它是特定域所有信息的权威性信息源。它从域管理员构造的本地磁盘文件中加载域信息,该文件(区文件)包含着该服务器具有管理权的一部分域结构的最精确信息。主服务器是一种权威性服务器,因为它以绝对的权威去回答对其管辖域的任何查询。

  • 辅助DNS服务器(secondary name server):它可从主服务器中复制一整套域信息。区文件是从主服务器中复制出来的,并作为本地磁盘文件存储在辅助服务器中。这种复制称为"区文件复制"。在辅助域名服务器中有一个所有域信息的完整拷贝,可以有权威地回答对该域的查询。因此,辅助域名服务器也称作权威性服务器。配置辅助域名服务器不需要生成本地区文件,因为可以从主服务器中下载该区文件。

  • 高速缓存服务器(caching-only server):可运行域名服务器软件,但是没有域名数据库软件。它从某个远程服务器取得每次域名服务器查询的结果,一旦取得一个,就将它放在高速缓存中,以后查询相同的信息时就用它予以回答。高速缓存服务器不是权威性服务器,因为它提供的所有信息都是间接信息。对于高速缓存服务器只需要配置一个高速缓存文件,但最常见的配置还包括一个回送文件,这或许是最常见的域名服务器配置。 

 

5.1、DNS服务器

  • Bind,强大,但配置繁琐

  • dnsmasq,轻量、配置简单

  • unbound,代替bind,使用起来比较简单

 

dns服务监听端口:53/udp、53/tcp,为了效率,使用UDP协议

 

6、装包

yum install -y bind

 

7、配置文件

vim /etc/named.conf 

 

7.1、全局配置

#定义全局选项,在所有区域中均有效,如果区域中对某一项有定义,则使用区域中的定义。

options {

 

#指定BIND侦听DNS请求的本机IP地址和端口

listen-on port 53 { any; };

 

#侦听IPV6的地址

listen-on-v6 port 53 { ::1; };

 

#区域配置文件所在目录

directory "/var/named";

 

#当执行rndc dumpdb(将高速缓存的数据记录下来)命令时,DNS服务器存放数据库文件的路径名

dump-file "/var/named/data/cache_dump.db";

 

#允许谁来查询,如果多个网段,用分号(;)隔开,不要写any,否则代表你这个DNS服务器谁都可以用

allow-query { 172.25.0.0/24;172.24.0.0/24; }; 

 

#是否接受递归查询。客户端就是递归查询,所以必须开。但是,开启之后,所有人都可以向该服务器发送递归查询请求,所以要做限制

recursion yes; 

 

#限制接受递归查询范围

allow-recursion {10.0.0.0/24; };

 

#限制递归查询的数量为100个

recursive-clients 100;

 

#所有非本域和在缓存中无法找到的域名查询,将转发到指定的DNS服务器,由这台DNS来完成解析并缓存。

#如果没有得到答案,就看forward设置(first或only),默认是禁止的。

#first,表示先转发,如果没有得到答案,服务器开始迭代查询,从根开始(根服务器为了减轻负担,禁止递归查询)

#only,表示只转发,没有答案,就直接告诉客户端没有答案。

forwarders { 114.114.114.114; };

 

#只转发,不递归

#如果转发服务器也解析不了,直接回复客户端没有答案。

forward only;

 

#以下三项为DNS安全设置,防止DNS欺骗,如果不考虑安全问题(比如内网DNS),删掉或改为no,否则解析会出问题。

#dnssec是指为DNS添加数字签名,以保证客户端得到的结果是真实的。DNS的最大缺陷是客户端无法验证它所收到的应答信息的真实性

dnssec-enable no;

dnssec-validation no;

dnssec-lookaside no;

 

7.2、区域配置

保存正向解析和反向解析信息的配置文件就叫区域配置文件

一个zone,就是一个域

 

zone "." IN {

type hint; #表示这是根域的配置文件

file "named.ca"; #配置文件名字

}; 

 

include "/etc/named.rfc1912.zones"; #你自定义的区域配置文件的路径

include "/etc/named.root.key";#表示服务读取配置文件时,也会去读这里指定的文件

 

#自定义一个zone,可以写到/etc/named.rfc1912.zones文件中

zone "exmaple.com" IN { #自定义一个区域叫example.com

type master; #代表这是这个区域的主DNS服务器

file "named.example.com"; #配置文件的名字

allow-update { none; }; #是否允许更新

};

 

7.3、资源记录

每个区域的资源会记录到一个文件中

 

语法:

name [TTL] IN type value

  • name,资源名称

  • TTL,客户端得到解析结果后,可缓存时长,可全局继承

  • IN,关键字,表示internet

  • type,资源类型

  • value,值

 

type:

  • SOA,起始授权记录,一个区域有且仅有一个SOA记录,而且必须是第一条记录

  • NS,专用于指明当前区域的DNS服务器

  • A,正向解析记录

  • AAAA,IPV6正向解析

  • PTR,反向解析记录

  • CNAME,别名

  • MX,邮件交换器

 

SOA记录格式:

  • name,当前区域的名字

  • value,有多个组成部分:

  • 当前区域的主DNS服务器的FQDN,也可以使用当前区域的名字

  • 当前区域的管理员邮箱地址,但@有特殊意义,所以需要转换成.

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

 

8、正向解析

8.1、创建区域配置文件

cp /var/named/named.empty /var/named/named.example.com

 

vim /var/named/named.example.com

#TTL,定义缓存时间,也就是告诉客户端,找我拿的解析记录,在客户端本地可以缓存多久,超过就重新找我查询。

#windows客户端有缓存,但linux没有

$TTL 3H

 

#@,代表本域,即zone名称

#SOA,起始授权记录,表示针对example.com这个域,权威DNS服务器是谁,且只能有一个,后面做从DNS时,也要指定为主DNS服务器的主机名,第一条记录必须是它

#ns.example.com. 当前区域的主DNS服务器的FQDN,也可以使用当前区域的名字。最后一定要加个点,代表根域,否则,你的主机FQDN就会被解析成:server0.example.com.example.com. 也就是说没有点只是代表一个主机名,所以也可以写ns,后缀会自动补全

#root.example.com.表示管理员邮箱,由于@在这里有特殊含义,所以用点代替。也可以写成root,后缀会自动补全

@       IN  SOA  ns.example.com.  root.example.com. (

0       ; serial    #序号,DNS服务器每更新一次,序号加1。当主DNS的序号值大于从的序号时,主的区域配置文件才会去覆盖从的。从只会从主去同步。

1D      ; refresh    #从DNS服务器多久检查一次同步

1H      ; retry    #从如果检查失败,多久重试一次

1W      ; expire    #过期时间,即从服务器多久之后,认为主挂了,也就不进行同步了。

3H )    ; minimum    #当服务器尝试去做一个查询的时候,没有找到答案,保存这个信息多久。在这里,也就是说在3小时内,客户端发送同一条查询,服务器都不会再去查询,直接回答客户端没有

 

以上表示主从同步的时间值,D表示天,H表示小时,W表示周,默认为秒

 

@    IN      NS    server0.example.com.

        IN      A     172.25.0.11

#这里第一个字段为空,表示和上一条记录的第一个字段相同。这条记录的意思是,为example.com这个域名设置了一条A记录,也就是说直接访问这个域名,也可以到达相应主机,比如:打开www.baidu.com,直接输入baidu.com也可以,就是这样

@            IN      MX          10                  server0.example.com.

server0    IN      A             172.25.0.11

destop0   IN      A             172.25.0.10

tt              IN      CNAME   server0

 

 

  • @,表示本域,如果这里为空,表示和上面一条记录的同位置是一样的

  • NS 表示本域的DNS服务器是谁(任何一个NS记录,都有一个A记录与其相随)

  • MX 表示本域的邮件服务器是谁,必须有一个优先级,数字越小越优先

  • A表示一个主机记录

  • CNAME别名记录,也就是说访问tt也就是访问的server0

 

注:

  • 如果两个IP指向同一个主机名,可实现负载均衡,但这方法不靠谱,因为DNS有缓存,只会记录一个

 

#更改配置文件权限,named要有读的权限

chown root:named /var/named/named.exmaple.com

 

8.2、配置SELINUX和防火墙

systemctl restart named

firewall-cmd --permanent --add-port=53/udp

firewall-cmd --reload

 

8.3、检查配置文件

#检查配置文件有没有语法错误

named-checkconf

 

#检查区域文件有没有语法错误

named-checkzone "example.com" /var/named/named.example.com

 

8.4、在客户端测试

#默认地,许多DNS 解析器如果发现被解析的域名中有任何的点(.)就把它当做一个 FQDN 来解析;如果域名中没有任何点,就把它当做 PQDN 来处理,并且会加上系统的默认domain name和最后的点,来组成 FQDN。

#如果没有指定默认的domain name(通过domain字段)或查询失败,则会将 search字段的第一个值当做默认domain name,如果解析不成功,则依次往下试,直到有一个成功或者全部失败为止。

vim /etc/resolv.conf

domain example.com

search example.com

nameserver 172.25.0.11

 

#使用host工具

host server0.example.com

 

#ping的时候,先做解析

ping server0.example.com

 

8.5、dig

#查看根服务器的信息,需要主机能上网

dig -t NS .

 

#指定从哪台主机查看根服务器信息

dig -t NS . @server0.example.com

 

dig -t a server0.example.com

dig -t mx example.com

 

8.6、nslookup

nslookup

>set type=a

>server0.example.com

>set type=mx

>example.com

 

9、反向解析

9.1、创建区域配置文件

vim /etc/named.rfc1912.zones

zone “0.25.172.in-addr.arpa” IN  {

type master;

file “named.172.25.0”;

}

#注意:区域名字必须是反过来写的IP,加上特定后缀:in-addr.arpa

 

cp /var/named/named.empty named.172.25.0

chown root:named named.172.25.0

 

vim /etc/named/named.172.25.0

@  IN  NS  server0.example.com.

@  IN  MX  10  server0.example.com.

11  IN  PTR  server0.example.com.

10  IN  PTR  desktop0.example.com.

 

注:

  • PTR表示反向解析

 

systemctl restart named

 

9.2、验证

host 172.25.0.11

host server0.example.com

 

nslookup

>set type=a/ns/mx/ptr/cname

>server0.exmaple.com

>172.25.0.11

 

dig -x 172.25.0.11

 

10、配置转发

vim /etc/named.conf

options {

forward only;

forwarders { 8.8.8.8;223.5.5.5; };

dnssec-enable no;

dnssec-validation no;

dnssec-lookaside no;

  • forwarders,表示本地查询不到的,转发到外网DNS服务器查询

 

注意:

  • dnssec注释掉不行,必须改成no

  • 主机时间一定要对

 

11、主从DNS服务器

    主DNS服务器会将自己的区域配置文件同步给从DNS服务器,也就是说从DNS服务器不需要配置区域文件,一旦主NDS服务器的区域配置文件的序号大于从DNS服务器的区域配置文件的序号,从就去找主的配置文件来覆盖自己

 

11.1、主DNS服务器

vim /etc/named.rfc1912.zones

allow-transfer {172.25.0.10;};

 

systemctl restart named

 

11.2、从DNS服务器

yum install -y bind

vim /etc/named.conf

 

#从主拷贝配置文件过来

scp root@172.25.0.11:/etc/named.rfc1912.zones /etc/

 

#修改配置文件

vim /etc/named.rfc1912.zones

type slave;

#指定从主同步过来的记录文件,放在slaves目录下面,因为该目录的selinux已经配置好,否则要自己配selinux

file “slaves/named.exmaple.com”;

masters {172.25.0.11;}; 

systemctl stop firewalld

systemctl restart named

11.3、验证

把客户端的DNS改成从主机的IP,使用host、nslookup、dig工具验证

11.4、客户端设置DNS

只有当第一个DNS失效时,才会用第二个