同学,你听说过DNS么?

0x00

序言

DNS is theDomain Name System,a network system used to translate names into IP.

——From Wikipedia, the free encyclopedia

0x01

概述

DNS 是指域名系统(Domain Name System) 。

在Internet上域名与IP地址之间是一一对应的,域名虽然便于人们记忆,但机器之间只能互相认识IP地址,它们之间的转换工作称为域名解析,域名解析需要由专门的域名解析系统来完成,DNS就是进行域名解析的系统。

举个栗子

如果你要访问域名hackinit.org

首先要通过DNS查出它的IP地址是162.255.119.209

0x02

解析过程

虽然只需要返回一个IP地址,

但是DNS解析过程非常复杂,分成多个步骤。

一次完整的查询请求经过的流程为:

Client -->hosts文件 -->DNS Service Local Cache --> DNS Server (recursion) --> Server Cache -->iteration(迭代) --> 根-->顶级域名DNS-->二级域名DNS…

下面我们来用 nslookup 这个工具来说一下解析步骤:

但是也有的DNS解析比较复杂:

这是怎么一个过程呢?我们用dig工具来跟踪一下吧。

上面命令的第一段列出根域名.的所有NS记录,

即所有根域名服务器。

接着是第二段。

上面结果显示.org域名的6条NS记录,

同时返回的还有每一条记录对应的IP地址。

然后,DNS服务器向这些顶级域名服务器发出查询请求,

上面结果显示hackinit.org有2条NS记录,

同时返回的还有每一条NS记录对应的IP地址。

于是我们再跟踪一下hackinit.io(前三段略去)。

dig +trace hackinit.io

上面结果显示,hackinit.io只有一条A记录,

最先返回结果的NS服务器是dns2.registrar-servers.com,

IP地址为216.87.152.33

0x03

域名结构

总结一下,域名的层级结构如下:

主机名→次级域名→顶级域名→根域名

(即 host→sld→tld→root)

互联网名称与数字地址分配机构( The Internet Corporation for Assigned Names and Numbers , ICANN)负责在全球范围内对互联网唯一标识符系统及其安全稳定的运营进行协调,包括互联网协议(IP)地址的空间分配、协议标识符的指派、通用顶级域名(gTLD)以及国家和地区顶级域名(ccTLD)系统的管理以及根服务器系统的管理。

全世界现有三个大的网络信息中心:位于美国的 Inter-NIC,负责美国及其他地区;位于荷兰的RIPE-NIC,负责欧洲地区;位于日本的APNIC ,负责亚太地区。

0x04

DNS的记录类型

域名与IP之间的对应关系,称为"记录"(record)。

根据使用场景,"记录"可以分成不同的类型(type),

前面已经看到了有A记录和NS记录。

常见DNS记录类型

(1)A:地址记录(Address)

返回域名指向的IP 地址。

(2) NS:域名服务器记录(Name Server)

返回保存下一级域名信息的服务器地址。该记录只能设置为域名,不能设置为IP地址。

(3)MX:邮件记录(Mail eXchange)

返回接收电子邮件的服务器地址。

(4)CNAME:规范名称记录(Canonical Name)

返回另一个域名,即当前查询的域名是另一个域名的跳转。

(5)PTR:逆向查询记录(Pointer Record)

只用于从IP地址查询域名。

一般来说,为了服务的安全可靠,

至少应该有2条NS记录,

而A记录和MX记录也可以有多条,

这样就提供了服务的冗余性,防止出现单点失败。

CNAME记录主要用于域名的内部跳转,

为服务器配置提供灵活性,用户感知不到。

由于CNAME记录就是一个替换,所以域名一旦设置CNAME记录以后,就不能再设置其他记录了(比如A记录和MX记录),这是为了防止产生冲突。

举例来说,a.com指向b.com,而两个域名各有自己的MX记录,如果两者不一致,就会产生问题。

由于顶级域名通常要设置MX记录,所以一般不允许用户对顶级域名设置CNAME记录。

PTR记录用于从IP地址反查域名。

dig命令的-x参数用于查询PTR记录。

上面结果显示,211.99.189.179的域名是mta1.china.com.。

逆向查询的一个应用,是可以防止垃圾邮件,即验证发送邮件的IP地址,是否真的有它所声称的域名。

0x05

DNS劫持与污染

DNS劫持

指用户访问一个被标记的地址时,DNS服务器故意将此地址指向一个错误的IP地址的行为。

例如,网通、电信、铁通的某些用户有时候会发现自己打算访问一个地址,却被转向了各种推送广告等网站,这就是DNS劫持。

你去解析一个不存在的域名的时候,DNS 本应该告诉我们这个域名不存在,但被劫持后 DNS 会给我们解析出一个 IP。

常见的情况就是电信 114 搜索。

解决方法就是换成 Google DNS 。

DNS污染

DNS污染,又称为域名服务器缓存污染(DNS cache pollution)或者域名服务器快照侵害/域名服务器缓存投毒(DNS cache poisoning),指的是用户访问一个地址,国内的服务器(非DNS)监控到用户访问的已经被标记地址时,服务器伪装成DNS服务器向用户发回错误的地址的行为。

例如,访问Youtube、Facebook之类网站时出现的状况。

当使用一个不存在的 IP(肯定不是 DNS )作为 DNS 去解析某个域名的时候,理应没有任何返回,但是却能返回一个错误 IP。为了证明是污染不是劫持,再用这个不存在的 IP 去解析不存在的域名,若没有发现任何返回,就说明这个不存在的域名没有被污染。

解决方法就是 DNSCrypt 。

DNS污染是G*W常用的。访问google.com时, 因为服务器在国外,DNS需要过解析,肯定要走国际带宽的出口,然后就被G*W逮住了。由于DNS 走的是UDP协议,而且UDP又没有什么校验机制,只管发送。所以这时候,G*W就假装成DNS服务器回应,而此时真正的请求可能正在被真正的DNS服务器处理,假的已经返回给你了,浏览器就选择了最快返回的那个地址去解析了(当然是一个不可用的地址啦)。

因为DNS 走的UDP协议,并且是53端口,所以这有多好发现也就不言而喻了。如果你强行让DNS走TCP协议,G*W 有办法让你连接重置,虽然污染不了你的DNS,但是你还是无法获得ip。

也就是为什么有一种科学上网方式就叫修改host 文件,修改后,域名不需要去DNS服务器请求了,直接在你的操作系统里就已经解析出了ip 地址。但是,G*W还是会定期封杀这些网站的ip地址,你的host就没用了。

参考链接

http://blog.51cto.com/lxlxlx/1882865

https://baike.sogou.com/v17182.htm

http://www.ruanyifeng.com/blog/2016/06/dns.html

http://www.hack520.com/330.html

文稿/陈远升

排版/刘心语

我们是谁! | Techomedia 拓科传媒

华东地区 首家高中生自主运营

科技STEM教育为核心的媒体

我们从高中生的角度看科技大事件

科技絮叨叨带大家回顾那些里程碑式的故事

字幕菌看趣味实验视频

还有绝对值得一去的活动安利

我们与上海科技大学联合主办hack.init() 创客马拉松

在Google上海的App Inventor做独家学生媒体

我们是Techomedia我们正在长大

有任何科技投稿文章、内容反馈或合作意向

欢迎直接在Techomedia公众号留言

邮件联系contact@techomedia.cc

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20190214B145SJ00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券