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

摘要

HttpDNS服务是一款可以有效解决域名劫持的方案,并且已在各家大厂广泛应用,现已成为一款相当成熟的产品,本次分享主要围绕沪江由DNS到HTTPDNS演进进行,希望能够给大家带来一些启发。

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

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!

今天的分享就到这里,有什么问题可以在评论区讨论,喜欢本次分享请点赞。谢谢大家!

原文发布于微信公众号 - IT大咖说(itdakashuo)

原文发表时间:2018-03-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏高性能服务器开发

(八)高性能服务器架构设计总结1——以flamigo服务器代码为例

这篇文章算是对这个系列的一个系统性地总结。我们将介绍服务器的开发,并从多个方面探究如何开发一款高性能高并发的服务器程序。

19020
来自专栏北京马哥教育

10个实用的Django建议

Django 作为一个杰出的Python开源框架,或许得不到和其它流行框架如Rails这样多的赞美,但是它和其他框架一样精炼,非常注重DRY(Don’t Rep...

42980
来自专栏技术博文

linux下使用ffmpeg将amr转成mp3

接到需求要在Linux环境下将amr转换为mp3,windows下直接使用第三方jar包封装的exe方法即可,但不支持Linux,上网爬完资料说是用ffmpeg...

40470
来自专栏嵌入式程序猿

究竟哪款适合你

随着物联网的越来越火,嵌入式工程师需要更多的网络知识,其中TCP/IP协议栈是我们经常要用到的,在公众号里曾给大家介绍过开源的Uip和LwIP协议栈,并在fre...

35770
来自专栏Java架构沉思录

基于Netty的百万级推送服务设计要点

最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题。问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可...

35420
来自专栏FreeBuf

手机没Root?你照样可以渗透路由器

和Metasploit差不多,RouterSploit是一个强大的漏洞利用框架,用于快速识别和利用路由器中的普通漏洞,它还有个亮点,就是可以在绝大多数安卓设备上...

56840
来自专栏用户2442861的专栏

java处理高并发高负载类网站的优化方法

    一般来说MySQL是最常用的,可能最初是一个mysql主机,当数据增加到100万以上,那么,MySQL的效能急剧下降。常用的优化措施是M-S(主-从)...

37320
来自专栏数据和云

【推荐】 RAC 性能优化全攻略与经典案例剖析

ORACLE RAC凭借其卓越的容错能力和可扩展性以及对应用透明的切换能力引领了数据库高可用架构的潮流,但在实际的生产环境中,出现的性能问题非常多,对数据库的稳...

35070
来自专栏coding

django2.0入门教程第一节启动开发模式下的服务器

17420
来自专栏FreeBuf

我们来“劫持”个GitHub自定义域名玩吧!

作为一个国内外项目都不怎么挖的我,比较喜欢拿自己正在使用的服务入手挖洞,毕竟拥有需求又了解业务才能长期跟进,更好的去发现各种流程上出现的毛病。

22130

扫码关注云+社区

领取腾讯云代金券