本文介绍了互联网中的一个核心基础服务:域名系统(DNS),从如何命名设备、如何完成名字到 IP 地址的转换、如何维护域名这三个问题逐步讲解了 DNS 的名字空间、名字服务器以及报文格式,最后简单介绍了 DNS 的攻击与防御手段。
1. DNS 介绍
DNS(Domain Name System,域名系统)是互联网上的一种分布式数据库系统,其主要功能是将人们便于记忆的域名(例如 www.example.com
)转换为计算机能识别的 IP 地址(例如 192.0.2.1
)。DNS 属于核心的 Internet 功能,但以应用层协议实现。
由于 IP 地址对人类来说难以记忆和管理,DNS 作为一种“翻译器”,大大简化了网络资源的访问和管理过程。当服务器的 IP 地址发生变化时,只需更新 DNS 记录,用户仍然可以使用原来的域名访问服务,而无需通知每个用户更新访问地址。
DNS 可以配置多条记录实现流量分散和备份机制(负载均衡与冗余),从而提高服务的可靠性和性能。且 DNS 采用分层、分布式的结构管理,由若干分布式的数据库完成名字到 IP 地址的转换,使全球的域名解析任务高效而可靠,避免了单点故障。
在大多数情况下,DNS 客户端向服务器发送查询时使用 UDP 协议,特别是当响应数据小于 512 字节时。当 DNS 响应的数据超过 512 字节,或者在进行区域传输(即 DNS 服务器之间的数据同步)时,DNS 会使用 TCP 协议。
DNS 系统需要解决三个问题:如何命名设备、如何完成名字到 IP 地址的转换、如何维护(增加或者删除一个域,需要在域名系统中做哪些工作)。
2. 名字空间
DNS 的名字空间是指 DNS 系统中域名的组织结构和命名规则,它构成了一个层次化、分布式的命名体系,使得互联网中的资源能够被唯一标识和高效定位。
其层次化命名结构如下:
- 根域(Root Domain):DNS 名字空间的顶端是根域,用一个点
.
表示。根域下划分出各个顶级域,根域服务器负责指引请求到对应的 TLD 服务器。DNS 只有一个根域,但为了实现高可靠性和高性能,根域由 13 个逻辑上独立的根服务器(从 A 到 M)来提供服务。 - 顶级域(Top-Level Domain,TLD):顶级域包括常见的通用顶级域(如
.com
、.org
、.net
)和国家代码顶级域(如.cn
、.uk
、.jp
)。这些域名由国际互联网组织和各国管理机构进行分配和管理。 - 二级域和子域:在顶级域之下,每个组织或个人可以注册二级域,例如
example.com
。在二级域内部,还可以进一步划分子域或主机名,如www.example.com
、mail.example.com
,这种层次结构有助于组织和管理网络资源。
一个域管理其下的子域,例如 .cn
被划分为 edu.cn
与 com.cn
,创建一个新的域,必须征得它所属域的同意。域与物理网络无关,域遵从组织界限,而不是物理网络,即一个域的主机可以不在同一个网络,一个网络的主机不一定在同一个域,域的划分是逻辑的,而不是物理的。
3. 名字服务器
名字服务器是一个分布式数据库系统的重要组成部分,它们共同协作完成从人类易记的域名转换为计算机所需的 IP 地址的任务。不同层级的名字服务器各司其职,主要包括:
- 根域名服务器:根域名服务器处于 DNS 层次结构的最顶端,负责接收递归解析器的初始查询请求,并返回负责顶级域的 TLD 服务器地址。虽然根服务器逻辑上只有 13 组,但实际部署时通过任播技术拥有数百甚至上千个物理实例,从而确保全球 DNS 解析的高可用性与高性能。
- 顶级域 DNS 服务器(TLD 服务器):TLD 服务器位于根服务器下一级,专门管理某个顶级域内的所有域名。以
.com
为例,TLD 服务器管理所有以.com
结尾的域名。当递归 DNS 服务器从根服务器获得 TLD 服务器的地址后,会向其发送查询请求,以便获取某个二级域(例如example.com
)的权威服务器地址。 - 权威 DNS 服务器:权威 DNS 服务器负责存储和发布特定域(Zone)内的 DNS 记录,包括 A 记录、CNAME 记录、MX 记录等。当查询到达权威 DNS 服务器时,它能够提供最终的、被认为“权威”的答案,也就是说返回的 IP 地址数据是经过域名管理员配置和维护的。例如,一个公司的域名
example.com
,其下的所有子域记录(如www.example.com
)都由该域的权威服务器负责解析。 - 本地域 DNS 服务器(递归解析器):本地域 DNS 服务器通常由互联网服务提供商(ISP)或企业内部部署,直接面向终端用户。当用户在浏览器中输入域名时,首先向本地域 DNS 服务器发送查询请求。这些服务器负责执行递归查询:如果本地缓存中没有相应记录,它们会依次向根、TLD 及权威服务器发起查询,直到获得最终答案,并将结果返回给用户。同时,它们还会将查询结果缓存一段时间,以加快后续的查询速度。
因此名字到 IP 的转换过程(DNS 解析过程)通常包括以下几个步骤:
- 本地缓存检查:当用户输入一个域名时,操作系统和浏览器会首先检查自身的 DNS 缓存,若缓存中已存有对应 IP,则直接返回。
- 查询本地域 DNS 服务器:如果本地没有缓存,客户端将查询请求发送给配置好的本地域 DNS 服务器(递归解析器)。此时,本地域 DNS 服务器开始执行递归查询过程:
- 根查询:本地域 DNS 服务器首先向一个根域名服务器发起查询,请求获取对应顶级域(例如
.com
)的 DNS 服务器列表。 - TLD 查询:接下来,本地域 DNS 服务器向根域名服务器返回的 TLD 服务器发起查询,获取负责该域的权威 DNS 服务器地址。
- 权威查询:最后,递归 DNS 服务器向权威 DNS 服务器发送查询请求,从中获得该域名的具体 IP 地址(例如
A
记录)。
- 根查询:本地域 DNS 服务器首先向一个根域名服务器发起查询,请求获取对应顶级域(例如
- 返回结果与缓存:当本地域 DNS 服务器获得权威答案后,它会将该结果返回给客户端,同时缓存该记录以供后续查询使用,从而减少查询延时和网络流量。
这一系列过程结合了迭代查询(各级服务器间互相“引荐”)和递归查询(本地域 DNS 服务器代替客户端完成所有查询)的特点。
名字服务器通过维护区域文件(Zone File)来存储和管理资源记录(Resource Records,RR),这些记录构成了 DNS 数据库的基本单位。
每一条 RR 都有标准格式,这一格式在 RFC 1035 中有详细说明。一般来说,RR 在区域文件中的文本格式通常如下:
<Name> [<TTL>] [<Class>] <Type> <RDATA>
具体字段说明如下:
- 名称(Name):表示记录所对应的域名(可以是完整域名或相对于当前区域的短名称)。
- TTL(Time To Live):表示该记录在 DNS 缓存中可存活的时间(以秒为单位),缓存时间结束后必须重新查询,权威 DNS 服务器中记录的 TTL 可以是长期的。
- 类(Class):通常是
IN
,表示 Internet 类别,其他类例如CH
(混沌)等较少使用。 - 类型(Type):指定记录的种类,如
A
、AAAA
、NS
、MX
、CNAME
、TXT
等,每种类型决定了数据字段的格式和用途。 - 数据(RDATA):存放具体的记录内容。例如,对于
A
记录,RDATA
是 IPv4 地址;对于MX
记录,RDATA
包含优先级和邮件服务器域名。
常见的记录类型包括:
A
记录:将域名映射到 IPv4 地址。AAAA
记录:将域名映射到 IPv6 地址。NS
记录:指定该域名的权威 DNS 服务器。MX
记录:指定接收邮件的邮件服务器。CNAME
记录:为某个域名创建别名,指向另一个规范的域名。TXT
记录:存储文本信息,如验证信息或 SPF 记录。
4. 报文格式
DNS 协议的查询和响应报文的报文格式相同,一个完整的 DNS 报文通常包括五个部分:
- 报文头(Header):报文头固定为 12 个字节,包括这几个固定为 16 位的字段:ID:用于标识 DNS 查询与响应之间的对应关系,查询时由客户端随机生成,响应中保持相同的 ID,能够实现同时维护多个查询;标志字段(Flags):包含多个控制位,例如表示本报文是查询还是响应;QDCOUNT(问题记录数):表示后续问题部分中包含的查询个数;ANCOUNT(回答记录数):表示回答部分中资源记录的个数;NSCOUNT(授权记录数):表示授权部分中资源记录的个数;ARCOUNT(附加记录数):表示附加部分中资源记录的个数。
- 问题部分(Question Section):这一部分携带客户端所查询的问题记录,每个问题记录包含查询的域名、查询的记录类型(如
A
类型)、查询的类(通常为IN
)。 - 回答部分(Answer Section):回答部分返回的是与查询匹配的资源记录。
- 授权部分(Authority Section):关于查询域的权威 DNS 服务器的记录,通常为
NS
记录。它告诉客户端哪些 DNS 服务器有权提供该域名的最终答案。 - 附加部分(Additional Section):常见的是为授权部分中列出的名字服务器提供 IP 地址(即
A
记录或AAAA
记录),这有助于客户端直接查询相关服务器而无需额外解析。
5. DNS 维护
如果我们要新增一个域名,那么需要在上级域的名字服务器中增加两条记录,指向这个新增的子域的域名和域名服务器的地址。
例如我们注册了域名 networkutopia.com
,首先需要在 networkutopia.com
的权威服务器中确保有:
- 用于 Web 服务器的
www.networkutopia.com
的类型为A
的记录; - 用于邮件服务器的
mail.networkutopia.com
的类型为MX
的记录。
然后到注册登记机构注册域名,需要向该机构提供权威 DNS 服务器(基本的、和辅助的)的名字和 IP 地址,接着登记机构会在 .com
的 TLD 服务器中插入两条 RR 记录,例如:
(networkutopia.com, dns1.networkutopia.com, NS)
(dns1.networkutopia.com, 212.212.212.1, A)
6. DNS 的攻击与防御
DNS 作为互联网的核心基础服务,其设计初衷在于高效地将域名转换为 IP 地址,但正因其开放和分布式的特性,DNS 也成为各种攻击的目标。常见的 DNS 攻击手段如下:
- DDoS(分布式拒绝服务)攻击:通过向 DNS 服务器(通常攻击根服务器)发送大量查询请求(可能包含合法查询或伪造请求)进行流量攻击,使 DNS 服务器过载、响应变慢或无法响应,进而影响整个域名解析服务的正常运行。常与 DNS 放大攻击结合,利用多个受控主机同时发动攻击。
- DNS 放大攻击(Amplification Attack):攻击者向开放的 DNS 服务器发送伪造源地址的请求(通常使用递归查询),DNS 服务器将大数据量的应答发送到受害者 IP 地址,形成流量放大效应。这种攻击方式能够消耗受害者网络带宽,引发大规模 DDoS 攻击。
- DNS 劫持(DNS Hijacking):攻击者通过篡改 DNS 服务器的配置、DNS 软件漏洞或在网络中实施中间人攻击,改变 DNS 查询结果,将合法域名解析到恶意 IP 地址,常用于广告注入、钓鱼或流量劫持。可能针对本地 DNS 服务器、路由器或 ISP 的 DNS 系统实施。
- DNS 缓存投毒(Cache Poisoning / Spoofing):攻击者通过向 DNS 解析器注入伪造的 DNS 应答,将错误的域名到 IP 的映射存入缓存。当用户查询该域名时,就会被解析到攻击者控制的恶意服务器,从而实现钓鱼、传播恶意软件或中间人攻击。
常见的 DNS 攻击防御手段如下:
- 启用 DNSSEC(DNS 安全扩展):DNSSEC 使用数字签名为 DNS 记录提供完整性和真实性验证,有效防止缓存投毒和篡改攻击。需要域名管理员在权威 DNS 服务器上配置 DNSSEC,并在 DNS 解析器端验证数字签名。
- 随机化技术:确保 DNS 查询的 16 位 ID 是随机生成的,降低攻击者猜测成功的可能性;随机分配 UDP 查询的源端口,进一步提高伪造应答的难度。
- 部署 Anycast 和冗余 DNS 架构:将 DNS 服务器通过 Anycast 技术在全球多个位置部署多个实例,分散流量并提高抗 DDoS 能力。配置主从 DNS 服务器,实现自动区域传输和冗余,确保一台服务器宕机时服务不中断。
- 流量监控与速率限制:在 DNS 服务器上设置查询速率限制,防止攻击者利用大量伪造请求发动 DDoS 攻击,并实时监控 DNS 查询流量,及时发现异常模式和可疑行为,迅速采取措施阻断恶意流量。