运维老鸟阐述:沪江从DNS到httpdns的演进


内容来源:2017年7月22日,沪江运维工程师周峰在“饿了么技术沙龙【第九弹】上海研发中心·运维专场”进行《沪江DNS到httpdns的演变》演讲分享。IT 大咖说(微信id:itdakashuo)做为独家视频合做方,经主办方和讲者审阅受权发布。
java

阅读字数:2354 | 5分钟阅读python

嘉宾演讲视频及PPT回顾: suo.im/1Sn8cr

摘要

HttpDNS服务是一款能够有效解决域名劫持的方案,而且已在各家大厂普遍应用,现已成为一款至关成熟的产品,本次分享主要围绕沪江由DNS到HTTPDNS演进进行,但愿可以给你们带来一些启发。缓存

DNS的简介

DNS的全称是Domain Name System,它的目的就是将一个域名解析到一个IP。基础的DNS会用到TCP/UDP协议的53号端口,默认的是UDP协议,若是对服务质量要求比较高的话建议使用TCP。安全

Why We Need DNS?

在TCP的IP协议中约定,主机之间通讯必须经过IP。可是IP地址难以记忆,因此通常都是经过域名来访问网站。且因为程序在对域名进行调用的时候不能去写死IP,因此要使用FQDN的方式。服务器

名词解释

以mail.cctv.com为例,它的顶级域名是.com,二级域名是cctv,三级域名是mail同时也是cctv的子域。最后根域名就是“ . ”了,可是通常不会写出来。微信

权威DNS也就是一般来讲的“说了算”服务器,是用来告诉用户域名具体解析到哪一个IP地址;缓存DNS主要是把用户请求解析的域名结果缓存在本身这边,以减轻权威DNS的工做负载;递归DNS-LocalDNS通常在运营商侧使用的较多,用来接收用户的递归查询而后本身进行迭代查询;转发DNS相似于递归DNS,它会先查看本身DNS内有没有权威记录,若是查询到的话直接返回给用户,不然就递归出去抛给其余DNS;公共DNS也是httpdns的一个基础,一些常见的公共DNS:百度:180.76.76.76,阿里:223.5.5.5/233.6.6.6,腾讯:119.29.29.29。并发

递归查询示意图(给我答案):A->B,B->C,C->D,D->C->B->A;迭代查询示意图(给我答案,或者提示):A->B,A->C,A->D,D->A。框架

How DNS Works?

用户在访问http://mail.cctv.com/时,DNS的工做流程:运维

用户发起域名解析请求,该请求会直接抛给递归DNS,接着递归DNS向根域NS发起迭代查询,而后根域会返回com域的NS,递归DNS接收后又会向com域NS发起迭代查询,com域NS查询后返回了cctv.com的NS,最后递归DNS向cctv.com域NS发起迭代查询得到最后的结果,也就是mail.cctv.com。分布式

在用户端有缓存DNS的状况下,上面的过程会被省略直接返回结果。

Httpdns简介

HTTPDNS是经过DNS之上创建的一个服务,一样是将域名解析为IP。不一样的是HTTPDNS使用的是HTTP/HTTPS协议的80/443端口。

Why We Need HTTPDNS?

HTTPDNS能够填补运营商LocalDNS的坑,好比域名劫持、访问缓慢、解析转发等。

How HTTPDNS Works?

减小公司运营的复杂度,提升资源利用率。Kubernetes在IT领域内最为经常使用,人才储备愈来愈多。社区响应用户需求度快。

当HTTPDNS没法使用的时候,会切换到备用线路,采用正常的LocalDNS去获取。

HTTPDNS经过递归DNS获取到的是用户IP地址,而ISP运营商获取到的是LocalDNS地址,定位易出现误差。

How We Use HTTPDNS

对于HTTPDNS集群接口服务有条件的话建议使用BGP Anycast,它能够帮助用户获取到最近的HTTPDNS服务器。 也能够自定义公共接口IP地址。

采用主/备/备调用方式,当一个HTTPDNS没法使用了就调用下一个,当全部HTTPDNS都没法使用后切换到正常的LocalDNS方式。另外还有一种IP列表方式,在程序的SDK内对多个HTTPDNS进行ping的请求,延迟最低的节点优先请求。

查询方式有HTTP和HTTPS两种,HTTPS能够防止内容劫持。

使用IP地址对HTTPDNS发起请求的话,hostname是查询不到的。这就须要在Requst Header中添加host,指定须要的hostname。

沪江的DNS演进

原始社会:HOSTS

最先是使用HOSTS方式进行域名解析,HOSTS文件在Windows上被存储在C:\Windows\System32\dirvers\etc\hosts,而Linux上则是在/etc/hosts。HOSTS的优势在于简单、粗暴、隐蔽,缺点则更明显,存在文件大、传输慢、耗贷款、一致性等问题。

奴隶社会:Microsoft DNS

Microsoft DNS的优势是简单易用,但也有着黑盒、扩展性、并发数、安全性、集中配管能力较差、主从同步不稳定等问题。

封建社会:BIND

在抛弃了Microsoft DNS后,咱们使用了BIND这款开源DNS软件,它算是迄今为止普及最广的DNS实现。沪江使用BIND分为两个阶段:阶段一为部署BIND服务,阶段二为BIND分布式集群优化改造。

在部署阶段咱们有三条线路,用户发起DNS请求时会对这三个DNS发起DNS轮询的请求。这样基本知足了用户须要,可是也存在不少问题。首先就是权威DNS开启了递归和转发,这会使得DNS服务器的压力增大。而后修改记录全靠手工、没有区域解析功能且权威DNS均是单点。最后内外网未分离,权威DNS充当缓存DNS。

在集群式优化改造阶段咱们在每一个机房配备了两台权威DNS作HA高可用,而后缓存DNS另外进行部署,各个内网的服务器对缓存DNS进行查询,减轻权威DNS负载压力,还进行了权威DNS的读写分离。

各个DNS节点的优点

权威DNS起到了开启日志轮转、智能解析做用。

权威DNS master端优化点:权威DNS关闭了递归及转发,使用key+nsupdate的方式作记录的变动,动态更新解析记录。

权威DNS slave端优化点:加入了interface-interval1,用于pacemaker集群的vip漂移探测,主从同步不一致时,单独修改各slave记录。

缓存DNS分离:限定容许请求范围--内网,开启递归。后台逻辑管理层

资本主义社会:HTTPDNS

沪江向HTTPDNS发展主要进行了两项工做,第一项是对HTTPDNS接口服务的选型,在自制的HTTPDNS服务和第三方的服务之间进行选择。在选择了接口服务后就必须对移动端SDK进行改造,这就是第二项工做。

DNS的坑

DNS解析时间长

主要缘由在于DNS开启了递归、转发服务,未作分布式以及读写分离,单ISP线路部署。

DNS安全问题

常见的DNS攻击手段有DNS query flood、udp flood、折射攻击、放大攻击。

对此应对策略分别是针对大流量攻击购买三方服务进行抵抗,增长DNS公网带宽,权威DNS设置白名单策略,DNS限速策略,提升DNS并发性能。

DNS解析调整后,客户端未生效

一些依赖于java/.net/python等框架的客户端应用程序,如salt-minion,在DNS解析调整后,没法当即刷新生效。

其缘由就在于程序未触发客户端DNS解析器glibc的res_init()模块工做,其使用的python scoket.getaddrinfo只在程序第一次启动时调用res_init(),读取/etc/resolv.conf内容。

解决方法就是重启客户端程序,强制触发客服端DNS解析器工做。或者客户端程序直接使用底层的域名解析函数,而非第三方框架提供。

DNS区域解析不许确

这个多是因为LocalDNS解析转发或者权威DNS IP地址库出现问题。

DNS注册商处写错NS记录

这时候就须要当即将域名注册商处的glue records值改成正确的值,或者请求域名注册商单独刷新影响域名的glue records记录。

DNS污染

这个问题无需多说,请使用HTTPDNS!

相关文章
相关标签/搜索