漫谈0x02:研发视角下的DNS

一、DNS基础

1、Domain Name 和 DNS

  • 域名(Domain Name)是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时对计算机的定位标识(有时也指地理位置);eg: www.baidu.com

  • DNS(Domain Name System, 域名系统) 是Internet上作为将域名和IP地址相互映射的一个分布式数据库,能够根据域名找到对应的IP地址。

  • 根域、顶级域、二级域、子域 域名采用层次化的方式进行组织,每一个点代表一个层级。一个域名完整的格式为www.baidu.com. 最末尾的点(.)代表根域,常常省略;com即顶级域(TLD, Top-Level Domain);baidu.com即二级域。依次类推,还有三级域、四级域等等。子域是一个相对的概念,baidu.comcom的子域,www.baidu.combaidu.com的子域。

  • 根域名通常使用”.”来表示,其实际上也是由域名组成,全世界目前有13组域名根节点,由少数几个国家进行管理,而国内仅有几台根节点镜像。

2、DNS解析相关

  • 正向解析:查找域名对应IP的过程;反向解析: 查找IP对应域名的过程;解析器: 即resolver,处于DNS客户端的一套系统,用于实现正向解析或者反向解析。

  • 权威DNS:处于DNS服务端的一套系统,该系统保存了相应域名的权威信息。权威DNS即通俗上“这个域名我说了算”的服务器。

  • 递归DNS:又叫Local DNS,递归DNS可以理解为是一种功能复杂些的解析器(resolver),其核心是 缓存 和 递归查询。收到域名查询请求后,首先看本地缓存是否有记录,如果没有则一级一级的查询根、顶级域、二级域……直到获取到结果然后返回给用户。日常上网中运营商分配的DNS即是递归DNS
  • 转发DNS:是一种特殊的递归。如果本地的缓存记录中没有相应域名结果时,其将查询请求转发给另外一台DNS服务器,由另外一台DNS服务器来完成查询请求。
  • 公共DNS:属于递归DNS。其典型特征为对外一个IP,为所有用户提供公共的递归查询服务。
    • 国内主流的公共DNS的有114DNS(114.114.114.114)、阿里DNS(223.5.5.5)、百度DNS(180.76.76.76)、腾讯DNS(119.29.29.29)
    • 国外推荐的公共DNS是谷歌DNS(8.8.8.8)

3、DNS常用命令工具

  • host 命令 or nslookup命令:分析域名查询工具,测试域名系统工作是否正常
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 查询域名的主机信息
host -a www.baidu.com

# Trying "www.baidu.com"
# ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27785
# ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

# ;; QUESTION SECTION:
# ;www.baidu.com. IN ANY

# ;; ANSWER SECTION:
# www.baidu.com. 60 IN A 10.15.63.90

# 根据IP反查域名
host 114.114.114.114
# 114.114.114.114.in-addr.arpa domain name pointer public1.114dns.com.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 查询域名对应的IP
nslookup www.baidu.com
# Server: 10.8.8.18
# Address: 10.8.8.18#53

# Non-authoritative answer:
# Name: www.baidu.com
# Address: 10.15.63.90

# 根据IP反查域名
nslookup 114.114.114.114

# Server: 10.8.8.18
# Address: 10.8.8.18#53

# Non-authoritative answer:
# 114.114.114.114.in-addr.arpa name = public1.114dns.com.
# Authoritative answers can be found from:
  • whois命令:查看域名的注册情况。
1
whois www.baidu.com

二、DNS查询

1、DNS查询方式

  • DNS查询分两种:递归查询与迭代查询;
  • 递归查询:Local DNS Server接收到客户端请求后,如果它本地没有被查询的域名的IP地址,就会代替客户端,去向其他域名服务器继续发出查询,直到查询到结果后,然后层层返回给客户;
  • 迭代查询:Local DNS Server接收到客户端请求后,如果它本地没有被查询的域名的IP地址,并不直接回复查询结果,而是告诉客户机另一台DNS 服务器地址,客户机再向这台DNS 服务器提交请求,依次循环直到返回查询的结果。

2、Local DNS的设置

  • 主机(PC或移动设备)上可以通过手动配置 DNS的服务器地址 OR 利用DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)动态获得DNS的服务器地址。
  • Local DNS包括网络服务提供商(ISP)分配给我们的DNS(一般为两个),或者是其他组织提供的公共DNS,比如
  • 有时,PC或者移动设备上,DNS的地使用路由器的地址,这是因为路由器会将DNS请求转发到ISP的DNS服务器上。

3、典型DNS查询过程

当我们在浏览器中输入一个网站如:www.baidu.com时,会发生如下过程:

  • 操作系统会先依次检查缓存中、本地的hosts中是够有这个域名对应的IP地址;如果有,就先调用这个IP地址,完成域名解析,否则进入下一步;
  • 如果缓存中、本地的hosts里都没有这个域名的映射,客户端会向Local DNS Server发起查询。Local DNS Server收到查询请求时,如果本地缓存中有记录,则返回IP地址给客户机,完成域名解析,否则进入下一步;
  • 如果Local DNS Server本地缓存没有记录,则一级一级的查询根、顶级域、二级域……直到获取到IP地址,然后返回给用户。
  • 最终,客户端可以通过 IP 访问到对应的服务器

4、扩展

  • DNS的查询和响应使用的是UDP协议,DNS消息通过UDP数据包发送,如果在一个限定时间内没有收到响应的UDP数据包,那么DNS客户端则会重复查询请求;如果重复一定次数仍然失败,则会尝试域内另一台DNS服务器。

  • TTL(Time To-Live)是一条域名解析记录在DNS服务器中的存留时间;可以通过设置TTL时间来控制DNS缓存的时间;但是客户端也可以域名解析记录,甚至有的客户端忽略DNS Server的TTL时间,而采用自己的固定DNS过期时间。

  • 对于大型网站而言,通过Local DNS返回的IP地址,并不是真正应用服务器的地址,而是网站的反向代理(nginx)服务器地址;反向代理(nginx)服务器会根据 负载均衡策略,将请求分配给对应的应用服务器处理;应用服务器处理后,才会返回给原来的客户端。

三、DNS轮询及应用

1、基本概念

  • DNS轮询:通过对一个域名设置多个IP解析,来扩充Server性能及实施负载均衡的技术;目前,大部分域名注册商都支持多条A(Address)记录的解析,DNS服务器将解析请求按照A记录的顺序,逐一分配到不同的IP上,这样就完成了简单的负载均衡。

  • A(Address)记录:又称IP指向,用户可以在此设置子域名并指向到自己的目标主机地址上,从而实现通过域名找到服务器。(说明:指向的目标主机地址类型只能使用IP地址)

  • 负载均衡(Load Balance)是分布式系统架构设计中必须考虑的因素之一,它通常是指,将请求/数据均匀分摊到多个操作单元上执行。

2、DNS轮询的优点

  • 基本上无成本,因为域名注册商的这种解析都是免费的;
  • 部署方便,除了网络拓扑的简单扩增,新增的Web服务器只要增加一个公网IP即可。

3、DNS轮询的缺点

  • 健康检查缺失:如果某台服务器宕机,DNS服务器是无法知晓的,仍旧会将访问分配到此服务器。修改DNS记录全部生效起码要3-4小时,甚至更久;
  • 请求/数据分配不均:如果几台Web服务器之间的配置不同,能够承受的压力也就不同,但是DNS解析分配的访问却是均匀分配的。其实DNS也是有分配算法的,可以根据当前连接较少的分配、可以设置Rate权重分配等等,只是目前绝大多数的DNS服务器都不支持;
  • 缺少会话保持:如果是需要身份验证的网站,在不修改软件构架的情况下,这点是比较致命的;因为DNS解析无法将验证用户的访问持久分配到同一服务器。虽然有一定的本地DNS缓存,但是很难保证在用户访问期间,本地DNS不过期,而重新查询服务器并指向新的服务器,那么原服务器保存的用户信息是无法被带到新服务器的,而且可能要求被重新认证身份,来回切换时间长了各台服务器都保存有用户不同的信息,对服务器资源也是一种浪费。

4、DNS轮询的应用

  • 常见互联网分布式架构,分为客户端层、反向代理nginx层、站点层、服务层、数据层。每一个下游都有多个上游调用,只需要做到,每一个上游都均匀访问每一个下游,就能实现“将请求/数据【均匀】分摊到多个操作单元上执行”。
  • 水平扩展反向代理层:DNS Server对于一个域名配置了多个解析IP,每次DNS解析请求来访问DNS-Server,会轮询返回这些IP,保证每个IP的解析概率是相同的; 而这些IP就是nginx的外网ip,以做到每台nginx的请求分配也是均衡的。

  • 当然,对于比较简单的系统,甚至可以不需要反向代理层,直接利用DNS轮询实施负载均衡,优缺点都非常明显,根据实际情况来吧。

    • 优点:少了一层网络请求,服务端架构简单
    • 缺点:
      • DNS只具备解析功能,不能保证对应外网IP的可用性,而nginx与应用Server之间有保活探测机制,当应用Server挂掉时,能够自动迁移流量;
      • 应用Server需要扩容时,通过DNS扩容生效时间长,而nginx是服务端完全自己可控的部分,应用Server扩容更实时更方便

5、总结

  • 在网络架构的发展过程中,会有利用DNS轮询来实现简单Web Server的负载均衡,但是Web Server的负载均衡主要是通过nginx、LVS和keepalived来实现的。
  • 使用DNS轮询实现 水平扩展 反向代理层,也是个不错的选择。
  • 在网站架构中,除了有DNS轮询技术,还有智能DNS技术(GSLB(Global Server load Blance、全局负载均衡)一种应用),可以实现根据用户IP来就近访问服务器。

四、HTTPDNS方案

1、简介

  • HTTPDNS:基于HTTP协议DNS服务器发送域名解析请求,替代了基于UDP的DNS协议向运营商Local DNS发起解析请求方式,有效避免Local DNS造成的域名劫持和跨网访问问题,提高域名解析效率。

  • DNS劫持是目前常见的攻击手段,通过攻击运营商的解析服务器,返回假IP地址或让请求失去响应,使得通过域名不能访问或访问的是假网址;

    1
    国内电信运营商 = 中国电信、中国移动、中国联通三大运营商 + 长城宽带等小的运营商
  • HTTPDNS的主要收益是 防止DNS的劫持,保障了服务高可用;精准调度,提升用户体验。

2、HTTPDNS设计中关键点

  • 安全策略:HTTPDNS查询是基于标准的HTTP协议,但是如果为了保证安全,可以使用HTTPS;
  • IP选取策略:HTTPDNS服务将最优IP按照顺序下发,客户端默认选取第一个,校验连通性OK就使用,如果不OK,选用下一个校验;
  • 缓存过期策略:后端动态下发域名的TTL时间,当域名的TTL超时后,如果没有新的IP将继续沿用老的IP,也可以降级成Local DNS返回的IP。

  • 批量拉取策略:在应用冷启动 或 网络切换时候,批量拉取域名和IP列表的映射数据,缓存下来;以便在后续请求中使用到,预期提升精准调度能力。

  • 降级策略:当HTTPDNS服务不可用 & 本地也没有缓存或者缓存失效时,降级成运营商的Local DNS方案;当HTTPDNS服务 & Local DNS服务双双不可用的情况下,可以使用BACKUP IP

3、总结

  • 复杂的网络环境中,在避免DNS劫持攻击,提升解析的准确性,降低网络时延等方面,HTTPDNS比传统的DNS方案优秀很多;移动互联网发展到今天,HTTPDNS方案已经是保障大前端服务高可用的必备手段;
  • 国内如阿里云、腾讯云、百度等厂商都提供此类服务,接入也比较简单(推荐使用阿里云HTTPDNS)。

参考资料

文章作者: 南华coder
文章链接: http://buaa0300/nanhuacoder.com/2020/01/04/Architect-002/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 南华coder的空间