:::info DNS 域名解析系统(Domain Name System) 是进行域名(domain name)和与之相对应的 IP 地址(IP address)转换的服务器。DNS 中保存了一张域名(domain name)和与之相对应的 IP 地址(IP address)的表,以解析消息的域名。
使用 IP 地址而非使用域名进行通信的原因:- IP 地址是固定长度,IPv4 是 32 位,IPv6 是 128 位,而域名是变长的,不便于计算机处理
- IP 地址对于用户来说不方便记忆,但域名便于用户使用
:::
域名的分层结构
由于因特网的用户数量较多,所以因特网在命名时采用的是层次树状结构的命名方法。任何一个连接在因特网上的主机或路由器,都有一个唯一的层次结构的名字,即域名(domain name)。这里,域(domain)是名字空间中一个可被管理的划分。从语法上讲,每一个域名都是有标号(label)序列组成,而各标号之间用点(.)隔开。域名可以划分为各个子域,子域还可以继续划分为子域的子域,这样就形成了顶级域、主域名、子域名等。域名系统必须要保持唯一性。
特点:- 每个域名都是一个标号序列,用字母(大小写等价)、数字(0-9)和连接符(-)组成
- 标号序列总长度不能超过 255 个字符,它由各标点之间用 . 分割成一个个的标号
- 每个标号应该在 63 个字符之内,每个标号都可以堪称一个层次的域名
- 级别最低的域名写在左边,级别最高的域名写在右边
- .com:是顶级域名
- google.com:是主域名(也可称托管一级域名),主要指企业名
- example.google.com:是子域名(也可称为托管二级域名)
- www.example.google.com:是子域名的子域(也可称为托管三级域名)
顶级域名 | 标识 |
---|---|
国家顶级域名 | 中国 cn;美国 us;英国 uk |
通用顶级域名 | 公司企业 com;教育机构 edu;政府部门 gov;国际组织 int;军事部门 mil;网络 net;非盈利组织 org |
反向域名 | Arpa 用于 PTR 查询(IP 地址转换为域名) |
查询类型
递归查询
递归查询(Recursive)是一种 DNS 服务器的查询模式,在该模式下 DNS 服务器接收到客户机请求,必须使用一个准确的查询结果回复客户机。如果 DNS 服务器本地没有存储查询 DNS 信息,那么该服务器会询问其他服务器,并将返回的查询结果提交给客户机。所以,一般情况下服务器跟内网 DNS 或直接 DNS 之间都采用递归查询。迭代查询
DNS 服务器另外一种查询方式为迭代查询,DNS 服务器会向客户机提供其他能够解析查询请求的 DNS 服务器地址,当客户机发送查询请求时,DNS 服务器并不直接回复查询结果,而是告诉客户机另一台 DNS 服务器地址,客户机再向这台 DNS 服务器提交请求,依次循环直到返回查询的结果。所以一般内网 DNS 和外网 DNS 之间的都采用迭代查询。分层结构
域名是分层结构,域名 DNS 服务器也是对应的层级结构。有了域名结构,还需要有域名 DNS 服务器去解析域名,且是需要由遍及全世界的域名 DNS 服务器去解析,域名 DNS 服务器实际上就是装有域名系统的主机。域名解析过程涉及 4 个 DNS 服务器,分别如下:分类 | 作用 |
---|---|
根 DNS 服务器 | Root NameServer,本地域名服务器在本地查询不到解析结果时,则第一步会向它进行查询,并获取顶级域名服务器的 IP 地址。 |
顶级域名服务器 | TLD(Top-level) NameServer。负责管理在该顶级域名服务器下注册的二级域名,例如 www.example.com、.com 则是顶级域名服务器,在向它查询时,可以返回二级域名 example.com 所在的权威域名服务器地址 |
权威域名服务器 | Authoritative NameServer。在特定区域内具有唯一性,负责维护该区域内的域名与 IP 地址之间的对应关系,例如云解析 DNS。 |
本地域名服务器 | DNS Resolver 或 Local DNS。本地域名服务器是响应来自客户端的递归请求,并最终跟踪直到获取到解析结果的 DNS 服务器。例如用户本机自动分配的 DNS、运营商 ISP 分配的 DNS、谷歌/114 公共 DNS 等 |
每个层的域名上都有自己的域名服务器,最顶层的是根域名服务器 每一级域名服务器都知道下级域名服务器的 IP 地址,以便于一级一级向下查询
记录类型
类型 | 说明 |
---|---|
A | 将域名指向一个 IPv4 地址,A 记录用于描述目标域名到 IP 地址的映射关系,将目标域名与 A 记录的 Name 字段进行匹配,将成功匹配的记录的 Value 字段的内容(IP 地址)输出到 DNS 回应报文中。 |
CNAME | 将域名指向另一个域名,CNAME 记录用于描述目的域名和别名的对应关系,如果说 A 记录可以将目标域名转换为对应主机的 IP 地址,那么 CNAME 记录则可以将一个域名(别名)转换为另一个域名,如果多条 CNAME 记录指向同一个域名,则可以将多个不同的域名的请求指向同一台服务器主机。并且,CNAME 记录通常还对应了一条 A 记录,用于提供被转换的域名的 IP 地址 |
NS | 将子域名指向另一个 DNS 服务器解析,NS 记录用于描述目标域名到负责解析该域名的 DNS 的映射关系,根据目标域名对 NS 记录的 Name 字段进行匹配,将成功匹配的记录的 Value 字段(负责解析目标域名的 DNS 的 IP 地址)输出到 DNS 回应报文中 |
AAAA | 将域名指向一个 IPv6 地址 |
MX | 将域名指向邮件服务器地址 |
SRV | 记录提供特定的服务的服务器 |
TXT | 文本长度限制 512,通常做 SDF 记录(反垃圾邮件) |
CAA | CA 证书颁发机构授权校验 |
显性 URL | 将域名重定向至另一个地址 |
隐形 URL | 与显性 URL 类似,但是会隐藏真实的目标地址 |
解析过程
DNS 是一种使用 UDP 协议进行域名查询的协议,其最主要的目标就是将域名转换为 IP 地址。 DNS 查询的结果通常会在本地域名服务器中进行缓存,如果本地域名服务器中有缓存的情况下,则会跳过如下 DNS 查询步骤,很快返回解析结果。下面的示例则概述了本地域名服务器没有缓存的情况下,DNS 查询所需的 8 个步骤: 浏览器首先看一下自己的缓存里有没有,如果没有就向操作系统的缓存要,还没有就检查本机域名解析文件 hosts,如果还是没有,就会 DNS 服务器进行查询,查询的过程如下:原文: 5.1 IP 基础知识全家桶
- 客户端首先会发出一个 DNS 请求,问 www.server.com 的 IP 是啥,并发给本地 DNS 服务器(也就是客户端的 TCP/IP 设置中填写的 DNS 服务器地址)。
- 本地域名服务器收到客户端的请求后,如果缓存里的表格能找到 www.server.com,则它直接返回 IP 地址。如果没有,本地 DNS 会去问它的根域名服务器:“老大, 能告诉我 www.server.com 的 IP 地址吗?” 根域名服务器是最高层次的,它不直接用于域名解析,但能指明一条道路。
- 根 DNS 收到来自本地 DNS 的请求后,发现后置是 .com,说:“www.server.com 这个域名归 .com 区域管理”,我给你 .com 顶级域名服务器地址给你,你去问问它吧。”
- 本地 DNS 收到顶级域名服务器的地址后,发起请求问“老二, 你能告诉我 www.server.com 的 IP 地址吗?”
- 顶级域名服务器说:“我给你负责 www.server.com 区域的权威 DNS 服务器的地址,你去问它应该能问到”。
- 本地 DNS 于是转向问权威 DNS 服务器:“老三,www.server.com对应的IP是啥呀?” server.com 的权威 DNS 服务器,它是域名解析结果的原出处。为啥叫权威呢?就是我的域名我做主。
- 权威 DNS 服务器查询后将对应的 IP 地址 X.X.X.X 告诉本地 DNS。
- 本地 DNS 再将 IP 地址返回客户端,客户端和目标建立连接。
排查与优化
常见问题
- DNS 服务器本身有问题,响应慢并且不稳定
- 或者是,客户端到 DNS 服务器的网络延迟比较大
- 再或者,DNS 请求或者响应包,在某些情况下被链路中的网络设备弄丢了
故障排查顺序
- 检查本地 hosts:cat /etc/hosts
- 检查 resolv.conf 文件:cat /etc/resolv.conf。在 Redhat7 / Centos7 上修改 resolv.conf 里的 DNS 地址后,重启启网络服务发现 DNS 地址消失了,那么检查下网卡配置文件。
- 检查网卡配置文件:cat /etc/sysconfig/network-scripts/ifcfg-<网卡名称>,看下里头有没 DNS 配置信息,没有的话补上去。
DNS 术语
DNS 缓存
DNS 缓存是将解析数据存储在靠近发起请求的客户端的位置,也可以说 DNS 数据是可以缓存在任意位置,最终目的是以此减少递归查询过程,可以更快的让用户获得请求结果。TTL
英文全称 Time To Live ,这个值是告诉本地域名服务器,域名解析结果可缓存的最长时间,缓存时间到期后本地域名服务器则会删除该解析记录的数据,删除之后,如有用户请求域名,则会重新进行递归查询/迭代查询的过程。DNS Query Flood Attack
指域名查询攻击,攻击方法是通过操纵大量傀儡机器,发送海量的域名查询请求,当每秒域名查询请求次数超过 DNS 服务器可承载的能力时,则会造成解析域名超时从而直接影响业务的可用性。URL 转发
英文 Url Forwarding,也可称地址转向,它是通过服务器的特殊设置,将一个域名指向到另外一个已存在的站点DNSSEC
域名系统安全扩展(DNS Security Extensions),简称 DNSSEC。它是通过数字签名来保证 DNS 应答报文的真实性和完整性,可有效防止 DNS 欺骗和缓存污染等攻击,能够保护用户不被重定向到非预期地址,从而提高用户对互联网的信任。常用 DNS
- 114 DNS:114.114.114.114 或 114.114.115.115
- 阿里 DNS:223.5.5.5 或 223.6.6.6
- 百度 DNS:180.76.76.76
- DNS 派:
- 电信 101.226.4.6
- 联通 123.125.81.6
- 移动 101.226.4.6
- 铁通 101.226.4.6
- OneDNS
- 南方 112.124.47.27
- 北方 114.215.126.16
- 共用 42.236.82.22
- Google DNS:8.8.8.8 或 8.8.4.4
- OpenDNS:208.67.222.222 或 208.67.220.220
- 360 DNS:101.226.4.6 或 123.125.81.6
+ 查询长度。
+ DNS地址中的异常和非常规名称。
+ 带有编码子域地址的长DNS地址。
+ 已知模式,如 dnscat 和 dns2tcp。
+ 统计分析,例如针对特定目标的异常DNS请求量。
!mdns:禁用本地链接设备查询。 | + dns contains “dnscat”
+ dns.qry.name.len > 15 and !mdns | + DNS 请求

