许吉友 - 运维

DNS 协议详解

域名结构

域名系统并不像电话号码通讯录那么简单,通讯录主要是单个个体在使用,同一个名字出现在不同个体的通讯录里并不会出现问题,但域名是群体中所有人都在用的,必须要保持唯一性。为了达到唯一性的目的,因特网在命名的时候采用了层次结构的命名方法。每一个域名(本文只讨论英文域名)都是一个标号序列(labels),用字母(A-Z,a-z,大小写等价)、数字(0-9)和连接符(-)组成,标号序列总长度不能超过255个字符,它由点号分割成一个个的标号(label),每个标号应该在63个字符之内,每个标号都可以看成一个层次的域名。级别最低的域名写在左边,级别最高的域名写在右边。域名服务主要是基于UDP实现的,服务器的端口号为53。

比如:本网站的域名 xujiyou.work,由点号分割成了两个域名 xujiyou 和 work,其中 work是顶级域名(TLD,Top-Level Domain), xujiyou是二级域名(SLD,Second Level Domain)。 注意:最开始的域名最后都是带了点号的,比如 xujiyou.work 搁以前的话应该是 xujiyou.work. ,最后面的点号表示根域名服务器,后来发现所有的网址都要加上最后的点,就简化了写法,干脆所有的都不加,但是你在网址后面加上点号也是可以正常解析的。

域名服务器

有域名结构还不行,还需要有一个东西去解析域名,手机通讯录是由通讯录软件解析的,域名需要由遍及全世界的域名服务器去解析,域名服务器实际上就是装有域名系统的主机。由高向低进行层次划分,可分为以下几大类:

域名解析过程

域名解析总体可分为两大步骤,第一个步骤是本机向本地域名服务器发出一个DNS请求报文,报文里携带需要查询的域名;第二个步骤是本地域名服务器向本机回应一个DNS响应报文,里面包含域名对应的IP地址。从下面对xujiyou.work进行域名解析的报文中可明显看出这两大步骤。注意:第二大步骤中采用的是迭代查询,其实是包含了很多小步骤的,详情见下面的流程分析。

其具体的流程可描述如下:

  1. 主机10.74.36.90先向本地域名服务器10.74.1.11进行递归查询
  2. 本地域名服务器采用迭代查询,向一个根域名服务器进行查询
  3. 根域名服务器告诉本地域名服务器,下一次应该查询的顶级域名服务器dns.work的IP地址
  4. 本地域名服务器向顶级域名服务器 dns.work进行查询
  5. 顶级域名服务器me告诉本地域名服务器,下一步查询权限服务器dns.xujiyou.work 的IP地址
  6. 本地域名服务器向权限服务器 dns.xujiyou.work进行查询
  7. 权限服务器 dns.xujiyou.work告诉本地域名服务器所查询的主机的IP地址
  8. 本地域名服务器最后把查询结果告诉 10.74.36.90

其中有两个概念递归查询和迭代查询,其实在整个描述的过程中已经体现的很明显,这里再说明一下:

DNS 报文格式

DNS 分为查询请求和查询响应,请求和响应的报文结构基本相同。DNS 报文格式如图所示:

image-20201222100341316

上图中显示了 DNS 的报文格式。其中,事务 ID、标志、问题计数、回答资源记录数、权威名称服务器计数、附加资源记录数这 6 个字段是DNS的报文首部,共 12 个字节。

整个 DNS 格式主要分为 3 部分内容,即基础结构部分、问题部分、资源记录部分。下面将详细地介绍每部分的内容及含义。

基础结构部分

image-20201222101243138

基础结构部分中的标志字段又分为若干个字段,如图所示:

image-20201222104355229

问题部分

问题部分指的是报文格式中查询问题区域(Queries)部分。该部分是用来显示 DNS 查询请求的问题,通常只有一个问题。该部分包含正在进行的查询信息,包含查询名(被查询主机名字)、查询类型、查询类。

image-20201222105054784

该部分中每个字段含义如下:

资源记录部分

资源记录部分是指 DNS 报文格式中的最后三个字段,包括回答问题区域字段、权威名称服务器区域字段、附加信息区域字段。这三个字段均采用一种称为资源记录的格式,格式如图所示:

image-20201222104906363

资源记录格式中每个字段含义如下:

资源记录部分只有在 DNS 响应包中才会出现。

DNS 记录类型

FreeIPA 中的 DNS 一共支持 20 种记录类型,如下图所示:

image-20201222105242613

维基百科中的类型:

代码 号码 定义的 RFC 描述 功能
A 1 RFC 1035 IPv4地址记录 传回一个32位的IPv4地址,最常用于映射主机名称IP地址,但也用于DNSBLRFC 1101)等。
AAAA 28 RFC 3596 IPv6地址记录 传回一个128位的IPv6地址,最常用于映射主机名称到IP地址。
AFSDB 18 RFC 1183 AFS文件系统 (Andrew File System)数据库核心的位置,于域名以外的 AFS 客户端常用来联系 AFS 核心。这个记录的子类型是被过时的的 DCE/DFS(DCE Distributed File System)所使用。
APL 42 RFC 3123 地址前缀列表 指定地址栏表的范围,例如:CIDR 格式为各个类型的地址(试验性)。
CAA 257 RFC 6844 权威认证授权 DNS认证机构授权,限制主机/域的可接受的CA
CDNSKEY 60 RFC 7344 子关键记录 关键记录记录的子版本,用于转移到父级
CDS 59 RFC 7344 子委托签发者 委托签发者记录的子版本,用于转移到父级
CERT 37 RFC 4398 证书记录 存储 PKIXSPKIPGP等。
CNAME 5 RFC 1035 规范名称记录 一个主机名字的别名:域名系统将会继续尝试查找新的名字。
DHCID 49 RFC 4701 DHCP(动态主机设置协议)标识符 用于将 FQDN 选项结合至 DHCP
DLV 32769 RFC 4431 DNSSEC(域名系统安全扩展)来源验证记录 为不在DNS委托者内发布DNSSEC的信任锚点,与 DS 记录使用相同的格式,RFC 5074 介绍了如何使用这些记录。
DNAME 39 RFC 2672 代表名称 DNAME 会为名称和其子名称产生别名,与 CNAME 不同,在其标签别名不会重复。但与 CNAME 记录相同的是,DNS将会继续尝试查找新的名字。
DNSKEY 48 RFC 4034 DNS 关键记录 于DNSSEC内使用的关键记录,与 KEY 使用相同格式。
DS 43 RFC 4034 委托签发者 此记录用于鉴定DNSSEC已授权区域的签名密钥。
HIP 55 RFC 5205 主机鉴定协议 将端点标识符及IP 地址定位的分开的方法。
IPSECKEY 45 RFC 4025 IPSEC 密钥 IPSEC 同时使用的密钥记录。
KEY 25 RFC 2535[1]RFC 2930[2] 关键记录 只用于 SIG(0)(RFC 2931)及 TKEY(RFC 2930)。[3]RFC 3455 否定其作为应用程序键及限制DNSSEC的使用。[4]RFC 3755 指定了 DNSKEY 作为DNSSEC的代替。[5]
LOC记录(LOC record) 29 RFC 1876 位置记录 将一个域名指定地理位置。
MX记录(MX record) 15 RFC 1035 电邮交互记录 引导域名到该域名的邮件传输代理(MTA, Message Transfer Agents)列表。
NAPTR记录(NAPTR record) 35 RFC 3403 命名管理指针 允许基于正则表达式的域名重写使其能够作为 URI、进一步域名查找等。
NS 2 RFC 1035 名称服务器记录 委托DNS区域(DNS zone)使用已提供的权威域名服务器。
NSEC 47 RFC 4034 下一代安全记录 DNSSEC 的一部分 — 用来验证一个未存在的服务器,使用与 NXT(已过时)记录的格式。
NSEC3 50 RFC 5155 NSEC 记录第三版 用作允许未经允许的区域行走以证明名称不存在性的 DNSSEC 扩展。
NSEC3PARAM 51 RFC 5155 NSEC3 参数 与 NSEC3 同时使用的参数记录。
OPENPGPKEY 61 RFC 7929 OpenPGP公钥记录 基于DNS的域名实体认证方法,用于使用OPENPGPKEY DNS资源记录在特定电子邮件地址的DNS中发布和定位OpenPGP公钥。
PTR 12 RFC 1035 指针记录 引导至一个规范名称(Canonical Name)。与 CNAME 记录不同,DNS“不会”进行进程,只会传回名称。最常用来运行反向 DNS 查找,其他用途包括引作 DNS-SD
RRSIG 46 RFC 4034 DNSSEC 证书 DNSSEC 安全记录集证书,与 SIG 记录使用相同的格式。
RP 17 RFC 1183 负责人 有关域名负责人的信息,电邮地址的 @ 通常写为 a
SIG 24 RFC 2535 证书 SIG(0)(RFC 2931)及 TKEY(RFC 2930)使用的证书。[5]RFC 3755 designated RRSIG as the replacement for SIG for use within DNSSEC.[5]
SOA 6 RFC 1035 权威记录的起始 指定有关DNS区域的权威性信息,包含主要名称服务器、域名管理员的电邮地址、域名的流水式编号、和几个有关刷新区域的定时器。
SPF 99 RFC 4408 SPF 记录 作为 SPF 协议的一部分,优先作为先前在 TXT 存储 SPF 数据的临时做法,使用与先前在 TXT 存储的格式。
SRV记录(SRV record) 33 RFC 2782 服务定位器 广义为服务定位记录,被新式协议使用而避免产生特定协议的记录,例如:MX 记录。
SSHFP 44 RFC 4255 SSH 公共密钥指纹 DNS 系统用来发布 SSH 公共密钥指纹的资源记录,以用作辅助验证服务器的真实性。
TA 32768 DNSSEC 信任当局 DNSSEC 一部分无签订 DNS 根目录的部署提案,,使用与 DS 记录相同的格式[6][7]
TKEY记录(TKEY record) 249 RFC 2930 秘密密钥记录 TSIG提供密钥材料的其中一类方法,that is 在公共密钥下加密的 accompanying KEY RR。[8]
TSIG 250 RFC 2845 交易证书 用以认证动态更新(Dynamic DNS)是来自合法的客户端,或与 DNSSEC 一样是验证回应是否来自合法的递归名称服务器。[9]
TXT 16 RFC 1035 文本记录 最初是为任意可读的文本 DNS 记录。自1990年起,些记录更经常地带有机读数据,以 RFC 1464 指定:机会性加密(opportunistic encryption)、Sender Policy Framework(虽然这个临时使用的 TXT 记录在 SPF 记录推出后不被推荐)、DomainKeys、DNS-SD等。
URI 256 RFC 7553 统一资源标识符 可用于发布从主机名到URI的映射。

常见的记录类型如下:

一般来说,为了服务的安全可靠,至少应该有两条NS记录,而A记录和MX记录也可以有多条,这样就提供了服务的冗余性,防止出现单点失败。

由于CNAME记录就是一个替换,所以域名一旦设置CNAME记录以后,就不能再设置其他记录了(比如A记录和MX记录)