域名

域名可以划分为各个子域,子域还可以继续划分为子域的子域,这样就形成了顶级域、二级域、三级域等。一般的域名格式为:主机名.次级域名.顶级域名.根域名

层级 说明
根域名 .root 或者 .
顶级域名 分为国家顶级域名(cn、us等)、通用顶级域名(com、edu、gov、net、org等)、反向域名(arpa,用于 PRT IP 转域名查询)
次级域名 如 baidu.com 里的 baidu,这个是用户可以进行注册购买的
主机域名 比如 baike.baidu.com 里的 baike,这个是用户可分配的

根域名通常是省略的。如 “www.qq.com” 的完整的形式是 “www.qq.com.”,将带有根域名的域名称为:绝对域名(Fully Qualified Domain Name,FQDN)。

域名空间结构

  1. 域名体系,使用逆向树所示,树中的每一个分支,都称为域,一个域名可以属于多个域,如域名 www.qq.com 属于 qq.com 域的一部分,同时也是 com 域的一部分。
  2. “.” 是最树状结构中最顶层的域名,统称为“根”,即每个域名都是由根开始索引的,所有域名都属于根。
  3. 由根分支出的域名叫顶域域名(TLD),一般分为国家地区顶级域名和通用顶级域名。
  4. 顶级域名下面的分支是二级域名,如 baidu.com、qq.com 等。
  5. 二级域名下面的分支为三级域名,或称为服务器名称,如 www.qq.com 下面的 www 代表了腾讯的网站服务名称。
  6. 三级域名下还可以分出更多层级域名,最多支持 127 层,每一层域名最多包含 63 个字符,每层之间以 “.” 进行分隔。域名的总长度不可超过 255 个字符,仅可使用字符、数字和连字符,不区分大小写。

域名服务器

域名是分层结构,域名服务器也是对应的层级结构:

  • 每个层的域名上都有自己的域名服务器,最顶层的是根域名服务器。
  • 每一级域名服务器都知道下级域名服务器的IP地址。
  • 为了容灾, 每一级至少设置两个或以上的域名服务器(主域名服务器、辅助域名服务器)。
分类 作用
根域名服务器 最高层次的域名服务器,本地域名服务器解析不了的域名就会向其求助
顶级域名服务器 TLD,负责管理在该顶级域名服务器下注册的二级域名
权威域名服务器 负责一个区的域名解析工作
本地域名服务器 当一个主机发出DNS查询请求时,这个查询请求首先发给本地域名服务器

注:一个域名服务器所负责的范围,或者说有管理权限的范围,就称为区域(Zone)

DNS域名服务器类型

本地域名服务器

互联网接入服务运营商或者大的网络机构,像公司、大学等都有一台或多台可以自行管理的域名服务器,这类域名服务器称为本地域名服务器,也称为默认域名服务器。DNS 请求时,会先向本地域名服务器查询。

根域名服务器

根域名服务器用来管理顶级域,本身并不对域名进行解析。IPv4 根域名服务器全球有 13 台,主机名分别为 A ~ M 。1 台为主根服务器在美国,其余 12 个均为辅根服务器,其中 9 个在美国,2 个在欧洲,位于英国和瑞典,1 台在亚洲,位于日本。所有的域名服务器都必须注册根域名服务器的 IP 地址,因为 DNS 根据 IP 地址进行检索时,需要按顺序从根域名服务器开始。

授权域名服务器

互联网上的主机在域名服务器上进行注册,这个域名服务器就是主机的授权域名服务器。通常,主机的授权域名服务器就是本地域名服务器。实际上,主机会有两个授权域名服务器,防止单点故障。

域名解析

将域名转换为对应的 IP 地址的过程叫做域名解析。在域名解析过程中,DNS client 的主机调用解析器( Resolver ),向 DNS server 发出请求,DNS server 完成域名解析。

域名解析步骤

DNS(Domain Name System)解析过程一般分为两步:

  1. 静态域名解析:通过静态域名解析表(本机的 hosts 文件)查找 IP;
  2. 动态域名解析:向本地域名解析服务系统发起域名解析的请求,查找 IP。

host 文件位置:

  • Windows,hosts 文件位置在 C:\Windows\System32\drivers\etc\hosts
  • Linux,hosts 文件在 /etc/hosts 文件中。

本地 DNS 服务器地址查看方式:

  • Windows,使用命令 “ipconfig” 查看;
  • Linux/Mac,使用命令 “cat /etc/resolv.conf” 查看。

DNS 查询

DNS 域名解析包括两种查询( query )方式,一种是递归查询,另一种是迭代查询。

递归查询

DNS 服务器如果不能直接响应解析请求,它将继续请求其它的 DNS 服务器,直到查询域名解析的结果。查询的结果可以是域名主机的 IP 地址,或者是域名无法解析。无论哪种结果,DNS 服务器都会将结果返回给客户端。

DNS 查询-递归

迭代查询

如果 DNS 服务器查不到相应记录,会向客户端返回一个可能知道结果的域名服务器 IP 地址,由客户端继续向新的服务器发送查询请求。对域名服务器的迭代查询,只得到一个提示,则继续查询。

DNS 查询-迭代

混合查询

客户端在查询 IP 地址时,向本地域名服务器进行递归查询。如果本地域名服务器的数据库有相应数据,则直接返回相应数据。如果没有,则本地域名服务器向根域名服务器进行迭代查询。从根开始对这棵树按照顺序进行遍历,直到找到指定的域名服务器,并由这个域名服务器返回相应的数据。客户端和本地域名服务器会将收到的信息保存在缓存里,这样可以减少每次查询时的性能消耗。

DNS 查询-混合

DNS 反向查询

DNS 反向查询是指客户端通过 IP 地址查找对应的域名。

为实现反向查询,在 DNS 标准中定义了特色域 in-addr.arpa 域,并保留在域名空间中,以便执行反向查询。为创建反向域名空间,in-addr.arpa 域中的子域是按照 IP 地址相反的顺序构造的。

DNS 反向查询示例

DNS 代理

DNS 代理在客户端与 DNS Server 之间增加一个中间的代理服务,当 DNS server 的地址发生变化时,只需改变 DNS proxy 上的配置,无需逐一改变局域网内每个 DNS client 的配置,从而简化了网络管理。

DNS 代理架构

域名解析资源记录

在 DNS 服务器上,一个域名及其下级域名组成一个区域(Zone)。每个区域(Zone)的 DNS 信息都是由资源记录(Resource Record)构成的,一条资源记录就是一行文本,提供了一组域名信息映射关系信息。一个 Zone 相关的 DNS 信息构成一个数据库文件。

资源记录(RR)主要包含以下信息:

  • owner,域名。
  • TTL,生存周期,是递归服务器会在缓存中保存该资源记录的时长。
  • CLASS,网络/协议类型,目前DNS系统主要支持的协议是 IN(Internet类)。其他还有 CS(CSNET类)、CH(CHAOS类)、HS(Hesiod)。
  • TYPE,就是资源记录类型。
  • RDATA,资源记录数据,就是域名关联的信息数据。

常见的资源记录类型如表所示:

|类型 |值 |内容 |
|—- |—- |—–|
|A |1 |将 DNS 域名映射到 IPv4 地址|
|NS |2 |权威名称服务器记录,用于说明这个区域有哪些 DNS 服务器负责解析|
|CNAME |5 |别名记录,主机别名对应的规范名称|
|SOA |6 |起始授权机构记录,说明在众多 NS 记录里哪一台才是主要的服务器|
|PTR |12 |IP 地址反向解析,是 A 记录的逆向记录,作用是把 IP 地址解析为域名|
|MX |15 |邮件交换记录,指定负责接收和发送到域中的电子邮件的主机|
|TXT |16 |文本资源记录,用来为某个主机名或域名设置的说明|
|AAAA |28 |将 DNS 域名映射到 IPv6 地址|

A记录

1
2
3
4
5
6
7
8
# 描述:
主机地址(A) 资源记录。将 DNS 域名映射到Internet 协议(IP) 版本4 的32 位地址中(RFC 1035)。

# 语法:
owner TTL CLASS A IPv4_address

# 示例:
www.baidu.com. IN A 192.168.1.1

AAAA记录

1
2
3
4
5
6
7
8
# 描述:
IPv6 主机地址(AAAA) 资源记录。将DNS 域名映射到 Internet 协议(IP) 版本6 的128 位地址中(RFC 1886)。

# 语法:
owner TTL CLASS AAAA IPv6_address

# 示例:
www.baidu.com. IN AAAA 1::1

NS记录

服务器解析记录, 用来表明由哪台服务器对该域名进行解析。这里的 NS 记录只对子域名生效。单独命名的每个子域必须至少有一条相应的名称服务(NS)记录。域名服务器使用NS记录来查找彼此。

1
2
3
4
5
6
7
8
# 描述:
将 owner 中指定的域名映射到在 name_server 字段中指定的 DNS 服务器。

# 语法:
owner TTL CLASS NS name_server

# 示例:
www.baidu.com. IN NS baidu.com.
  • NS记录优先于A记录。
  • A记录和NS记录的区别是,A记录直接给出目的IP,NS记录将DNS解析任务交给特定的服务器。

CNAME记录

1
2
3
4
5
6
7
8
# 描述:
将owner 字段中的别名或备用的DNS 域名映射到canonical_name字段中指定的标准或主要DNS 域名。此数据中所使用的标准或主要DNS 域名是必需的,并且必须解析为名称空间中有效的DNS 域名。

# 语法:
owner TTL CLASS CNAME canonical_name

# 示例:
www.baidu.com. IN CNAME www.bd.com.
  • CNAME的目标主机地址只能使用主机名,不能使用IP地址;
  • 主机名前不能有任何其他前缀,如:“http://” 等是不被允许的;
  • A记录优先于CNAME记录。即如果一个主机地址同时存在A记录和CNAME记录,则CNAME记录不生效。

域名解析协议

DNS 域名服务器使用的端口号是 53 ,并且同时支持 UDP 和 TCP 协议。

DNS报文结构

DNS 报文标志字段
标志字段中每个字段的含义如下:

  • QR(Response):查询请求/响应的标志信息。查询请求时,值为 0;响应时,值为 1。
  • Opcode:操作码。其中,0 表示标准查询;1 表示反向查询;2 表示服务器状态请求。
  • AA(Authoritative):授权应答,该字段在响应报文中有效。值为 1 时,表示名称服务器是权威服务器;值为 0 时,表示不是权威服务器。
  • TC(Truncated):表示是否被截断。值为 1 时,表示响应已超过 512 字节并已被截断,只返回前 512 个字节。
  • RD(Recursion Desired):期望递归。该字段能在一个查询中设置,并在响应中返回。该标志告诉名称服务器必须处理这个查询,这种方式被称为一个递归查询。如果该位为 0,且被请求的名称服务器没有一个授权回答,它将返回一个能解答该查询的其他名称服务器列表。这种方式被称为迭代查询。
  • RA(Recursion Available):可用递归。该字段只出现在响应报文中。当值为 1 时,表示服务器支持递归查询。
  • Z:保留字段,在所有的请求和应答报文中,它的值必须为 0。
  • rcode(Reply code):返回码字段,表示响应的差错状态。当值为 0 时,表示没有错误;当值为 1 时,表示报文格式错误(Format error),服务器不能理解请求的报文;当值为 2 时,表示域名服务器失败(Server failure),因为服务器的原因导致没办法处理这个请求;当值为 3 时,表示名字错误(Name Error),只有对授权域名解析服务器有意义,指出解析的域名不存在;当值为 4 时,表示查询类型不支持(Not Implemented),即域名服务器不支持查询类型;当值为 5 时,表示拒绝(Refused),一般是服务器由于设置的策略拒绝给出应答,如服务器不希望对某些请求者给出应答。

当响应报文使用 UDP 封装,且报文长度大于 512 字节时,那么服务器只返回前 512 字节,同时 TC 标志位置位,表示报文进行了删减。当客户端收到 TC 置位的响应报文后,将采用 TCP 封装查询请求。DNS 服务器返回的响应报文长度大于 512 字节。

UDP 用于 client 和 server 的查询和响应,TCP 用于主从 server 之间的传送。

域名解析命令

nslookup

1
2
3
4
5
6
7
8
# 直接查询
nslookup domain [dns-server]

# 查询其他记录
nslookup -q={type} domain [dns-server]
nslookup type={type} domain [dns-server]

# 注:若不指定dns服务器,就采用系统默认的dns服务器

dig

1
2
3
4
5
# 直接查询
dig domain

# 查询其他记录
dig {type} domain

域名解析安全风险

域名解析存在问题

  1. 域名缓存问题:缓存失效
  2. 域名转发问题:A运营商偷懒转给B运营商
  3. 出口NAT问题:NAT转换后DNS误判运营商
  4. 域名更新问题:DNS的域名TTL有效期跟不上场景切换
  5. 解析延迟问题:递归查询时间长

域名解析劫持

DNS 劫持即通过某种技术手段,篡改正确域名和IP地址的映射关系,使得域名映射到了错误的IP地址,因此可以认为DNS劫持是一种DNS重定向攻击。

DNS劫持分类

  1. 本机 DNS 劫持,通过某些手段修改本地 DNS 配置(hosts文件)、篡改路由器 DNS 配置。
  2. DNS 解析路径劫持。
    2.1 DNS请求转发,通过技术手段将DNS流量重定向到其他DNS服务器。
    2.2 DNS请求复制,将DNS查询复制到网络设备,并先于正常应答返回DNS劫持的结果。
    2.3 DNS请求代答,网络设备或者软件直接代替DNS服务器对DNS查询进行应答。
  3. 篡改DNS权威记录。攻击 DNS 服务器,如对 DNS 服务器进行 DDOS 攻击、感染 DNS 服务器的缓存等。

常用工具

其他

根域名服务器

UDP 报文的最大长度是 512 字节,最多可以包含 13 台根域名服务器数据(每一个根域名服务器占用32字节,其中包括根域名的名称、IP地址、TTL等参数),因此 ipv4 根域名服务器只能限制在 13 个,且每个服务器使用单个字母命名,也是 IPv4 根服务器是从 A ~ M 命名的原因。

13 个根域名服务器对应 13 个全球IP地址,但对应上千台物理服务器(使用 BGP 泛播技术 Anycast)。全球根域名服务器查询地址:https://root-servers.org/。

负载均衡

当相同域名有多个目标地址(A、AAAA、CNAME、MX)时,表示轮循,可以达到负载均衡(Server Load Balancing,SLB)的目的,但需要虚拟主机服务商支持。

DNS域名解析负载均衡优点:

  1. 将负载均衡的工作交给DNS,省去了网站管理维护负载均衡服务器的麻烦。
  2. 技术实现比较灵活、方便,简单易行,成本低,使用于大多数TCP/IP应用。
  3. 对于部署在服务器上的应用来说不需要进行任何的代码修改即可实现不同机器上的应用访问。服务器可以位于互联网的任意位置。
  4. 同时许多DNS还支持基于地理位置的域名解析,即会将域名解析成距离用户地理最近的一个服务器地址,这样就可以加速用户访问,改善性能。

DNS域名解析负载均衡缺点:

  1. 目前的DNS是多级解析的,每一级DNS都可能缓存A记录,当某台服务器下线之后,即使修改了A记录,要使其生效也需要较长的时间,这段时间,DNS任然会将域名解析到已下线的服务器上,最终导致用户访问失败。
  2. 不能够按服务器的处理能力来分配负载。DNS负载均衡采用的是简单的轮询算法,不能区分服务器之间的差异,不能反映服务器当前运行状态,所以其的负载均衡效果并不是太好。
  3. 可能会造成额外的网络问题。为了使本DNS服务器和其他DNS服务器及时交互,保证DNS数据及时更新,使地址能随机分配,一般都要将DNS的刷新时间设置的较小,但太小将会使DNS流量大增造成额外的网络问题。
  4. 域名转发问题。如果是A运营商将解析的请求转发给B运营商,B去权威DNS服务器查询的话,权威服务器会认为你是B运营商的,就返回了B运营商的网站地址,结果每次都会夸运营商。
  5. 出口NAT问题。做了网络地址转化后,权威的DNS服务器,没法通过地址来判断客户到底是哪个运营商,极有可能误判运营商,导致跨运营商访问。
  6. 域名更新问题。本地DNS服务器是由不同地区,不同运营商独立部署的,对域名解析缓存的处理上,有区别,有的会偷懒忽略解析结果TTL的时间限制,导致服务器没有更新新的ip而是指向旧的ip。
  7. 解析延迟。DNS的查询过程需要递归遍历多个DNS服务器,才能获得最终结果。可能会带来一定的延时。

参考资料

https://www.cnblogs.com/crazymakercircle/p/14976612.html
https://www.cnblogs.com/cobbliu/p/3687750.html
https://zh.wikipedia.org/wiki/DNS%E8%AE%B0%E5%BD%95%E7%B1%BB%E5%9E%8B%E5%88%97%E8%A1%A8
https://www.zhihu.com/question/23042131/answer/2051992590