DNS服务器
DNS是什么
域名和IP地址相互映射的一个分布式数据库,通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议运行在UDP协议之上,使用端口号53。为各种网络程序找到对应目标主机的IP地址或对应的主机域名。
DNS采用C-S架构,服务器端工作在UDP协议端口53和TCP协议端口53上。FQDN(Fully Qualified Domain Name)完全限定域名,它是使用DNS的树状层级结构的完全路径域名来表示一个准确位置对应的主机。DNS提供正向解析(FQDN–>IP)和反向解析(IP–>FQDN)的功能。
什么是映射
映射是一个数学名词,指两个集合之间元素相互对应的一种关系
主机名到IP地址的映射有两种方式:
1)静态映射,每台设备上都配置主机到IP地址的映射,各设备独立维护自己的映射表,而且只供本设备使用;
2)动态映射,建立一套域名解析系统(DNS),只在专门的DNS服务器上配置主机到IP地址的映射,网络上需要使用主机名通信的设备,首先需要到DNS服务器查询主机所对应的IP地址。
通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。在解析域名时,可以首先采用静态域名解析的方法,如果静态域名解析不成功,再采用动态域名解析的方法。可以将一些常用的域名放入静态域名解析表中,这样可以大大提高域名解析效率。
DNS中的两种解析方式
DNS(Domain Name Service)域名服务、就是域名解析服务器、所谓名称解析的过程就是某个应用程序基于某个搜索键在指定的数据库中查询、而后查询到某些对应的键以后与之对应的键导出来的过程。
DNS是互联网的基础设施类的服务、这是一种协议、协议最后是要实现的、协议实现的软件很多。可以用BIND来实现DNS的、它运行时监听在UDP的53号端口上、同时监听TCP的53号端口、两种协议的53号端口都被监听了。
正向解析:根据主机名称(域名)查找对应的IP地址(实际应用中最多的)
反向解析:根据IP地址查找对应的主机域名(不常用,一般用于搭建邮件服务器时。)
DNS服务器的不同角色
根据服务器与所提供域名解析记录的关系,将DNS服务器分为不同的角色:
1)缓存域名服务器,也称为 唯高速缓存服务器
通过向其他域名服务器查询获得域名->IP地址记录
将域名查询结果缓存到本地,提高重复查询时的速度
不负责本地解析,采用递归方式转发客户机查询请求,并返回结果给客户机的DNS服务器。同时缓存查询回来的结果,也叫递归服务器
2)主域名服务器
特定DNS区域的官方服务器,具有唯一性
负责维护该区域内所有域名->IP地址的映射记录
就是一台存储着原始资料的DNS服务器
3)从域名服务器(就是用于备份DNS服务器的)
其维护的 域名->IP地址记录 来源于主域名服务器
搭建DNS服务应用的软件为:BIND(Berkeley Internet Name Daemon)
使用自动更新方式从主DNS服务器同步数据的DNS服务器。也称辅助DNS服务器。
4)转发器
这台DNS发现非本机负责的查询请求时,不再向根域发起请求,而是直接转发给指定的一台或者多台服务器。自身并不缓存查询结果
全球有13组DNS根服务器、11台在美国、一台在挪威、一台在日本。
每个区必须有主服务器,另外每个区至少要有一台辅助服务器,否则如果该区的主服务器崩溃了,就无法解析该区的名称。
DNS的域和域名
由最顶层到下层,可以分成:根域、顶级域、二级域、子域。
- 域:DNS树的每个节点代表一个域,通过这些节点,对整个域名空间进行划分,成为一个层次结构。域名空间的每个域的名字,通过域名进行表示。
- 域名:通常由一个完全合格域名(FQDN)标识。FQDN能准确表示出其相对于DNS域树根的位置,也就是节点到DNS树根的完整表述方式,从节点到树根采用反向书写,并将每个节点用“.”分隔,对于DNS域google来说,其完全正式域名(FQDN)为google.com。
说明:FQDN:(FullyQualified Domain Name)全限定域名:同时带有主机名和域名的名称。(通过符号“.”)
例如:google为com域的子域,其表示方法为google.com,而www为google域中的子域,可以使用www.google.com表示。
注意:通常,FQDN有严格的命名限制,长度不能超过256字节,只允许使用字符a-z,0-9,A-Z,域名不区分大小写。
DNS的工作原理
DNS有两种查询方式:递归查询和迭代查询
通过上图,我们了解到DNS的两种查询方法。
那么用户如何快速的在互联网上访问哪台服务器或者哪些服务器就能找到待解析的数据呢?
客户机发起对www.kernel.org的解析请求
1)客户机首先查看查找本地hosts文件,如果有则返回,否则进行下一步
2)客户机查看本地缓存,是否存在本条目的缓存,如果有则直接返回,不再向外发出请求,否则进行下一步,转发。
3)将请求转发本地DNS服务器。
4)查看域名是否本地解析,是则本地解析返回,否则进行下一步。
5)本地DNS服务器首先在缓存中查找,有则返回,无则进行下一步。
6)向全球某一个根域服务器发起DNS请求,根域返回org域的地址列表。
7)使用某一个org域的IP地址,发起DNS请求,org域返回kernel域服务器地址列表。
8)使用某一个kernel域IP地址,发起DNS请求,kernel域返回www.kernel.org主机的IP地址,本地DNS服务收到后,返回给客户机。
以上客户机和本地DNS服务器直接的查询方式,称为递归查询。
本地DNS服务器多次重复查询的方式,称为迭代查询。
DNS资源类别
RR(Resource Record)资源记录
DNS层级结构中,不管是节点还是叶子节点都是资源,对这些资源中的某一个的标识使用一定格式的多字段的一条记录来表示,这条记录就是资源记录RR。RR的标准记录在RFC 1034中。
RR的组成
owner name | 所属名称 |
type | RR的类型 |
TTL | 缓存RR的秒数(time-to-live)也可设置天数 |
class | 表示一个协议或者一簇协议,常用IN表示Internet |
RDATA | 记录数据 |
RR中IN类(class)常见类型(type)
SOA | 区域授权起始记录,区域文件第一条记录,而且一个区域文件只能有一条 |
NS | 域的授权名称服务器 |
MX | 域的邮件交换器,要跟着一个优先级值,越小越高 |
A | IPV4主机地址 |
AAAA | IPV6主机地址 |
PTR | 解析IP的指针 |
CNAME | 权威(正式)名称,定义别名 |
SOA的RDATA格式
MNAME | 授权主机FQDN或者当前区域的名称 |
RNAME | 邮箱地址,@用.代替 |
SERIAL | 区域传送使用的版本号,格式为yyyymmddnn |
REFRESH | 从服务器去同步主服务器时间间隔 |
RETRY | 刷新失败重试时间间隔 |
EXPIRE | 从服务器过期时长 |
MINIMUM | 否定答案过期时长 |
DNS的实现过程
使用yum命令安装bind(DNS服务软件,包括:域名服务器、域名解析器库、软件测试工具)
[root@localhost ~]# yum -y install bind
安装完成后,我们需要配置主配置文件named.conf
进入文件后,会看到以下内容,对其进行修改
options {
# 指定IPV4监听的端口和IP,默认端口为53,IP为127.0.0.1,可以任意修改
listen-on port 53 { 127.0.0.1; };
# 指定IPV6监听的端口和IP
listen-on-v6 port 53 { ::1; };
# 指定named从/vat/named目录下读取DNS数据文件,这个目录用户可以自行指定并创建,指定后所有的DNS数据文件都存放在此目录下
directory "/var/named";
# 用来设置域名缓存数据库文件的位置,可以自己定义。默认保存在/var/named/data目录下
dump-file "/var/named/data/cache_dump.db";
# 用来设置状态统计文件的位置,可以自己定义。默认保存在/var/named/data目录下
statistics-file "/var/named/data/named_stats.txt";
# 用来设置服务器输出的内存使用统计信息。默认保存在/var/named/data目录下,文件名为named_mem_stats.txt。
memstatistics-file "/var/named/data/named_mem_stats.txt";
# 用来设置允许DNS查询的客户端地址,默认值为localhost。可任意修改
allow-query { localhost; };
# 用来设置递归查询。一般客户机和服务器之间属于递归查询,
# 即当客户机向DNS服务器发起查询请求后,若DNS服务器本身不断解析 ,则会向另外的DNS服务器发出查询请求,得到结果后转交给客户机。
# 此选项有yes => 允许递归 和no => 不允许递归两个值。默认=> yes。
recursion yes;
# 用来设置是否启用DNSSEC支持,DNSSEC可以用来验证DNS数据的有效性,默认为yes。
dnssec-enable yes;
# 用来设置是否启用DNSSEC确定,默认为yes
dnssec-validation yes;
/* Path to ISC DLV key */
# 用来设置内置信任的密钥文件,默认值为/etc/named.iscdlv.key。
bindkeys-file "/etc/named.root.key";
# 用来指定目录文件存储位置,跟踪管理DNSSEC密钥,默认情况下,存储在/var/named/dynamic。
managed-keys-directory "/var/named/dynamic";
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
};
# 定义bind服务的调试日志信息。其中,channel用来定义日志输出方式,有syslog、文本文件、标准错误输出或/dev/null多种方式;
# file表示输出到纯文本文件;severity表示消息的 严重性等级,有critical、error、warning、notice、info、debug[level]、dynamic多种级别可选,
# 对于系统管理来说,一般设置为info级别就可以了
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
# 定义一个正向域区,对应的域名分别为ixdba.net,一个zone关键词定义了一个域区。
# 在这里type类型有三种,分别是master(主域名服务器)、slave(辅助域名服务器)、hint(互联网根域名服务器)。
# file用来存放DNS记录的数据文件名称。
# 对于这里指定的文件,默认 路径为/var/named。也就是说,ixdba.net这个数据文件要存放在/var/named目录下。
# allow-update定义是否允许客户主机或服务器自行更新DNS记录,上面指定的 这个正向区域不允许更新DNS记录。
zone "." IN {
type hint;
file "named.ca";
};
# 该文本包含的文件,也就是区域文件
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
了解并修改named.conf文件后,修改区域resolv.conf配置文件
该文件是域名解析器的配置文件,这个文件可以将域名和IP关联起来
进入文件后,在文件尾部添加如下内容即可,灵活添加
# 设置我的正向解析域名为kms.com
zone "kms.com" IN {
# 该服务器为主DNS
type master;
# 正向解析的数据文件名称
file "kms.zone";
# 指定某个从服务器是否可以更新该区域的解析记录,可不写
allow-update { none; };
# 指定某个从服务器是否允许下载该区域的解析记录,可不写
allow-transfer { none; };
};
# 设置反向解析,IP为192.168.1.1
zone "1.168.192.in-addr.arpa" IN {
# 设置为主域
type master;
# 设置反向解析的数据文件名称
file "192.arpa";
};
# 之后可以对这两个文件进行语法校验
[root@localhost named]# named-checkconf /etc/named.conf
[root@localhost named]# named-checkconf /etc/named.rfc1912.zones
修改完之后,就可以配置数据文件了
(/var/named/)数据文件,用来正向和反向的解析
因为那两个文件本身是不存在的,所以需要创建,并将模板(named.localhost)文件拷贝到那两个文件中
[root@localhost ~]# cd /var/named/
[root@localhost named]# cp -p named.localhost kms.zone
[root@localhost named]# cp -p named.localhost 192.arpa
# 如果报错,请根据报错内容进行排错
之后进入文件中配置,内部的配置信息在上面的表格查看
# 设置正向解析文件
[root@localhost named]# vim kmx.zone
# 设置了有效地址的缓存记录为1天/1D
$TTL 1D
# @ 表示本机
# SOA 表示开始授权信息
# 后面的www.kms.com. root.kms.com.分别表示dns要解析的域名和DNS管理员邮箱地址
@ IN SOA kms.com. root.kms.com. (
# 序列号,9位数字组成
111111111 ; serial
# 刷新时间
1D ; refresh
# 重试时间
1H ; retry
# 失效时间
1W ; expire
# 无效地址记录的缓存时间
3H ) ; minimum
NS @
A 127.0.0.1
AAAA ::1
# 设置域名与IP的对应关系
www A 192.168.1.10
# 别名,www.kms.com也可写作lll.kms.com
lll CNAME www
# 设置反向解析文件
[root@localhost named]# vim 192.arpa
$TTL 1D
@ IN SOA kms.com. root.kms.com. (
# 反向解析的序列号要与正向解析的一样
111111111 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS @
A 127.0.0.1
AAAA ::1
# IP对应的域名
10 PTR www.kms.com
完成配置之后进行校验
[root@localhost named]# named-checkzone kms.com /var/named/kms.zone
zone kms.com/IN: loaded serial 111111111
OK
[root@localhost named]# named-checkzone kms.com /var/named/192.arpa
zone kms.com/IN: loaded serial 111111111
OK
成功之后重启服务、放行服务即可
[root@localhost named]# systemctl restart named
[root@localhost named]# firewall-cmd --add-service=dns
success
[root@localhost named]# firewall-cmd --add-service=dns --permanent
success
之后在客户端验证,先编辑resolv.conf文件
[root@localhost ~]# vim /etc/resolv.conf
# Generated by NetworkManager
# DNS服务器主机IP
nameserver 192.168.1.10
验证
[root@localhost ~]# nslookup 192.168.1.10
Server: 192.168.1.10
Address: 192.168.1.10#53
10.1.168.192.in-addr.arpa name = www.kms.com.1.168.192.in-addr.arpa.
[root@localhost ~]# nslookup www.kms.com
Server: 192.168.1.10
Address: 192.168.1.10#53
Name: www.kms.com
Address: 192.168.1.10