DNS:关于 DNS 基本概念的一些笔记整理
简单介绍
DNS(DNS-Domain Name System) ,中文名即域名系统,简单理解,即将域名和 IP 地址相互映射的一个分布式数据库,用于 域名解析IP地址,IP地址反向解析域名 ,能够使人更方便地访问互联网。DNS 使用 TCP 和 UDP 端口 53,系统内存储了 网络主机地址和资源目录 的一个分层命名系统。分层类似树一样。
这里的 资源目录 指将 域名 映射到不同 资源记录。并保存在称为 资源记录 的逻辑条目中。
DNS 层次结构从顶部的 根域(.) 开始,向下分支到多个下一级域。DNS 层次结构的每一层都由域名中的 . 描述,. 是最顶层。域名如.com、.Net和.org 占据层次结构的第二层,例如example.com,占据在第三层, liruilongs.github.io占据第四层。
在全球互联网中,部署 DNS 服务中存放最高级别的域名的服务器,称之为 根服务器。负责返回顶级域名的权威域名服务器的地址,按照解析 IP 来分,有 IPV4 和 IPV6 两种,按照服务器类型分,分为 主根服务器 和 辅根服务器,或者可在加一个 镜像服务器
IPV4
最早是 IPV4,全球只有 13 台(这 13 台 IPv4 根域名服务器名字分别为“A”至“M”),1 个为主根服务器在美国,由美国互联网机构 Network Solutions 运作。其余 12 个均为辅根服务器,其中 9 个在美国, 2 个在欧洲(位于英国和瑞典), 1 个在亚洲(位于日本)。
实际上 DNS 根域名服务器并不真的只有 13 台,而是 13 个 IP,对应了 A-M 13 个编号,借由任播(Anycast)技术,编号相同的根服务器使用同一个 IP(类似一个集群)。截至 2014 年 10 月,全球有 504 台根服务器,被编号为 A 到 M 共 13 个标号。504 台根服务器大部分借由任播(Anycast)技术,编号相同的根服务器使用同一个 IP,504 台根服务器总共只使用 13 个 IP,因此可以抵抗针对其所进行的分布式拒绝服务攻击(DDoS)。
中国的镜像服务器:
中国大陆在北京有三台编号为 L 的镜像,编号为 F、I、J 的镜像各一台,共 6 台
香港有编号为 D、J 的镜像各 2 台,编号为 A、F、I、L 的镜像各一台,共 8 台
台湾有编号为 F、I、J 各一台,共 3 台。
为什么根服务器只有 13 台 ?
DNS 协议的最初定义要从 20 世纪 80 年代未期开始算起,它使用了 UDP 和 TCP 协议。UDP 通常用于 DNS 解析查询和响应,TCP 用于 DNS 主服务器和从服务器之间的区域数据传送。
遗憾的是,在所有 UDP 实现中能保证正常工作的最大包是 512 字节,对于在每个包中必须含有数字签名的一些 DNS 新特性(例如,DNSSEC)来说实在是太小了。
512 字节的限制还影响了根服务器的数量和名字。
要让所有的根服务器数据能包含在一个 512 字节的 UDP 包中,根服务器只能限制在 13 个,而每个服务器要使用字母表中的单个字母命名。
以太网数据的长度必须在 46-1500 字节之间,这是由以太网的物理特性决定的。事实上,这个 1500 字节就是网络层 IP 数据包的长度限制,理论上,IP 数据包最大长度是 65535 字节。
在 Internet 数据传输中,UDP 数据长度控制在 576 字节(Internet 标准 MTU 值),而在许多 UDP 应用程序设计中数据包被限制成 512 字节或更小。这样可以防止数据包的丢失。
许多解析器首先发送一条 UDP 查询,如果它们接收到一条被截断的响应,则会用 TCP 重新发送该查询。这个过程绕过了 512 字节的限制,但是效率不高。
您或许认为 DNS 应该避开 UDP,总是使用 TCP,但是 TCP 连接的开销大得多。
一次 UDP DNS 交换可以短到两个包:一个查询包、一个响应包。
一次 TCP 交换则至少包含 7 个包:三次握手初始化 TCP 会话、一个查询包、一个响应包以及最后一次握手来关闭连接。
IPV6
IPV4 受长度的限制,担忧多年的 IPv4 地址耗尽时刻还是到了。负责英国、欧洲、中东和部分中亚地区互联网资源分配的欧洲网络协调中心通过邮件确认,其最后的 IPv4 地址储备池已于 2019 年 11 月 25 日完全耗尽。
IPv6 是 IP 协议 的最新版本,用它来取代 IPv4 ,主要是为了解决 IPv4 地址枯竭问题,同时它也在其他方面对于 IPv4 有许多改进。
然而长期以来 IPv4 在互联网流量中仍占据主要地位,同时 NAT 的出现 ,使得 IPv6 的使用增长缓慢。在 2022 年 4 月,通过 IPv6 使用 Google 服务的用户百分率首次超过 40%。
在与现有 IPv4 根服务器体系架构充分兼容基础上,雪人计划 于 2016 年在全球 16 个国家完成 25 台 IPv6 根服务器架设,事实上形成了 13 台原有根加 25 台 IPv6 根的新格局.
为建立多边、民主、透明的国际互联网治理体系打下坚实基础。中国部署了其中的 4 台,由 1 台主根服务器和 3 台辅根服务器组成,打破了中国过去没有根服务器的困境。
DNS 解析顺序
粗粒度的看,当我们在浏览器中输入域名的时候,或者应用程序处理域名解析时,一般首先会基于编程语言调用系统的 Socket 库来进行 DNS 解析,获取到对应的 IP,然后封装 网络层的相关数据包,添加首部,依次到链路层发出请求。
如果细粒度看,实际发生了好多细节,以 Linux 为例,首先会通过名称解析服务 etc/nsswitch.conf 读取 DNS 解析规则,通过文件中定义的 解析顺序发生解析。
$ cat /etc/nsswitch.conf | grep host
# hosts: files dns
# hosts: files dns # from user file
hosts: files dns myhostname
$
当解析发生时,首先通过 files 本地文件 /etc/hosts 发生解析,在 /etc/hosts 文件配置中,我们可以配置一些当前环境的自定义映射
$ cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.254.254 classroom.example.com classroom
172.25.254.254 content.example.com content
172.25.254.254 materials.example.com materials
### rht-vm-hosts file listing the entries to be appended to /etc/hosts
172.25.250.254 bastion.lab.example.com bastion
172.25.250.9 workstation.lab.example.com workstation
172.25.250.10 servera.lab.example.com servera
172.25.250.11 serverb.lab.example.com serverb
172.25.250.12 serverc.lab.example.com serverc
172.25.250.13 serverd.lab.example.com serverd
$
如果没有则通过 dns 解析,当需要从 DNS 获取信息时,如果对应的集群存在 DNS 缓存,可能会重缓存中获取,如果缓存中没有,会由存根解析器(stub resolver)向 /etc/resolv.conf 文件中第一个 nameserver记录查询 DNS 信息。如果该服务器没有响应,它将依次尝试其他服务器,直到获得答案或服务器用完为止。
$ cat /etc/resolv.conf
# Generated by NetworkManager
search lab.example.com example.com
nameserver 172.25.250.254
如果还是没有,则通过 myhostname 即当前主机名对应的DNS进行解析。
调用 DNS 服务器发送解析过程
客户端联系的 DNS 服务器通常是递归或者缓存 DNS服务器。通过会通过下面的方式检索客户端的答案:
如果客户端联系的 DNS 服务器恰好是 查询记录的权威际服务器则权威 DNS 服务器立即回答查询,因为权威服务器已经在本地存储了查询区域的信息。
如果客户端联系的 DNS 服务器是 缓存 DNS 服务器,而且之前已经查询过对应记录并且数据缓存在本地且尚未过期,缓存 DNS 服务器也会立即向客户端提供答案。这减少了获取常用信息的延迟。每个查询都有一个关联的生存时间(TTL)值,该值由权威服务器设置。
如果客户端联系的 缓存 DNS 服务器本地未执行过对应记录查询,或者缓存的数据已经过期,那么存 DNS 服务器继续对其他 DNS 服务器执行迭代查找,以获取客户端的信息。一旦获得了客户查询的答案,它就会将该信息提供给客户。
DNS 的一些基本概念
关于 DNS 的一些基本概念:域、子域和区域。
Domain 域,是 resource records 的集合,以通用名结尾,表示 DNS 命名空间的整个子树,如 example.com.。
Subdomain 子域:是另一个域的完整子树的域。在讨论两个域之间的关系时使用此术语。例如,lab.example.com 是 example.com 的子域,而 example.com 是 .com 的子域。您也可以将 example.com 称为第二级域,并将 lab.example.com 称为第三级域。
Zone 区域:是特定 DNS 服务器直接负责的域。它可能是整个域,也可能只是域的一部分。Zone 可以将部分或全部子域都委派给另一个 DNS 服务器或多个 DNS 服务器。
例如,root DNS 服务器对 root zone 具有权威性,但它们将 .com 域的职责委派给其他 DNS 服务器,这些 DNS 服务器为 .com 区域提供权威性应答。这些服务器还可以继续将责任委派给其他 DNS 服务器。
再例如,redhat.fun DNS 服务器对redhat.tun zone 具有权威性,但他将 lab.redhat.fun zone 委派给lab.redhat.fun DNS 服务器。
DNS 资源记录表
DNS 区域中的DNS resource record(RR-DNS资源记录)条目指定有关区域中特定名称或对象的信息。资源记录格式如下:
DNS 记录,不管任何类型的资源目录都使用下面的格式
owner-name TTL class type data
www.example.com. 300 IN A 192.168.1.10
owner-name:查询条目,DNS 名称
TTL:生命周期/s
class:类别,IN interent,因特网
type:资源类型
data: 名称对应的值
资源类型
A
A 资源记录将主机名映射到 IPv4 地址。
host.example.com. 86400 IN A 172.25.254.254
AAAA
AAAA 资源记录(4A 记录)将主机名映射到 IPv6 地址。
a.root-servers.net. 604800 IN AAAA 2001:503:ba3e::2:30
CNAME:别名
CNAME 资源记录将一个名称映射为规范名称,规范名称具有 A 或 AAAA 记录。CNAME 记录的数据字段可以指向任意名称,无论该区域是内部的还是外部的:
www-dev.example.com. 30 IN CNAME lab.example.com.
www.example.com. 30 IN CNAME www.redhat.com.
CNAME 记录可能指向具有 CNAME 的名称,但 CNAME 记录链最终必须解析为 A 或 AAAA 记录的名称。
通常,避免将 CNAME 记录指向其他 CNAME 记录。CNAME 会使查找效率降低,并且您可能会意外地创建一个指向彼此的 CNAME 记录循环。
CNAME 记录链有合法用途。例如,它们与 Content Delivery Network(CDN)结合使用。NS 和 MX 记录不得指向带有 CNAME 记录的名称,而是使用带有 A 和/或 AAAA 资源记录的名称。
PTR:IP 到域名反向解析
PTR 或 pointer 资源记录将 lPv4 或 IPv6 地址映射到主机名。它们用于反向 DNS 解析。PTR 记录以一种类似于主机名的特殊格式对 IP 地址进行编码。
对于 IPv4 地址,该地址被颠倒,以最具体的部分开始,然后视为 in-addr.arpa 域的子域中的主机。
对于 IPV6 地址,该地址在半字节边界(每个十六进制数字)上划分为子域,并设置为 ip6.arpa 域的子域。
4.0.41.198.in-addr.arpa. 785 IN PTR a.root-servers.net.
0.3.0.0.2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.e.3.a.b.3.0.5.0.1.0.0.2.ip6.arpa. 86400 IN PTR a.root-servers.net.
该语法可能看起来很奇怪,但是它简化了将地址范围的责任委托给其他 DNS 管理员的情况。
NS:指定区域的权威服务器
NS 或 DNS 服务器资源记录,将 域名映射到对其 DNS区域 具有 权威性的DNS 服务器,该区域的每个权威 DNS 服务器都必须其有 NS 记录。
example.com. 86400 IN NS classroom.example.com.
168.192.ip-addr.arpa. 86400 IN NS classroom.example.com.
9.0.e.1.4.8.4.6.2.e.d.f.ip6.arpa. 86400 IN NS classroom.example.com.
说明:
其中两个 NS 记录用于 192.168.0.0/16 网络和 fde2:6484:1e09:/48 网络的反向查找。
NS 记录映射的名称必须有 A 或 4A 记录。
可以正向或者反向解析
SOA:指定 DNS 运行信息
SOA 资源记录,也叫做起始授权机构记录,提供有关 DNS 区域如何运行的信息。每个区域必须有一个 SOA 记录。
example.com. 86400 IN SOA classroom.example.com. root.classroom.example.com. 2015071700 3600 300 604800 60
MNAME | classroom.example.com. : 该 DNS 服务器是这个区域的主要 DNS 服务器负责维护区域资源记录。
RNAME | root.classroom.example.co :该区域中负责人邮件地址,(@用.代替,例如root@classroom.example.com.
SERIAL | 2015071700 :该区域版本号,随着区域中记录更改而增加。
REFRESH | 3600 : 从 DNS 服务器向主 DNS 服务器更新数据频.单位秒。
RETRY | 300 : 在重试失败的刷新前,应当等待的时间间隔。单位秒。
EXPIRE | 604800 :如果刷新失败,从服务器在停止其旧的区域副本响应查询之前等待的时间。单位秒。
MINIMUM:| 60 :如果解析器查找某个名称,并且该名称不存在,解析器应将“记录不存在”这一信息缓存的时间。单位秒。
MX
MX 资源记录将域名映射到接受该域的电子邮件的邮件交换(mail exchange)。该记录类型的数据是用于确定在多个 MX 记录之间选择邮件服务器(值越小,优先级越高),提供负载平衡和冗余的邮件服务器。
example.com.86400 IN MX 10 classroom.example.com.
example.com.86400 IN MX 10 mail.example.com.
example.com.86400 IN MX 100 mailbackup.example.com.
TXT
TXT 资源记录将名称映射到编码为可打印 ASCl 字符的任意文本。它们通常用于提供用于各种电子邮件身份验证方案(例如 SPF,DKIM 和 DMARC)的数据,以验证域所有权(例如,用于 Google 和 Facebook),以及用于其他目的。
lwn.net. 27272 IN TXT "google-site-verification:sVlx-S z1es5DfNSUNXrqr3n9Y4F7tOr7HNVMKUGs"
lwn.net. 27272 IN TXT "v=spf1 a:mail.lwn.net a:prod.lwn.net a:git.lwn.neta:ms.lwn.net-all"
SRV 特定服务主机
SRV 资源记录可帮助客户端找到域中支特定服务的主机。
ldap.tcp.example.com.86400 IN SRV 0 100 389 server0.example.com.
有特定的格式要求
含义:表明存在一个可以使用 TCP 传输协议(tcp)与 LDAP 连接的 LDAP 服务器(ldap),该主机属于域 example.com。LDAP 服务器是 server0.example.com,正在侦听端口 389,优先级为 0,权重为 100(如果客户端接收到多个 SRV 记录,则控制选择哪个服务器)。
主机和资源记录:
无论是客户端还是服务器,都具有以下 DNS 资源记录:
一个或多个 A 或 AAAA 记录
用于将其 IP 地址反向映射到名称的 PTR 记录
一个或多个 CNAME 记录(可选)
DNS zone 还具有以下资源记录:
唯一的 SOA 记录
每个权威 DNS 服务器的 NS 记录
一个或多个 MX 记录(可选)
用于在域中查找服务的一个或多个 SRV 记录(可选)
DNS 安全
DNS 对于 Internet 的运行至关重要,基本的 DNS 协议非常容易受到欺骗和篡改攻击。
DNS 的原始设计没有提供用于缓存 DNS 服务器以验证来自权威服务器的响应的真实性的方法。攻击者可能伪造对 DNS 查找的响应,伪装成权威服务器,然后将流量重定向到恶意主机。缓存 DNS 服务器将坏数据存储在其缓存中,并在看起来有效的情况下将其提供给其他客户端,该技术通常称为缓存中毒。
为了解决这个问题,许多区域使用域名系统安全扩展(DNSSEC-Domain Name System Security Extensions)。每个使用 DNSSEC 的区域都经过数字签名,并向解析器提供包含这些签名的特殊资源记录。
作者:山河已无恙
欢迎关注微信公众号 :山河已无恙