什么是DNS
DNS(DOMAIN NAME SYSTEM)是一个域名系统,是万维网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串
DNS 工作流程
- 客户端发送域名解析请求到本地域名服务器
- 发起域名解析请求使用 UDP 协议:因为 UDP 协议速度快,只需要一个请求一个应答
- 这一步使用递归查询,希望直接返回获得 ip 地址或者报错
- 本地服务器查询hosts文件和本地缓存
- 有则返回,若无 =>(发送请求到根域名服务器 <=> 返回顶级域名服务器地址)
- 后续步骤采用迭代查询,希望返回 ip 地址或者下一步查询的 dns 服务器地址
- 请求顶级域名服务器 <=> 返回权威域名服务器地址
- 请求权威域名服务器 => 返回ip地址(这一步可以做负载均衡,根据不同策略返回不同IP)
- 本地域名服务器缓存结果
- 返回ip地址给客户端
DNS请求方式
1. 递归请求(客户端 => 本地 DNS 服务器)
如果主机所询问的本地域名服务器不知道被查询的域名的IP地址,那么本地域名服务器就以DNS客户的身份,向其它根域名服务器继续发出查询请求报文(即替主机继续查询),而不是让主机自己进行下一步查询。
因此,递归查询返回的查询结果或者是所要查询的IP地址或者是报错,表示无法查询到所需的IP地址
2. 迭代请求(本地 DNS 服务器 => 外网)
- 当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的IP地址,要么告诉本地服务器:“你下一步应当向哪一个域名服务器进行查询”。
- 然后让本地服务器进行后续的查询。根域名服务器通常是把自己知道的顶级域名服务器的IP地址告诉本地域名服务器,让本地域名服务器再向顶级域名服务器查询。
- 顶级域名服务器在收到本地域名服务器的查询请求后,要么给出所要查询的IP地址,要么告诉本地服务器下一步应当向哪一个权限域名服务器进行查询。
最后,知道了所要解析的IP地址或报错,然后把这个结果返回给发起查询的主机
DNS服务器的记录类型
A记录(address)
又称IP指向,用户可以在此设置子域名并指向到自己的目标主机地址上
NS记录(name server)
解析服务器记录。用来表明由哪台服务器对该域名进行解析
NS记录只对子域名生效
MX记录(mail)
邮件交换记录。用于将以该域名为结尾的电子邮件指向对应的邮件服务器以进行处理
如:用户所用的邮件是以域名mydomain.com为结尾的,则需要在管理界面中添加该域名的MX记录来处理所有以@mydomain.com结尾的邮件
CNAME
通常称别名指向。您可以为一个主机设置别名。比如设置test.mydomain.com,用来指向一个主机www.rddns.com那么以后就可以用test.mydomain.com来代替访问www.rddns.com了(A 记录优先级高于 CNAME,若一个主机地址同时有 A 记录和 CNAME,则 CNAME 不生效)
DNS 服务器高可用
- DNS的规范规定了2种类型的DNS服务器,一个叫主DNS服务器,一个叫辅助DNS服务器
- 在一个区中主DNS服务器从自己本机的数据文件中读取该区的DNS数据信息,而辅助DNS服务器则从区的主DNS服务器中读取该区的DNS数据信息
- 当一个辅助DNS服务器启动时,它需要与主DNS服务器通信,并加载数据信息,这就叫做区传送(zone transfer)
- 这种情况下,使用TCP协议(复制内容,可靠性高)
DNS 的不足
运营商问题
- 缓存失效问题
- 本地 DNS 服务器域名解析更新不及时,有可能用户地域或网络发生变化后依然提供原来的ip 地址,导致绕远路,请求响应时间较长
- 同时导致容灾问题,当某个 ip 的服务器挂了后,本地 DNS 服务器缓存没有更新,导致老用户持续请求到挂掉的服务器
- 运营商缓存服务器故障导致用户无法访问
- 运营商偷懒转发dns
运营商把请求转发给其他运营商,比如移动压力大偷懒不解析转发给联通,联通服务器以为你是联通用户,返回一个联通的 ip 地址给你,导致运营商跨域降低接口响应速度 - DNS劫持
- 运营商 DNS 服务器将域名故意解析为其他 ip(选择可靠的 DNS 服务器或投诉到工信部)
协议自身问题
- DNS 污染
DNS 解析请求使用 UDP 协议明文传输,可能导致被截取篡改 - LocalDns递归出口NAT
LocalDNS递归出口NAT指的是运营商的LocalDNS按照标准的DNS协议进行递归,但是因为在网络上存在多出口且配置了目标路由NAT,结果导致LocalDNS最终进行递归解析的时候的出口IP就有概率不为本网的IP地址(例如电信变联通),此时域名权威DNS就认为用户是联通的,返回联通的ip导致跨网请求速度变慢 - HTTP 劫持
- 运营商路由器发现是 HTTP 请求,在响应结果中插入 JS 代码弹出一些广告之类的
DNS 劫持
- 个别运营商 DNS 服务器为了利益故意返回错误的 ip 地址
- 攻击者伪造权威 DNS 服务器返回结果给本地 DNS 服务器,欺骗本地 DNS 服务器接收返回记录并覆盖缓存
解决方案
- HttpDNS
- DNSSEC
- 实时监控+商务推动
HTTP 劫持
- 运营商路由器发现是 HTTP 请求,直接重定向到指定地址
- 运营商路由器发现是 HTTP 请求,在响应结果中插入 JS 代码弹出一些广告之类的
解决方案
- 投诉运营商客服
- 投诉工信部
- HTTPS 加密请求,避免篡改
- 如果暂时无法使用 HTTPS,则事后屏蔽,遍历 DOM 对象,屏蔽无关广告
HTTP 劫持监测网站
http://wzjk.iis7.net/
- 一个 TCP 连接可以对应几个 HTTP 请求?(提示,这在问你HTTP1.0和1.1的区别)
- 一个tcp连接对应一个http1.0请求(未启用keepalive),对应多个http1.0请求(启用keepalive)和多个http1.1及2.0请求
2、一个 TCP 连接中 HTTP 请求发送可以一起发送么(比如一起发三个请求,再三个响应一起接收)?(提示,这就是在问你HTTP2.0和HTTP1.1协议的区别)
3、浏览器对同一Host建立TCP连接到数量有没有限制?(拜托,一个网站那么多图片,开一个TCP连接,按顺序下载?那不是等到死?)
HTTPDNS
原理
HttpDNS的原理非常简单,主要有两步:
客户端直接访问HttpDNS接口,获取业务在域名配置管理系统上配置的访问延迟最优的IP。(基于容灾考虑,还是保留次选使用运营商LocalDNS解析域名的方式)
客户端向获取到的IP后就向直接往此IP发送业务协议请求。以Http请求为例,通过在header中指定host字段,向HttpDNS返回的IP发送标准的Http请求即可。
优势
从原理上来讲,HttpDNS只是将域名解析的协议由DNS协议换成了Http协议,并不复杂。但是这一微小的转换,却带来了无数的收益:
A、根治域名解析异常:由于绕过了运营商的LocalDNS,用户解析域名的请求通过Http协议直接透传到了腾讯的HttpDNS服务器IP上,用户在客户端的域名解析请求将不会遭受到域名解析异常的困扰。
B、调度精准:HttpDNS能直接获取到用户IP,通过结合腾讯自有专利技术生成的IP地址库以及测速系统,可以保证将用户引导的访问最快的IDC节点上。
C、实现成本低廉:接入HttpDNS的业务仅需要对客户端接入层做少量改造,无需用户手机进行root或越狱;而且由于Http协议请求构造非常简单,兼容各版本的移动操作系统更不成问题;另外HttpDNS的后端配置完全复用现有权威DNS配置,管理成本也非常低。总而言之,就是以最小的改造成本,解决了业务遭受域名解析异常的问题,并满足业务精确流量调度的需求。
D、扩展性强:HttpDNS提供可靠的域名解析服务,业务可将自有调度逻辑与HttpDNS返回结果结合,实现更精细化的流量调度。比如指定版本的客户端连接请求的IP地址,指定网络类型的用户连接指定的IP地址等。
HTTPS效率和高可用
通过BGP网络保证不同运营商的用户可以快速访问网络
通过在多个数据中心部署服务互备实现高可用
附录
根DNS服务器名字与地址
https://www.internic.net/domain/named.root