域名系统DNS服务

本文最后更新于:2023年12月5日 晚上

DNS 相关概念和技术

DNS 查询类型

  • 递归查询:一般客户机和本地 DNS 服务器之间属于递归查询。如果本地 DNS 服务器本身不能解析,则本地 DNS 服务器向其他 DNS 服务器发起发出查询请求。
  • 迭代查询:一般情况下(有例外)本地的 DNS 服务器向其它 DNS 服务器的查询属于迭代查询。如果其他 DNS 服务器也不能解析,则本地 DNS 服务器再向下一个 DNS 服务器发出查询请求。

名称服务器

Name Server:域内负责解析本域内的名称的 DNS 服务器

完整的查询请求经过的流程

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 服务器(权威服务器)返回的答案
  • 非权威答案:由其它非权威服务器返回的查询答案

资源记录定义格式

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 记录,必须位于解析库的第一条记录

范例:

; zone file fragment for mytest.cn
    ;$TTL 600
    $ORIGIN mytest.cn.
    ; SOA record
    ; owner-name ttl class rr      name-server      email-addr  (sn ref ret ex min)
    @                 IN   SOA     ns1.mytest.cn.   root.mytest.cn. (
                                                                    0 ; serial
                                                                    1D ; refresh
                                                                    1H ; retry
                                                                    1W ; expire
                                                                    3H ) ; minimum

# M:分钟;H:小时;D:天;W:周
  • owner-name:当前域的名称,通常用 @ 来表示,优先继承$ORIGIN

  • value:可以设置多个值,本例中设置了三个值,依次为:

    1. name-server:当前域的主 DNS 服务器的 FQDN,形式为 xxx.ower-name,ower-name 可以省略,例如这里ns1.mytest.cn.还可以写成ns1,下面得配合一条 A 记录把它解析成 ip

    2. email-addr:负责此区域的人员的电子邮件地址,因为@在这里有特殊意义,所以用.替代。所以上面的root.mytest.cn.实际上是root.mytest@cn.

    3. 主从服务区域传输相关定义

      1. serial
        序列号 – Serial,每次变更区域内容时数值+1,以通知 slave 同步数据。值范围 1 ~ 4294967295,最大增量 2147483647
      2. refresh
        更新频率 – Refresh,slave 主动向 master 更新。建议 1200 ~ 43200 秒
      3. retry
        重试时间 – Retry,当 slave 同步数据失败,多少时间内会再次重试同步。典型值为 180(3 分钟)至 900(15 分钟)或更高。
      4. expire
        失效时间(Expire),一直尝试的失败时间,持续到这个设定值,指示区域数据不再具有权威性。建议 1209600 ~ 2419200 秒 (2-4 weeks)
      5. minimum
        bind9 开始将此值重新定义为负缓存时间。任何解析器都可以缓存 NAME ERROR = NXDOMAIN 结果的时间。允许的最大值是 3 hours (10800 seconds).

NS

Name Server,专用于标明当前区域的 DNS 服务器,范例:

# name [TTL] IN rr_type value
# name: 当前区域的名字
# value: 当前区域的某DNS服务器的名字,例如ns.magedu.org
magedu.org.   IN  NS  ns1.magedu.org.
magedu.org.   IN  NS  ns2.magedu.org.

注意:

  1. 相邻的两个资源记录的 name 相同时,后续的可省略
  2. 对 NS 记录而言,任何一个 ns 记录后面的服务器名字,都应该在后续有一个 A 记录
  3. 一个区域可以有多个 NS 记录

MX

Mail eXchanger,邮件交换器,范例:

# name [TTL] IN rr_type value
# name: 当前区域的名字
# value: 当前区域的某邮件服务器(smtp服务器)的主机名
magedu.org.   IN  MX  10  mx1.magedu.org.
              IN  MX  20  mx2.magedu.org.
mx1               A 10.0.0.100
mx2               A 10.0.0.200

注意:

  1. 一个区域内,MX 记录可有多个;但每个记录的 value 之前应该有一个数字(0-99),表示此服务器的优先级;数字越小优先级越高
  2. 对 MX 记录而言,任何一个 MX 记录后面的服务器名字,都应该在后续有一个 A 记录

A

internet Address,作用:FQDN –> IP,范例:

# name: 某主机的FQDN,例如:www.magedu.org.
# value: 主机名对应主机的IP地址
# 避免用户写错名称时给错误答案,可通过泛域名解析进行解析至某特定地址
www.magedu.org.         IN  A   1.1.1.1
www.magedu.org.         IN  A   2.2.2.2
mx1.magedu.org.         IN  A   3.3.3.3
mx2.magedu.org.         IN  A   4.4.4.4
$GENERATE 1-254 HOST$   IN  A   1.2.3.$
*.magedu.org.           IN  A   5.5.5.5
magedu.org.             IN  A   6.6.6.6

AAAA

FQDN –> IPv6

name: FQDN
value: IPv6

PTR

PoinTeR,IP –> FQDN,范例:

# name: IP,有特定格式,把IP地址反过来写,1.2.3.4,要写作4.3.2.1;而有特定后缀:in-addr.arpa.,所以完整写法为:4.3.2.1.in-addr.arpa.
# value: FQDN
4.3.2.1.in-addr.arpa.  IN  PTR  www.magedu.org.
# 网络地址及后缀可省略;主机地址依然需要反着写,如1.2.3为网络地址,可简写成:
4       IN  PTR  www.magedu.org.

CNAME

Canonical Name,别名记录,范例:

# name: 别名的FQDN
# value: 真正名字的FQDN
www.magedu.org. IN CNAME websrv.magedu.org.

TXT

对域名进行标识和说明的一种方式,一般做验证记录时会使用此项,如:SPF(反垃圾邮件)记录,https 验证等。范例:

_dnsauth TXT 2012011200000051qgs69bwoh4h6nht4n1h0lr038x

子域授权

每个域的名称服务器,都是通过其上级名称服务器在解析进行授权。

glue record:粘合记录,父域授权子域的记录。

范例:

.com. IN NS ns1.com.
.com. IN NS ns2.com.
ns1.com. IN A 2.2.2.1
ns2.com. IN A 2.2.2.

互联网域名

注册,备案,解析。。。

DNS 软件 bind

DNS 服务器软件:bind、powerdns、dnsmasq、unbound、coredns

bind 相关程序包

  • bind:服务端
  • bind-libs:相关库
  • bind-utils:客户端
  • bind-chroot:安全包,默认将 dns 相关文件放至/var/named/chroot
[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

    zone “ZONE_NAME” IN {}

注意:

  • 任何服务器程序如果期望能够通过网络被其他主机访问,至少应该监听在一个能与外部主机通信的 IP 地址上
  • 缓存名称服务器配置:监听外部地址即可
  • dnssec:建议关闭 dnssc,设为 no

实现 DNS 服务器

主 DNS 服务器配置

1. 定义区域

主 DNS 服务器配置文件:/etc/named.conf,示例:

#注释掉下面两行
// listen-on port 53 { 127.0.0.1; };
// allow-query { localhost; };

# 添加区域
zone "ZONE_NAME" IN {
 type {master| slave | hint | forward};
 file "ZONE_NAME.zone";
};
  • 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/目录下;

内容包括两部分:宏定义 和 资源记录,范例:

$TTL 86400
$ORIGIN magedu.org.
@   IN  SOA  ns1.magedu.org.  admin.magedu.org (
              2015042201
              1H
              5M
              7D
              1D )
  IN  NS   ns1
  IN  NS   ns2
  IN  MX   10      mx1
  IN  MX   20      mx2
ns1  IN  A   172.16.100.11
ns2  IN  A   172.16.100.12
mx1  IN  A   172.16.100.13
mx2  IN  A   172.16.100.14
websrv  IN  A   172.16.100.11
websrv  IN  A   172.16.100.12
www  IN  CNAME  websrv

3. 主配置文件语法检查

[root@centos8 ~]$named-checkconf

4. 主配置文件语法检查

named-checkzone [options] zonename filename
[root@centos8 ~]$named-checkzone "magedu.org" /var/named/magedu.org.zone

5. 配置生效

三种方式:

  • rndc reload
  • systemctl reload named
  • service named reload

测试和管理工具

dig
yum install bind-utils

dig 只用于测试 dns 系统,不会查询 hosts 文件进行解析

dig [-t type] name [@SERVER] [query options]
  • -t:要查询的资源记录类型。默认 A,除了 AAAA、NS 这一类,还可以是 axfr(全区域传输) 和 ixfr(增量区域传输)。

  • query options:

    +[no]trace:跟踪解析过程 : dig +trace magedu.org +[no]recurse:进行递归解析

host
host [-t type] name [SERVER]

范例:

host -t NS magedu.org 172.16.0.1
host -t soa magedu.org
host -t mx magedu.org
host -t axfr magedu.org
host 1.2.3.4
nslookup
yum install bind-utils

nslookup 可以支持交互和非交互式两种方式执行

nslookup [-option] [name | -] [server]

交互模式:

nslookup>
 server IP: 指明使用哪个DNS server进行查询
 set q=RR_TYPE: 指明查询的资源记录类型
 NAME: 要查询的名称
rndc

利用 rndc 工具可以实现管理 DNS 功能,rndc 监听端口: 953/tcp

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 语句块中添加以下指令:

Allow-update {any;};

实现反向解析区域

实现从服务器

只有一台主 DNS 服务器,存在单点失败的问题,可以建立主 DNS 服务器的备份服务器,即从服务器来实现 DNS 服务的容错机制。从服务器可以自动和主服务器进行单向的数据同步,从而和主 DNS 服务器一样,也可以对外提供查询服务,但从服务器不提供数据更新服务。

DNS 从服务器

  1. 应该为一台独立的名称服务器
  2. 主服务器的区域解析库文件中必须有一条 NS 记录指向从服务器
  3. 从服务器只需要定义区域,而无须提供解析库文件;解析库文件应该放置于/var/named/slaves/目录中
  4. 主服务器得允许从服务器作区域传送
  5. 主从服务器时间应该同步,可通过 ntp 进行
  6. bind 程序的版本应该保持一致;否则,应该从高,主低

定义从区域

格式:

zone "ZONE_NAME" IN {
    type slave;
    masters { MASTER_IP; };
    file "slaves/ZONE_NAME.zone";
};

实战案例:实现 DNS 从服务器

实现子域

将子域委派给其他主机管理,实现分布 DNS 数据库

正向解析 DNS 区域子域方法,很简单,只需要配置两条资源记录,一条 NS,一条 A,范例:

shanghai.magedu.local.        IN  NS  ns1.shanghai.magedu.local.
shanghai.magedu.local.        IN  NS  ns2.shanghai.magedu.local.
zhengzhou.magedu.local.       IN  NS  ns1.zhengzhou.magedu.local.
zhengzhou.magedu.local.       IN  NS  ns2.zhengzhou.magedu.local.
ns1.shanghai.magedu.local.    IN  A   1.1.1.1
ns2.shanghai.magedu.local.    IN  A   1.1.1.2
ns1.zhengzhou.magedu.local.   IN  A   1.1.1.3
ns2.zhengzhou.magedu.local.   IN  A   1.1.1.4

范例:实现 DNS 父域和子域服务

实现 DNS 转发(缓存)服务器

利用 DNS 转发,可以将用户的 DNS 请求,转发至指定的 DNS 服务器,而非默认的根 DNS 服务器,并将指定服务器查询的返回结果进行缓存,提高效率

注意:被转发的服务器需要能够为请求者做递归,否则转发请求不予执行

转发方式有两种:全局转发 和 特定区域转发

全局转发:对非本机所负责解析区域的请求,全转发给指定的服务器

特定区域转发:仅转发对特定的区域的请求,比全局转发优先级高

# 无论全局转发还是特定区域转发,都需要关闭dnssec功能
options {
    dnssec-enable no;
    dnssec-validation no;
};
# 全局转发
options {
    forward first|only;
    forwarders { ip;};
};

# 特定区域转发
zone "ZONE_NAME" IN {
type forward;
forward first|only;
forwarders { ip;};
};
  • first:先转发至指定 DNS 服务器,如果无法解析查询请求,则本服务器再去根服务器查询
  • only:先转发至指定 DNS 服务器,如果无法解析查询请求,则本服务器将不再去根服务器查询

[实战案例:实现 DNS forward(缓存)服务器](实验 4:DNS forward(缓存)服务器.md)

智能 DNS

智能 DNS 相关技术

ACL

ACL:把一个或多个地址归并为一个集合,并通过一个统一的名称调用,简单说就是对发起 dns 解析请求的客户端的 ip 进行分类,通常会根据省市地区进行分类

注意:只能先定义后使用;因此需要定义在 options 前面

格式:

acl acl_name {
 # 可以是具体ip,也可以网段
    ip;
    net/prelen;
    ...
};
...
options {...}

bind 内置 4 个 acl:none、any、localhost、localnet

  • none:没有一个主机
  • any:任意主机
  • localhost:本机
  • localnet:本机的 IP 同掩码运算后得到的网络地址

访问控制指令

  • allow-query {}: 允许查询的主机;白名单
  • allow-transfer {}:允许区域传送的主机;白名单
  • allow-recursion {}: 允许递归的主机,建议全局使用
  • allow-update {}: 允许更新区域数据库中的内容

{}中填入的就是 acl,范例:

allow-query { localhost; };  # 只处理来自本机的dns解析请求

view

视图,将 ACL 和区域数据库实现对应关系,以实现智能 DNS

view 格式:

# 一个bind服务器可定义多个view,每个view只能匹配一个acl
# 客户端请求到达时,自上而下检查view中的acl
# 当请求者的ip能被acl匹配到,则使用所在view中的zone数据库,处理其dns解析请求
view VIEW_NAME {
 match-clients { acl_name; }; # match-clients 只能匹配一个acl
 zone "ZONE_NAME" {
  type master;
  file "ZONE_FILE";
 };
 include "/etc/named.rfc1912.zones";
};

# 来自上海的ip,则匹配到对应的zone数据库
view VIEW_NAME {
 match-clients { shanghainet; };  # shanghainet是已经定义的acl
 zone "magedu.local" {
  type master;
  file "magedu.local.zone.sh";
 };
 include "/etc/named.rfc1912.zones";
};
  • ACL 定义在 options 之前,view 定义在 options 之后
  • 一旦启用了 view,所有的 zone 都只能定义在 view 中
  • 仅在允许递归请求的客户端所在 view 中定义根区域

实战案例:利用 view 实现智能 DNS

借助智能 DNS 实现的技术

GSLB

Global Server Load Balance 全局负载均衡

GSLB 是对服务器和链路进行综合判断来决定由哪个地点的服务器来提供服务,实现异地服务器群服务质量的保证

GSLB 主要的目的是在整个网络范围内将用户的请求定向到最近的节点(或者区域)

GSLB 分为基于 DNS 实现、基于重定向实现、基于路由协议实现,其中最通用的是基于 DNS 解析方式

CDN

  1. 用户向浏览器输入www.a.com这个域名,浏览器第一次发现本地没有dns缓存,则向网站的DNS服务器请求

  2. 网站的 DNS 域名解析器设置了 CNAME,指向了www.a.tbcdn.com,请求指向了CDN网络中的智能DNS负载均衡系统

  3. 智能 DNS 负载均衡系统解析域名,把对用户响应速度最快的 IP 节点返回给用户;

  4. 用户向该 IP 节点(CDN 服务器)发出请求

  5. 由于是第一次访问,CDN 服务器会通过 Cache 内部专用 DNS 解析得到此域名的原 web 站点 IP,向原站点服务器发起请求,并在 CDN 服务器上缓存内容

  6. 请求结果发给用户

DNS 排错

SERVFAIL:The nameserver encountered a problem while processing the query.
# 可使用dig +trace排错,可能是网络和防火墙导致
NXDOMAIN:The queried name does not exist in the zone.
# 可能是CNAME对应的A记录不存在导致
REFUSED:The nameserver refused the client's DNS request due to policy restrictions.
# 可能是DNS策略导致

实战案例

综合案例:实现 inertnet 的 DNS 服务架构


域名系统DNS服务
http://blog.lujinkai.cn/运维/DNS/域名系统DNS服务/
作者
像方便面一样的男子
发布于
2021年2月4日
更新于
2023年12月5日
许可协议