DNS内幕
DNS是什么,可起到什么作用?没有DNS,今天我们所熟悉的互联网就会立即停工。DNS确实非常重要。不过,通常即使是有经验的开发人员,也对其了解甚少。现在,让我们开始了解DNS吧。
什么是DNS
DNS是计算机域名系统 (Domain Name System 或Domain Name Service) 的缩写,它是由域名解析器和域名服务器组成的。
域名服务器是指保存有该网络中所有主机的域名和对应IP地址,并具有将域名转换为IP地址功能的服务器。其中域名必须对应一个IP地址,一个IP地址可以有多个域名,而IP地址不一定有域名。域名系统采用类似目录树的等级结构。
域名服务器通常为客户机/服务器模式中的服务器方,它主要有两种形式:主服务器和转发服务器。
将域名映射为IP地址的过程就称为“域名解析”。
IP地址
DNS以及整个互联网都是构建在称为网际协议(Internet Protocol)的基础上。每台机器都至少有一个唯一地址,以便和其他机器进行通信。IP地址跟端口号是紧密关联的。监听网络的每个程序都会使用唯一的端口号来辨别发给她的数据流。80端口是HTTP数据流的默认端口。443端口是HTTPS或安全Web访问的默认端口。
我们使用的IP协议有两种,IPv4(1981年诞生),一直是互联网的基础。IPv6,它是为了解决IPv4中IP地址不够用的问题而出现的。
在IPV4(127.0.0.1)中IP是由32位二进制数组成的,将这32位二进制数分成4组每组8个二进制数,将这8个二进制数转化成十进制数,就是我们看到的IP地址,其范围是在0~255之间。因为,8个二进制数转化为十进制数的最大范围就是0~255。而IPv6是由128位二进制数表示一个IP地址。
127.0.0.1:这个地址是特殊的保留IP地址,称作环回( Loopback)地址或本地主机(Localhost)地址。计算机通常将环回地址作为访问自己的快捷方式。
DNS的由来
问题在于,人们并不擅长记忆数字。记住www.leautolink.com跟记住47.92.143.178的难度完全不是一回事儿,但它们却是指同一个网站。所以,人们无法记住数字,而计算机无法直接使用文本地址。怎么解决这个问题呢?
在过去的解决办法:创建一个名为hosts的文件,在这个文件中,写下每个IP地址和它所对应的主机名。比如47.92.143.178 www.leautolink.com。这样只要计算机看到www.leautolink.com,就会去查看hosts文件,找到IP地址,然后尝试连接。这个文件现在依然存在,当调试的时候,依然可以这么使用。它的位置:Unix/Liunx/Max 上,在/etc/hosts。在Windows中,它位于C:\windows\system32\drivers\etc\hosts。
这个解决方案的问题在于,每台机器都带有一个巨大的主机名和地址列表,不过当时的年代,互联网上的主机还是在数以百计的规模,而不是今天的数以亿计。每台机器都需要这个文件,要确保每台机器的的该文件的内容一致,那保持这些文件同步就成了一个非常艰巨的任务。
起初,hosts文件由一组人维护,之后,文件被放到了服务器上,所有人都可以从那里下载。随着越来越多的人申请修改这个文件的记录,很快证明这种办法的扩展性不怎么样。另外,数以千计的用户每个数小时就要下载更新后的文件,导致带宽压力很大。
我们需要的是一个能够分散负载的系统,同时针对人(更新文件)和计算机(主要是带宽),为了做到这点,系统需要强大的缓存支持,而且必须是分布式的。这个系统最终发展成了DNS,并沿用至今。它的扩展性非常好,尤其是考虑到最初设计它的时间,以及自那以后互联网及其疯狂的扩张。
DNS 的工作方式
基本的原则类似于hosts文件的分布式版本。这些hosts文件的分布是DNS协议的重要组成部分,我们称为树状层级(看起来像倒置的树)。
虽然是单个根节点,为了扩展性和冗余度,它被复制到了几台服务器上。有13台位于分散地理位置的根服务器来专门负责这个任务。这些根服务器自身并不包含任何主机信息,而是指向另一层级的服务器——也就是专门负责顶级域名如.com和.net的服务器。
URL中的每个点都会指向这颗树的下一层级。我们熟知的URL的结构其实就是DNS管理这颗树的表现。一个URL:www.leautolink.com.hk。它有4个部分:www、leautolink、com、hk,每部分都代表它在DNS表示中的一部分。
- hk:Hong Kong(香港)的缩写。这部分代表地理位置。每个地区都有一个缩写。
- com:commercial(商业用途)的缩写。这表示这个域名归公司所有。
- leautolink:你要查找的实体名称。这是 乐视车联的域名。
- www:leautolink域的万维网子域,这会使其访问属于leautolink.com.hk域的万维网服务器。
现在,我们已经知道URL是如何拼在一起的,以及DNS查询(查找域名的过程自身)是如何工作的了。简单的DNS查询会访问13个核心节点中的一个。在那里,它会查询URL中的第一部分,代表区域的顶级域名。查到了区域之后,它会访问区域DNS服务器,并查询商业域名服务器。
在那台服务器上,它会请求查询 leautolink域,最终到达 leautolink域自身的域名服务器,即leautolink的DNS服务器。在那里,你可以获得 www.leautolink.com.hk的IP地址,但你也可以查
leautolink.com.hk域的IP或mail.leautolink.com.hk域,因为所有这些域都可能会存在leautolink.com.hk的DNS服务器上。
DNS查询
用于查询DNS服务器的工具非常多。最常用的一个就是dig了。dig(Domain Information Groper)域名信息查询器。
dig <domainname>
例如:dig www.leautolink.com
可以看到,它会查询www.leautolink.com中返回1个结果,而这台服务器的IP地址为47.92.143.178。如果想验证这一点,可以对www.leautolink.com简单执行ping命令。
- dig <domainname> +trace
一种更高级的查询称作DNS遍历( DNS traversal或 DNS walk)。它会尝试查询指向目标的所有域名服务器。给dig加上+ trace选项,它会让dig在查找目标域名的DNS记录时,提供它查询所有服务器的路径。这次,我们继续查询www.leautolink.com
带上查询路径的dig的输出更加复杂。要注意的第一部分是在最开始部分列出的13台服务器。这些是互联网实质上的根服务器,我们是直接向它们查询的。然后,它查询了com域,可以看到解析出来的所有的域名服务器。在这些域名服务器上,它直接解析了 leautolink.com,进而解析到了 leautolink.com 域的NF1到NS2域名服务器。我们称这些NS服务器为名称服务器( Nameserver)。它们为域名 leautolink.com提供了DNS功能。这说明实际上有2台服务器在一起为leautolink.com.提供DNS名称解析,最终解析到了我们实际的服务器IP地址。(请反复阅读这段文字,深刻理解以下)
DNS缓存
到目前为止,你一定已经注意到我们的查询并不高效。每次访问 www.leautolink.com时,都要向根节点查询,这会给DNS根服务器带来很大的负载。你看过dig的输出,事实上对于单个网站面言,只需要一点点信息而已;现在,乘以互联网上网站的总数,再乘以正在上网的用户总数,得到结果后,再乘以每个用户拥有的智能手机、上网本及其他互联网设备的数目。显而易见,数目非常庞大。
尽管所有核心DNS服务器实质上都是服务器集群,它们会作为一个整体来响应查询(这样提供了很多的计算能力和带宽),但要响应全世界的每一条DNS查询还是难以实现!问题的解决办法是缓存。
缓存是指系统会自己保存一份已知服务器和DNS服务器的列表,来供其在自身的存储中查询。这会大大缩减遍历整个DNS树来查询先前访问过的服务器所消耗的时间,还可减少发向主节点的查询数量。
举个例子,那台用dig查找过 www.leautolink.com.hk的服务器会在内存中保留它查询过的hk域的名称服务器,以及 leautolink的DNS记录。
查询DNS缓存
如果你平时使用 Windows,你可以执行一条简单查询,来查看当前的DNS缓存。为了显示当前DNS缓存,打开 Windows的命令行提示符,然后执行ipconfig/displaydns
如果想要清空DNS缓存,可以执行ipconfig/flushdns。虽然并不是理想的方案,但它在网站由于更换了IP地址或迁移到了别的服务器上而无法解析时非常管用。
基于DNS的负载均衡
对于实际的负载均衡,它的工作机制非常简单。它使用一种称为轮询的方式,来向特定域的一组服务器分发连接请求。这种操作是顺序执行的(按照第一、第二、第三等步骤)。要向服务器增加基于DNS的负载均衡,只需为域增加多个A记录即可。是的,就这么简单!
好处:简单,容易扩展。
坏处:因为是轮询的,所以每次请求可能都会请求不同的服务器,所以无法保存会话标识;另外就是没有容错性,其中一台Web服务器宕机了,DNS负载均衡器无法辨别。
DNS劫持
DNS劫持又称域名劫持,是指在劫持的网络范围内拦截域名解析的请求,分析请求的域名,把审查范围以外的请求放行,否则返回假的IP地址或者什么都不做使请求失去响应,其效果就是对特定的网络不能访问或访问的是假网址。(所以我们在外面连接免费的WIFI,如果有人做手脚,是非常不安全的)。
DNS劫持(DNS钓鱼攻击)十分凶猛且不容易被用户感知,曾导致巴西最大银行巴西银行近1%客户受到攻击而导致账户被盗。黑客利用宽带路由器的缺陷对用户DNS进行篡改——用户只要浏览一下黑客所掌控的WEB页面,其宽带路由器的DNS就会被黑客篡改,因为该WEB页面设有特别的恶意代码,所以可以成功躲过安全软件检测,导致大量用户被DNS钓鱼诈骗。
预防DNS劫持
其实,DNS劫持并不是什么新鲜事物,也并非无法预防,百度被黑事件的发生再次揭示了全球DNS体系的脆弱性,并说明互联网厂商如果仅有针对自身信息系统的安全预案,就不足以快速应对全面而复杂的威胁。因此,互联网公司应采取以下措施:
1、互联网公司准备两个以上的域名,一旦黑客进行DNS攻击,用户还可以访问另一个域名。
2、互联网应该对应急预案进行进一步修正,强化对域名服务商的协调流程。
3、域名注册商和代理机构特定时期可能成为集中攻击目标,需要加以防范。
4、国内有关机构之间应该快速建立与境外有关机构的协调和沟通,协助国内企业实现对此事件的快速及时的处理。
名词解释
NS记录:Name Server名称服务器记录。
MX记录:Mail Exchage邮件收发器记录(通常是域的邮件服务器)。
A记录:将一个IP地址和一个域名连接起来。
CNAME记录:代表规范名称或是别名。
ISP:(Internet Service Provider),互联网服务提供商,即向广大用户综合提供互联网接入业务、信息业务、和增值业务的电信运营商。
ICP:(Internet Content Provider)是互联网内容提供商,向广大用户综合提供互联网信息业务和增值业务的电信运营商。
题外话
前段时间由于公司网站域名接入备案问题,导致整个官网,所有的线上接口服务瘫痪,导致APP无法正常使用的严重“事故”,所以紧急进行服务迁移到香港服务器,才临时解决这次的危机。所以经过这次的“事故”经历,也提醒大家引以为戒,提前备案,不要犯类似错误。
那么备案是什么呢?
备案是指向主管机关报告事由存案以备查考。行政法角度看备案,实践中主要是《立法法》和《法规规章备案条例》的规定。根据中华人民共和国信息产业部第十二次部务会议审议通过的《非经营性互联网信息服务备案管理办法》精神,在中华人民共和国境内提供非经营性互联网信息服务,应当办理备案。未经备案,不得在中华人民共和国境内从事非经营性互联网信息服务。而对于没有备案的网站将予以罚款和关闭。
为什么要备案呢?
根据工信部《互联网信息服务管理办法》(国务院 292 号令),网站在未完成备案之前,不能指向大陆境内服务器开通访问。如果您的网站托管在中国大陆节点服务器,或者开通 CDN 服务,就必须申请 ICP(互联网内容提供商)备案。若网站服务器为非中国大陆节点,则不用申请备案。
ICP 包含两种类型:
ICP 备案: 对于单纯的资讯性并且不涉及直销的网站,需要申请 ICP 备案。ICP 备案可通过网站托管服务器提供商或网络空间服务商(如电信、移动、联通等)进行申请。阿里云 ICP 备案操作可分为:首次备案、接入备案、新增网站备案(原备案不在阿里云) 和 新增网站备案(原备案在阿里云)。
经营性 ICP 许可证: 对于商品或服务的在线平台或第三方卖方,需获得商用许可证。要申请经营性 ICP 许可证,您必须先有一个有效的 ICP 备案号。经营性备案需用户自己到当地管理局相关部门进行办理,服务商可协助提供资质以及接入协议。具体办理要求需您登录当地经营性备案网站进行查看。