DNS (Domain Name System 的缩写)的作用非常简单,就是根据域名查出IP地址。你可以把它想象成一本巨大的电话本。
举例来说,如果你要访问域名math.stackexchange.com
,首先要通过DNS查出它的IP地址是151.101.129.69
。
由于后面我会讲到 DNS 的解析过程,因此需要你对域名的层级有一些了解
.root
或者 .
,通常是省略的.com
,.cn
等baidu.com
里的 baidu
,这个用户是可以注册购买的baike.baidu.com
里的baike
,这个用户是可分配的主机名.次级域名.顶级域名.根域名
baike.baidu.com.root
咱们以访问 www.163.com
这个域名为例,来看一看当你访问 www.163.com 时,会发生哪些事:
www.163.com
的ip是啥?.com
的域名,就回信说:这个域名是由 .com
老弟管理的,你去问他好了,这是.com
老弟的联系方式(ip1)。.com
这个顶级域名服务器发起请求:请问 .com
大大,www.163.com
的ip 是啥?.com
顶级域名服务器接收到请求后,看到这是 163.com
的域名,就回信说:这个域名是 .163.com
老弟管理的,你就去问他就行了,这是他的联系方式(ip2).163.com
这个权威域名服务器发起请求:请问 163.com
大大,请问 www.163.com
的ip是啥?163.com
权威域名服务器接收到请求后,确认了是自己管理的域名,马上查了下自己的小本本,把 www.163.com
的ip告诉了 本地DNS服务器。www.163.com
的ip了,马上把这个消息告诉了要求查询的客户(就是你的电脑)。由于这个过程比较漫长,本地DNS服务器为了节省时间,也为了尽量不去打扰各位老大哥,就把这个查询结果偷偷地记在了自己的小本本上,方便下次有人来查询时,可以快速回应。总结起来就是三句话
上面的几个步骤里,可以看到有两个地方会缓存 DNS 的查询记录,有了缓存,在一定程度上会提高查询效率,但同时在准确率上会有所损失。
因此我们在配置 DNS 解析的时候,会有一个 TTL 参数(Time To Live),意思就是这个缓存可以存活多长时间,过了这个时间,本地 DNS 就会删除这条记录,删除了缓存后,你再访问,就要重新走一遍上面的流程,获取最新的地址。
当我们在阿里云买了一个域名后,可以配置我们主机域名解析规则,也就是 记录。
常见的 DNS 记录类型如下
A
:地址记录(Address),返回域名指向的IP地址。
NS
:域名服务器记录(Name Server),返回保存下一级域名信息的服务器地址。该记录只能设置为域名,不能设置为IP地址。
MX
:邮件记录(Mail eXchange),返回接收电子邮件的服务器地址。
CNAME
:规范名称记录(Canonical Name),返回另一个域名,即当前查询的域名是另一个域名的跳转,详见下文。
PTR
:逆向查询记录(Pointer Record),只用于从IP地址查询域名,详见下文。
后面我将使用 wireshark 抓取 DNS 的数据包,但是在开始之前 ,得先了解一下 DNS 的报文结构
打开 Wireshark 后,使用 ping 163.com
来发起 DNS 解析请求,使用 DNS
关键字在Wireshark 过滤。
从抓取的报文整体来看,我们可以粗略获取几个信息
请求和应答的报文的截图我放在了下面,接下来我将逐个分析。
请求
应答
请求和应答的事务ID应当是一个:0xd0d7
标志字段里的内容比较多,每个字段的含义如下
回答资源记录数,在应答包里为 2,说明返回了两条查询结果,你可以在 Answer 字段里看到。
权威名称服务器计数
附加资源记录数
应答的主要内容,这里返回两条结果,每条结果里的字段有
Name: 查询的域名
Type: A表示IPv4,AAAA 表示IPv6
Class: 表示Internet,几乎总是它
Time to live: 生存时间
Data length: 数据长度
Address: 查询到的 IP 地址
通过上面的讲解,我们都知道了,DNS 完成了一次域名到 IP 的映射查询,当你在访问 www.baidu.com 时,能正确返回给你 百度首页的 ip。
但如果此时 DNS 解析出现了一些问题,当你想要访问 www.baidu.com 时,却返回给你 www.google.com 的ip,这就是我们常说的 DNS 劫持。
与之容易混淆的有 HTTP 劫持。
那什么是 HTTP 劫持呢?
你一定见过当你在访问 某个网站时,右下角也突然弹出了一个扎眼的广告弹窗。这就是 HTTP 劫持。
借助别人文章里的例子,它们俩的区别就好比是
DNS劫持是你想去机场的时候,把你给丢到火车站。
HTTP劫持是你去机场途中,有人给你塞小广告。
那么 DNS劫持 是如何产生的呢?
下面大概说几种DNS劫持方法:
1.本机DNS劫持
攻击者通过某些手段使用户的计算机感染上木马病毒,或者恶意软件之后,恶意修改本地DNS配置,比如修改本地hosts文件,缓存等
2. 路由DNS劫持
很多用户默认路由器的默认密码,攻击者可以侵入到路由管理员账号中,修改路由器的默认配置
3.攻击DNS服务器
直接攻击DNS服务器,例如对DNS服务器进行DDOS攻击,可以是DNS服务器宕机,出现异常请求,还可以利用某些手段感染dns服务器的缓存,使给用户返回来的是恶意的ip地址
dig是一个在类Unix命令行模式下查询DNS包括NS记录,A记录,MX记录等相关信息的工具。
通过 dig (参数:+trace
)命令,我们可以看到上面描述的 DNS 解析的详细过程
从返回的结果,我们可以看得出几点信息
到
m.root-servers.net. ,它们对应的ip地址,已经内置在本地DNS服务器中。如果你只想看到结果,可以使用 +short
参数,可以直接返回 www.163.com 对应着哪几个ip
你也可以加个 @
参数 ,指定从某个 DNS 服务器进行查询
如果你只想查看指定的记录类型
host
命令 可以看作dig
命令的简化版本,返回当前请求域名的各种记录。
whois
命令用来查看域名的注册情况。
nslookup也是常用的一个查询 DNS 解析结果的工具
$ nslookup [查询的域名] [指定DNS服务器]
你也可以指定公网的域名服务器进行查询,比如常见的 114.114.114.114
MacOS
$ sudo dscacheutil -flushcache
$ sudo killall -HUP mDNSResponder
Windows
$ ipconfig /flushdns
Linux
# 使用NSCD的DNS缓存
$ sudo /etc/init.d/nscd restart
# 服务器或者路由器使用DNSMASQ
$ sudo dnsmasq restart