简介
DNS,全称Domain Name System,是一个记录域名和IP地址互相映射的一个系统,可以将用户访问互联网中所使用的域名转换成对应的IP地址。通过域名得到对应的IP地址的过程被称为域名解析。DNS运行于UDP协议之上,使用53端口
DNS 解析过程
首先,客户端先在本地缓存查找是否有缓存域名,比如没有,客户端发送DNS请求IP地址或主机名,DNS服务器在收到客户端的请求后;
(1) 检查DNS服务器的缓存,若查到请求地址或名称,即向客户机发送应答信息
(2) 若没有查到,则在数据库中查找,若查到请求的地址或名称,即向客户端发出应答信息
(3) 若没有查到,则将请求发给根域DNS服务器,并依序从根域查找顶级域,由顶级域查找二级域,二级域查找三级,直至找到要解析的地址或名称,即向客户机所在的网络的DNS服务器发出应答相应
(4) 若没有找到,返回信息错误
DNS服务器分类
DNS服务器的类型可以分为以下几种
(1) 主服务器,负责至少解析一个域内的域名,维护所负责解析的域数据库,可对该域数据进行读写操作
(2) 辅服务器,负责从主服务器或其他辅服务器中复制相关解析库,为主服务器缓解解析压力
(3) 缓存服务器,不负责域名解析,仅仅作为缓存,加速解析速度
(4) 转发服务器,发现非本机负责的请求后,不再向根发起请求,而是直接转发给指定的一台或多台服务器,自身并不保存查询
.
代表根域,负责全球互联网域名IPV4根服务器、域名体系和IP等管理。全世界共有13台IPV4根域服务器。1个位主根服务器在美国。其余12个均为辅根服务器,其中9台在美国,欧洲2台位于英国和瑞典,亚洲一个位于日本。
顶级域 .com
,.net
,.edu
等这些域名为顶级域,也称为一级域。是互联网DNS等机制中最高的域,它保存于DNS域的名字空间中
国家域 .cn
,.us
,.tk
以国家为单位的域,和顶级域作用相同
子域(二级域),提供互联网用户注册的域名,可以任意注册,并且不区分大小写 (例如baidu.com.)
每一个域内都有一个专门的DNS服务器,这些服务器负责接收并响应本域内的主机名的解析请求
DNS 查询方式
目前DNS查询方式有两种,分别为递归查询(recursion)和迭代查询(iteration)
递归查询:
客户端发起一个DNS解析请求,若本地DNS服务器不能为客户端直接解析域名,则域名服务器会代替客户端(下级服务器)向域名系统中的各分支的上下级访问器进行递归查询,直到有服务器响应回答了该请求后,将请求结果返回给客户端。在此期间,客户端将一直处于等待状态
迭代查询:
客户端(下级服务器)发起DNS解析请求后,若上级DNS服务器并不能直接提供该DNS的解析结果,则该上级DNS服务器会告知客户端(下级服务器)另一个可能查询到该DNS解析结果的DNS服务器IP。客户端(下级服务器)再次请求这个DNS服务器,如此类推,直到查询到对应的结果为止。
安装DNS服务器
本次环境说明
master 192.168.31.113 dns-01
slave 192.168.31.114 dns-02
系统Centos 7.8
Bind 9版本 9.11.4
没有特殊说明的地方,我们默认都在master节点操作 (需要关闭iptables)
安装BIND9
#关闭防火墙、selinux
systemctl stop firewalld
systemctl disable firewalld
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat
iptables -P FORWARD ACCEPT
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
#设置yum源
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
#安装bind9
yum install -y bind
修改BIND9配置文件
BIND配置文件说明
/etc/named.conf 主配置文件
/etc/named.rfc1912.zones 区域数据文件
区域数据文件主要存放包括主机名和对应IP地址、刷新间隔和过期时间等;关于区域数据文件的参数下面文章会有介绍
bind配置默认路径为/etc/named.conf
/etc/named.conf
为主配置文件,主要包含三个段落,分别为全局配置段、日志配置段和区域配置段
# named.conf主配置文件参数详解
//全局配置段options {
listen-on port 53 { 192.168.31.113; }; #设置通信的网段,这里建议使用本机IP,并非127.0.0.1
listen-on-v6 port 53 { ::1; }; #监听bind端口
directory "/var/named"; #指定区域文件存放路径
dump-file "/var/named/data/cache_dump.db"; #设置当执行rndc dumpdb命令后导出文件存放路径
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt"; #服务器输出的内存使用统计文件名
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
allow-query { any; }; #允许查询来源(这里建议修改为IP地址,localhost代表只允许本机查询) any代表所有网段
allow-transfer { none; } #允许查询的网段
recursion yes; #是否开启递归查询
dnssec-enable yes; #是否支持DNSEEC开关
dnssec-validation yes; #是否开启dnsec确认开关
bindkeys-file "/etc/named.root.key";
managed-keys-directory "/var/named/dynamic";
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
};
//日志配置段
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
#本段参数解释,将日志写入工作目录下的named.run文件。注意:如果服务器用-f参数启动,则named.run会被stderr所代替,severity 按照服务器当前Debug级别记录日志
#bind日志可以写到很多地方,具体写入方式可以参考https://blog.csdn.net/zhu_tianwei/article/details/45103455
};
//区域配置段
zone "." IN { #.代表根域
type hint; #代表根服务器,除hint还有master 代表主域名服务器,slave代表辅助域名服务器,forward 代表转发服务器
file "named.ca"; #域信息源数据库信息文件名
};
include "/etc/named.rfc1912.zones"; #区域管理文件(包含资源记录、宏定义和注释)
#通常定义在/var/named目录下且以.zone结尾
include "/etc/named.root.key";
自定义区域配置
自定义主机区域配置文件
这里我们定义了一个abcdocker.com的域 (相当于我们购买了一个域名),可以放在/etc/named.rfc1912.zones
文件中,也可以放置在自定义文件中,在/etc/named.conf
中include即可
zone "abcdocker.com" IN {
type master;
file "abcdocker.com.zone";
allow-update { 192.168.31.113;192.168.31.114; };
};
#allow-update代表动态域
我们在/etc/named.rfc1912.zones
添加上面的域名解析,然后使用下面的命令检查配置文件是否正确
我们在/etc/named.rfc1912.zones
添加上面的域名解析,然后使用下面的命令检查配置文件是否正确
[root@dns-01 ~]# named-checkconf
[root@dns-01 ~]#
#没有报错代表正常
上面我们添加的是一个域名,相当于互联网购买了一个域名,但是这个域名目前没有解析。所以我们还需要配置自定义区域数据库文件(包含资源记录、宏定义和注释)
配置文件解释
$ORIGIN . #宏定义段,代表根,否则在下面name段需要输入abcdocker.com.
$TTL 600; #根缓存时间(10分钟)
abcdocker.com IN SOA ns1.abcdocker.com. dnsadmin.abbcdocker.com. { #SOA代表资源记录配置,格式上面已经说过了
20200816; #
10800;
900;
604800;
86400;
}
NS ns1.abcdocker.com.
$ORIGIN abcdocker.com #代表域名,下面的配置都相当于配置解析ns1.abcdocker.com,这里如果不写,下面就需要些ns1.abcdocker.com
$TTL 60; #域名过期时间,时间为60秒过期
ns1 A 192.168.31.113
常用资源记录类型
常见资源记录类型
- SOA: Start Of Authority,起始授权
- NS: 域名服务器的标示记录
- A: IPV4主机地址
- AAAA: IPV6主机地址
- MX: 邮件交换记录
- CNAME: Canonical Name,正式名称(别名)
- TXT: 文件字符串,长度限制512Byte,通常做SPF记录(反垃圾邮件)
- PTR记录: 指针记录,用来实现反向解析
资源记录(Resource Record)格式
name [ttl(缓存时间)] IN 资源记录类型 (RRtype) Value
宏定义$开头
TTL #缓存时间
ORIGIN. #源地址,ORIGIN . 意思代表根域
常用资源记录类型配置详解
上面已经解释了长用资源记录的集中类型,下面介绍一下资源记录的配置用法
SOA记录
SOA: 其实授权记录,只可以有一条。必须定义在资源记录最前面
SOA 资源记录表明此DNS名称服务器是为该DNS域中的数据的信息的最佳来源。SOA 记录与 NS 记录的区别:简单讲,NS记录表示域名服务器记录,用来指定该域名由哪个DNS服务器来进行解析;SOA记录设置一些数据版本和更新以及过期时间的信息.
@ 600 IN SOA dns.abcdocker.com. 管理员邮箱,这里不使用@,因为@有特殊含义,以.代替(dnsadmin.abcdocker.com.)(
序列号(serial number) ;注释内容,十进制数据,不能超过10位,通常使用日期时间戳,例如2018121601
刷新时间(refresh time) ;即每隔多久到主服务器检查一次
重试时间(retry time) ;应该小于refresh time
过期时间(expire time);当辅助DNS服务器无法联系上主DNS服务器时,辅助DNS服务器可以在多长时间内认为其缓存是有效的,并供用户查询。
netgative answer ttl ;非权威应答的ttl,缓存DNS服务器可以缓存记录多长时间
)
NS记录
用于表示域名对应的DNS服务器
name:区域名称,通常可以简写为@
value:DNS服务器的FQDN(可以使用相对名称)
例子:
@ 600 IN NS ns1
#NS记录需要指定一个对应的A记录
A记录
需要解析的服务器,www代表我们的域名前缀,例如www.i4t.com,这里的www就是A记录
www 600(单位s) IN A 192.168.31.113
www 600(单位s) IN A 192.168.31.114
MX记录
#优先级:0-99,数字越小,级别越高,
@ 600 IN MX 10 mail
@ 600 IN MX 20 smtp
CNAME记录
eshop IN CNAME www
正解域 & 反解域
DNS正解: 域名解析->返回IP
DNS反解: IP解析->域名
反解域主要使用PTR记录:IP –>FQDN,只能定义在反向区域文件中,反向区域文件名称为逆向网络地址加.in-addr.arpa.后缀组成
配置正解主机域
正向解析文件(名字到地址的映射),反向解析文件(地址到名字的映射)
我们需要修改两台服务器的FQDN
FQDN 完全限定域名fully qualified domain name(FQDN)是internet上特定计算机或主机的完整域名。FQDN由两部分组成:主机名和域名。
本次环境如下
master 192.168.31.113 dns01-113.host.com
slave 192.168.31.114 dns02-114.host.com
第一步修改主机名,将主机名修改为FQDN格式
hostnamectl set-hostname dns01-113.host.com
目前我们在不设置host的情况下,两台节点是无法通过主机名进行通信
[root@dns01-113 ~]# ping dns-02-114.host.com
ping: dns-02-114.host.com: 未知的名称或服务
1.配置/etc/named.rfc1912.zones
(也可以在/var/named.conf)添加host.com 域配置文件
vim /etc/named.rfc1912.zones
zone "host.com" IN {
type master;
file "host.com.zone";
allow-update { 192.168.31.113;192.168.31.114; };
};
2.创建区域数据库文件
[root@dns01-113 ~]# vim /var/named/host.com.zone
$TTL 600
@ IN SOA dns.host.com. 604419314.qq.com. ( 20200817 10800 900 604800 86400 )
NS dns.host.com.
$ORIGIN host.com.
$TTL 60
dns01-113 A 192.168.31.113
dns02-114 A 192.168.31.114
dns A 192.168.31.113
#这里设置了一个dns的A记录,和NS记录,还有我们主机域的A记录
3.检查配置文件
[root@dns01-113 ~]# named-checkzone host.com /var/named/host.com.zone
zone host.com/IN: loaded serial 20200817
OK
4.修改属租属主
[root@dns01-113 ~]# chgrp named /var/named/host.com.zone
[root@dns01-113 ~]# chmod 640 /var/named/host.com.zone
5.修改dns文件
[root@dns01-113 ~]# vim /etc/resolv.conf
# Generated by NetworkManager
search host.com
nameserver 192.168.31.113
6.重启BIND
systectl restart named
7.检查
这时候我们没有添加host,已经给我们解析上
[root@dns01-113 ~]# dig dns02-114.host.com
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-16.P2.el7_8.6 <<>> dns02-114.host.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53152
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;dns02-114.host.com. IN A
;; ANSWER SECTION:dns02-114.host.com. 60 IN A 192.168.31.114
;; AUTHORITY SECTION:host.com. 600 IN NS dns.host.com.
;; ADDITIONAL SECTION:dns.host.com. 60 IN A 192.168.31.113
;; Query time: 0 msec
;; SERVER: 192.168.31.113#53(192.168.31.113)
;; WHEN: 一 8月 17 06:30:50 EDT 2020
;; MSG SIZE rcvd: 97
维护正解域
当我们创建了正解域,我们还要对正解域进行增删改查
增加一条A记录
[root@dns01-113 ~]# echo "dns03-114 A 192.168.31.114" >>/var/named/host.com.zone
#检查配置文件named-checkzone host.com /var/named/host.com.zone
#重启named
[root@dns01-113 ~]# systemctl restart named
[root@dns01-113 ~]# ping dns03-114.host.com
PING dns03-114.host.com (192.168.31.114) 56(84) bytes of data.
64 bytes from 192.168.31.114 (192.168.31.114): icmp_seq=1 ttl=64 time=0.473 ms
64 bytes from 192.168.31.114 (192.168.31.114): icmp_seq=2 ttl=64 time=0.158 ms
64 bytes from 192.168.31.114 (192.168.31.114): icmp_seq=3 ttl=64 time=0.123 ms
64 bytes from 192.168.31.114 (192.168.31.114): icmp_seq=4 ttl=64 time=0.107 ms
修改、删除记录
这里不进行演示,和添加步骤相同
配置反解域
需要注意一点的是反解析对应的配置文件应该不带有后面ip地址
例如我解析的IP为192.168.31.113 配置文件应该写为31.168.192.in-addr.arpa 其中113这里不写,是在后面添加解析时使用
并且一个IP只能对应唯一的FQDN反解PTR记录,且应该与正解域对应
首先编辑/etc/named.rfc1912.zones
添加一个域名
zone "31.168.192.in-addr.arpa" IN {
type master;
file "31.168.192.in-addr.arpa.zone";
allow-update { 192.168.31.113; };};
#检查配置文件
[root@dns01-113 ~]# named-checkconf
在/var/named/
下创建反解域区域数据库文件
[root@dns01-113 ~]# vim /var/named/31.168.192.in-addr.arpa.zone #名称需要根据上面定义的来创建
$TTL 60
@ IN SOA dns.host.com. 604419314.qq.com. (
20200818
10800
900
64800
86400
)
NS dns.host.com.
$ORIGIN 31.168.192.in-addr.arpa.
$TTL 60
113 PTR dns01-113.host.com.
114 PTR dns02-114.host.com.
#####################
提示: 如果我们$ORIGIN 31.168.192.in-addr.arpa.不写全,也是可以的。例如
$ORIGIN in-addr.arpa.
$TTL
60113.31.168.192 PTR dns01-113.host.com.
#上面的写法也是可以的
说明: 反解域也是要有SOA记录的,在反解域中ns记录就不用在写A记录了,因为反解区域文件只可以有PTR,不可以有A记录
检查区域配置文件是否正常
#31.168.192.in-addr.arpa为我们反向解析的域名
[root@dns01-113 ~]# named-checkzone 31.168.192.in-addr.arpa. /var/named/31.168.192.in-addr.arpa.zone zone 31.168.192.in-addr.arpa/IN: loaded serial 20200818
OK
接下来重启named
[root@dns01-113 ~]# systemctl restart named
我们使用31.168.192.in-addr.arpa反向解析,这里就会显示我们对应的主机名
#第一种方法
[root@dns01-113 ~]# dig -t PTR 113.31.168.192.in-addr.arpa. @192.168.31.113 +shortdns01-113.host.com.
#第二种方法
[root@dns01-113 ~]# dig -x 192.168.31.114 @192.168.31.113 +shortdns02-114.host.com.
#dig 后面ip为需要解析的ip,@后面ip为dns服务器ip
常用检查dns工具
nslookup
host
dig
文章来源:https://www.cnaaa.net,转载请注明出处:https://www.cnaaa.net/archives/7814