一、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失效时,才会用第二个