域名系统DNS服务
DNS 相关概念和技术


DNS 查询类型
- 递归查询:一般客户机和本地 DNS 服务器之间属于递归查询。如果本地 DNS 服务器本身不能解析,则本地 DNS 服务器向其他 DNS 服务器发起发出查询请求。
- 迭代查询:一般情况下(有例外)本地的 DNS 服务器向其它 DNS 服务器的查询属于迭代查询。如果其他 DNS 服务器也不能解析,则本地 DNS 服务器再向下一个 DNS 服务器发出查询请求。
名称服务器
Name Server:域内负责解析本域内的名称的 DNS 服务器
完整的查询请求经过的流程
1 | Client -->hosts文件 --> Client DNS Service Local Cache --> DNS Server (递归) --> DNS Server Cache -->DNS iteration(迭代) --> 根--> 顶级域名DNS-->二级域名DNS… |
DNS 服务器类型
主 DNS 服务器
管理和维护所负责解析的域内解析库的服务器
从 DNS 服务器
从主服务器或从服务器“复制”(区域传输)解析库副本。
- 序列号:解析库版本号,主服务器解析库变化时,其序列递增
- 刷新时间间隔:从服务器从主服务器请求同步解析的时间间隔
- 重试时间间隔:从服务器请求同步失败时,再次尝试时间间隔
- 过期时长:从服务器联系不到主服务器时,多久后停止服务
- 通知机制:主服务器解析库发生变化时,会主动通知从服务器
缓存 DNS 服务器(转发器)
区域传输
- 完全传输:传送整个解析库
- 增量传输:传递解析库变化的那部分内容
解析类型
- FQDN( Fully Qualified Domain Name) –> IP:正向解析
- IP –> FQDN:反向解析
注意:正反向解析是两个不同的名称空间,是两棵不同的解析树
负责本地域名的正向和反向解析库
- 正向区域
- 反向区域
解析答案
- 肯定答案:存在对应的查询结果
- 否定答案:请求的条目不存在等原因导致无法返回结果
- 权威答案:直接由存有此查询结果的 DNS 服务器(权威服务器)返回的答案
- 非权威答案:由其它非权威服务器返回的查询答案
资源记录定义格式
1 | name [TTL] IN rr_type value |
- name:zone 的名称,是一个 FQDN,通常使用@来表示;zone 的名称可以定义变量$ORIGIN来表示,优先继承$ORIGIN
- TTL:可从全局继承
- IN:表示记录类型属于 Internet 类别
- rr_type:resource record 资源记录
- value:根据资源记录类型的不同,value 也不同
同一个名字可以通过多条记录定义多个不同的值;此时 DNS 服务器会以轮询方式响应
同一个值也可能有多个不同的定义名字;通过多个不同的名字指向同一个值进行定义;此仅表示通过多个不同的名字可以找到同一个主机
各种资源记录
参考:https://blog.csdn.net/qq_26711103/article/details/82873550
区域解析库:由众多资源记录 RR(Resource Record)组成
SOA
Start Of Authority:起始授权记录,一个区域解析库有且仅能有一个 SOA 记录,必须位于解析库的第一条记录
范例:
1 | ; zone file fragment for mytest.cn |
owner-name:当前域的名称,通常用 @ 来表示,优先继承$ORIGIN
value:可以设置多个值,本例中设置了三个值,依次为:
name-server:当前域的主 DNS 服务器的 FQDN,形式为 xxx.ower-name,ower-name 可以省略,例如这里
ns1.mytest.cn.
还可以写成ns1
,下面得配合一条 A 记录把它解析成 ipemail-addr:负责此区域的人员的电子邮件地址,因为@在这里有特殊意义,所以用.替代。所以上面的
root.mytest.cn.
实际上是root.mytest@cn.
主从服务区域传输相关定义
- serial
序列号 – Serial,每次变更区域内容时数值+1,以通知 slave 同步数据。值范围 1 ~ 4294967295,最大增量 2147483647 - refresh
更新频率 – Refresh,slave 主动向 master 更新。建议 1200 ~ 43200 秒 - retry
重试时间 – Retry,当 slave 同步数据失败,多少时间内会再次重试同步。典型值为 180(3 分钟)至 900(15 分钟)或更高。 - expire
失效时间(Expire),一直尝试的失败时间,持续到这个设定值,指示区域数据不再具有权威性。建议 1209600 ~ 2419200 秒 (2-4 weeks) - minimum
bind9 开始将此值重新定义为负缓存时间。任何解析器都可以缓存 NAME ERROR = NXDOMAIN 结果的时间。允许的最大值是 3 hours (10800 seconds).
- serial
NS
Name Server,专用于标明当前区域的 DNS 服务器,范例:
1 | # name [TTL] IN rr_type value |
注意:
- 相邻的两个资源记录的 name 相同时,后续的可省略
- 对 NS 记录而言,任何一个 ns 记录后面的服务器名字,都应该在后续有一个 A 记录
- 一个区域可以有多个 NS 记录
MX
Mail eXchanger,邮件交换器,范例:
1 | # name [TTL] IN rr_type value |
注意:
- 一个区域内,MX 记录可有多个;但每个记录的 value 之前应该有一个数字(0-99),表示此服务器的优先级;数字越小优先级越高
- 对 MX 记录而言,任何一个 MX 记录后面的服务器名字,都应该在后续有一个 A 记录
A
internet Address,作用:FQDN –> IP,范例:
1 | # name: 某主机的FQDN,例如:www.magedu.org. |
AAAA
FQDN –> IPv6
1 | name: FQDN |
PTR
PoinTeR,IP –> FQDN,范例:
1 | # name: IP,有特定格式,把IP地址反过来写,1.2.3.4,要写作4.3.2.1;而有特定后缀:in-addr.arpa.,所以完整写法为:4.3.2.1.in-addr.arpa. |
CNAME
Canonical Name,别名记录,范例:
1 | # name: 别名的FQDN |
TXT
对域名进行标识和说明的一种方式,一般做验证记录时会使用此项,如:SPF(反垃圾邮件)记录,https 验证等。范例:
1 | _dnsauth TXT 2012011200000051qgs69bwoh4h6nht4n1h0lr038x |
子域授权
每个域的名称服务器,都是通过其上级名称服务器在解析进行授权。
glue record:粘合记录,父域授权子域的记录。
范例:
1 | .com. IN NS ns1.com. |
互联网域名
注册,备案,解析。。。
DNS 软件 bind
DNS 服务器软件:bind、powerdns、dnsmasq、unbound、coredns
bind 相关程序包
- bind:服务端
- bind-libs:相关库
- bind-utils:客户端
- bind-chroot:安全包,默认将 dns 相关文件放至/var/named/chroot
1 | [root@centos8 ~]#dnf -y install bind bind-utils |
bind 相关文件
- bind 主程序:/usr/sbin/named。bind 的主程序是 named,不同名,有点小奇怪
- 服务脚本和 Unit 名称:/etc/rc.d/init.d/named、/usr/lib/systemd/system/named.service
- 主配置文件:/etc/named.conf、etc/named.rfc1912.zones、/etc/rndc.key
- 管理工具:/usr/sbin/rndc:remote name domain controller,默认与 bind 安装在同一主机,且只能通过 127.0.0.1 连接 name 进程,提供辅助性的管理功能,953/tcp
- 解析库文件:/var/named/ZONE_NAME.ZONE
- 一台物理服务器可同时为多个区域提供解析
- 必须要有根区域文件:named.ca
- 应该有两个(如果是 ipv6,则更多)实现 localhost 和本地回环地址的解析库
主配置文件
全局配置:options {}
日志子系统配置:logging {}
区域配置:本机能够为哪些 zone 进行解析,就要被定义哪些 zone
1
zone “ZONE_NAME” IN {}
注意:
- 任何服务器程序如果期望能够通过网络被其他主机访问,至少应该监听在一个能与外部主机通信的 IP 地址上
- 缓存名称服务器配置:监听外部地址即可
- dnssec:建议关闭 dnssc,设为 no
实现 DNS 服务器
主 DNS 服务器配置
1. 定义区域
主 DNS 服务器配置文件:/etc/named.conf,示例:
1 | #注释掉下面两行 |
- listen-on port:监听的地址和端口。注释掉和将
127.0.0.1;
修改为localhost;
效果是一样的,设置127.0.0.1
则只会监听地址 127.0.0.1,而注释掉或者设置为 localhost 则监听所有本机地址 - allow-query:允许谁向此 DNS 进行查询。注释掉和修改
localhost;
为any;
效果是一样的,设置localhost
则允许本机的 ip 地址列表
2. 定义区域解析库文件
默认位置:/var/named/目录下;
内容包括两部分:宏定义 和 资源记录,范例:
1 | $TTL 86400 |
3. 主配置文件语法检查
1 | [root@centos8 ~]$named-checkconf |
4. 主配置文件语法检查
1 | named-checkzone [options] zonename filename |
1 | [root@centos8 ~]$named-checkzone "magedu.org" /var/named/magedu.org.zone |
5. 配置生效
三种方式:
rndc reload
systemctl reload named
service named reload
测试和管理工具
dig
1 | yum install bind-utils |
dig 只用于测试 dns 系统,不会查询 hosts 文件进行解析
1 | dig [-t type] name [@SERVER] [query options] |
-t:要查询的资源记录类型。默认 A,除了 AAAA、NS 这一类,还可以是 axfr(全区域传输) 和 ixfr(增量区域传输)。
query options:
+[no]trace:跟踪解析过程 :
dig +trace magedu.org
+[no]recurse:进行递归解析
host
1 | host [-t type] name [SERVER] |
范例:
1 | host -t NS magedu.org 172.16.0.1 |
nslookup
1 | yum install bind-utils |
nslookup 可以支持交互和非交互式两种方式执行
1 | nslookup [-option] [name | -] [server] |
交互模式:
1 | nslookup> |
rndc
利用 rndc 工具可以实现管理 DNS 功能,rndc 监听端口: 953/tcp
1 | rndc COMMAND |
- status: 查看状态
- reload: 重载主配置文件和区域解析库文件
- reload zonename: 重载区域解析库文件
- retransfer zonename: 手动启动区域传送,而不管序列号是否增加
- notify zonename: 重新对区域传送发通知
- reconfig: 重载主配置文件
- querylog: 开启或关闭查询日志文件/var/log/message
- trace: 递增 debug 一个级别
- trace LEVEL: 指定使用的级别
- notrace:将调试级别设置为 0
- flush:清空 DNS 服务器的所有缓存记录
实战案例:实现 DNS 正向服务器
允许动态更新
动态更新:可以通过远程更新区域数据库的资源记录,例如添加删除解析记录
实现动态更新,需要在指定的 zone 语句块中添加以下指令:
1 | Allow-update {any;}; |
实现反向解析区域
实现从服务器
只有一台主 DNS 服务器,存在单点失败的问题,可以建立主 DNS 服务器的备份服务器,即从服务器来实现 DNS 服务的容错机制。从服务器可以自动和主服务器进行单向的数据同步,从而和主 DNS 服务器一样,也可以对外提供查询服务,但从服务器不提供数据更新服务。
DNS 从服务器
- 应该为一台独立的名称服务器
- 主服务器的区域解析库文件中必须有一条 NS 记录指向从服务器
- 从服务器只需要定义区域,而无须提供解析库文件;解析库文件应该放置于/var/named/slaves/目录中
- 主服务器得允许从服务器作区域传送
- 主从服务器时间应该同步,可通过 ntp 进行
- bind 程序的版本应该保持一致;否则,应该从高,主低
定义从区域
格式:
1 | zone "ZONE_NAME" IN { |
实战案例:实现 DNS 从服务器
实现子域
将子域委派给其他主机管理,实现分布 DNS 数据库
正向解析 DNS 区域子域方法,很简单,只需要配置两条资源记录,一条 NS,一条 A,范例:
1 | shanghai.magedu.local. IN NS ns1.shanghai.magedu.local. |
范例:实现 DNS 父域和子域服务
实现 DNS 转发(缓存)服务器
利用 DNS 转发,可以将用户的 DNS 请求,转发至指定的 DNS 服务器,而非默认的根 DNS 服务器,并将指定服务器查询的返回结果进行缓存,提高效率
注意:被转发的服务器需要能够为请求者做递归,否则转发请求不予执行
转发方式有两种:全局转发 和 特定区域转发
全局转发:对非本机所负责解析区域的请求,全转发给指定的服务器
特定区域转发:仅转发对特定的区域的请求,比全局转发优先级高
1 | # 无论全局转发还是特定区域转发,都需要关闭dnssec功能 |
1 | # 全局转发 |
- first:先转发至指定 DNS 服务器,如果无法解析查询请求,则本服务器再去根服务器查询
- only:先转发至指定 DNS 服务器,如果无法解析查询请求,则本服务器将不再去根服务器查询
[实战案例:实现 DNS forward(缓存)服务器](实验 4:DNS forward(缓存)服务器.md)
智能 DNS
智能 DNS 相关技术
ACL
ACL:把一个或多个地址归并为一个集合,并通过一个统一的名称调用,简单说就是对发起 dns 解析请求的客户端的 ip 进行分类,通常会根据省市地区进行分类
注意:只能先定义后使用;因此需要定义在 options 前面
格式:
1 | acl acl_name { |
bind 内置 4 个 acl:none、any、localhost、localnet
- none:没有一个主机
- any:任意主机
- localhost:本机
- localnet:本机的 IP 同掩码运算后得到的网络地址
访问控制指令
- allow-query {}: 允许查询的主机;白名单
- allow-transfer {}:允许区域传送的主机;白名单
- allow-recursion {}: 允许递归的主机,建议全局使用
- allow-update {}: 允许更新区域数据库中的内容
{}中填入的就是 acl,范例:
1 | allow-query { localhost; }; # 只处理来自本机的dns解析请求 |
view
视图,将 ACL 和区域数据库实现对应关系,以实现智能 DNS
view 格式:
1 | # 一个bind服务器可定义多个view,每个view只能匹配一个acl |
- ACL 定义在 options 之前,view 定义在 options 之后
- 一旦启用了 view,所有的 zone 都只能定义在 view 中
- 仅在允许递归请求的客户端所在 view 中定义根区域
实战案例:利用 view 实现智能 DNS
借助智能 DNS 实现的技术
GSLB
Global Server Load Balance 全局负载均衡
GSLB 是对服务器和链路进行综合判断来决定由哪个地点的服务器来提供服务,实现异地服务器群服务质量的保证
GSLB 主要的目的是在整个网络范围内将用户的请求定向到最近的节点(或者区域)
GSLB 分为基于 DNS 实现、基于重定向实现、基于路由协议实现,其中最通用的是基于 DNS 解析方式
CDN
网站的 DNS 域名解析器设置了 CNAME,指向了www.a.tbcdn.com,请求指向了CDN网络中的智能DNS负载均衡系统
智能 DNS 负载均衡系统解析域名,把对用户响应速度最快的 IP 节点返回给用户;
用户向该 IP 节点(CDN 服务器)发出请求
由于是第一次访问,CDN 服务器会通过 Cache 内部专用 DNS 解析得到此域名的原 web 站点 IP,向原站点服务器发起请求,并在 CDN 服务器上缓存内容
请求结果发给用户
DNS 排错
1 | SERVFAIL:The nameserver encountered a problem while processing the query. |
1 | NXDOMAIN:The queried name does not exist in the zone. |
1 | REFUSED:The nameserver refused the client's DNS request due to policy restrictions. |
实战案例
综合案例:实现 inertnet 的 DNS 服务架构