后台回复关键字 “黑魔法”,即可获取明哥整理的《Python黑魔法指南》
大家好,我是明哥。
在找工作面试的过程中,面试官非常喜欢考察基础知识,除了数据结构与算法之外,网络知识也是一个非常重要的考察对象。
而网络知识,通常是很抽象,不容易理解的,有很多同学就在这里裁了跟头。
今天开始分享这个网络知识扫盲系列第一篇:DNS。
1. DNS 是什么?
2. 域名的层级
由于后面我会讲到 DNS 的解析过程,因此需要你对域名的层级有一些了解
根域名 :.root或者.,通常是省略的顶级域名,如.com,.cn等次级域名,如baidu.com里的baidu,这个是用户可以进行注册购买的主机域名,比如baike.baidu.com里的baike,这个是用户可分配的主机名.次级域名.顶级域名.根域名baike.baidu.com.root3. DNS 解析过程
咱们以访问www.163.com这个域名为例,来看一看当你访问 www.163.com 时,会发生哪些事:
总结起来就是三句话
4. DNS的缓存时间
上面的几个步骤里,可以看到有两个地方会缓存 DNS 的查询记录,有了缓存,在一定程度上会提高查询效率,但同时在准确率上会有所损失。
5. DNS 的记录类型
当我们在阿里云买了一个域名后,可以配置我们主机域名解析规则,也就是记录。
阿里云 域名云解析
常见的 DNS 记录类型如下
CNAME:规范名称记录(Canonical Name),返回另一个域名,即当前查询的域名是另一个域名的跳转,详见下文。
6. DNS 报文结构
后面我将使用 wireshark 抓取 DNS 的数据包,但是在开始之前 ,得先了解一下 DNS 的报文结构
打开 Wireshark 后,使用ping 163.com来发起 DNS 解析请求,使用DNS关键字在Wireshark 过滤。
从抓取的报文整体来看,我们可以粗略获取几个信息
DNS 是应用层协议,传输层协议使用的是 UDPDNS 默认端口是 53
请求和应答的报文的截图我放在了下面,接下来我将逐个分析。
请求
应答
Transaction ID
请求和应答的事务ID应当是一个:0xd0d7
Flags
标志字段里的内容比较多,每个字段的含义如下
QR(Response):查询请求/响应的标志信息。查询请求时,值为 0;响应时,值为 1。Opcode:操作码。其中,0 表示标准查询;1 表示反向查询;2 表示服务器状态请求。AA(Authoritative):授权应答,该字段在响应报文中有效。值为 1 时,表示名称服务器是权威服务器;值为 0 时,表示不是权威服务器。TC(Truncated):表示是否被截断。值为 1 时,表示响应已超过 512 字节并已被截断,只返回前 512 个字节。RD(Recursion Desired):期望递归。该字段能在一个查询中设置,并在响应中返回。该标志告诉名称服务器必须处理这个查询,这种方式被称为一个递归查询。如果该位为 0,且被请求的名称服务器没有一个授权回答,它将返回一个能解答该查询的其他名称服务器列表。这种方式被称为迭代查询。RA(Recursion Available):可用递归。该字段只出现在响应报文中。当值为 1 时,表示服务器支持递归查询。Z:保留字段,在所有的请求和应答报文中,它的值必须为 0。rcode(Reply code):返回码字段,表示响应的差错状态。当值为 0 时,表示没有错误;当值为 1 时,表示报文格式错误(Format error),服务器不能理解请求的报文;当值为 2 时,表示域名服务器失败(Server failure),因为服务器的原因导致没办法处理这个请求;当值为 3 时,表示名字错误(Name Error),只有对授权域名解析服务器有意义,指出解析的域名不存在;当值为 4 时,表示查询类型不支持(Not Implemented),即域名服务器不支持查询类型;当值为 5 时,表示拒绝(Refused),一般是服务器由于设置的策略拒绝给出应答,如服务器不希望对某些请求者给出应答。Answer RRs
回答资源记录数,在应答包里为 2,说明返回了两条查询结果,你可以在 Answer 字段里看到。
Authority RRs
权威名称服务器计数
Additionnal RRs
附加资源记录数
Answers
应答的主要内容,这里返回两条结果,每条结果里的字段有
通过上面的讲解,我们都知道了,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服务器
9. 工具的使用dig 命令
dig是一个在类Unix命令行模式下查询DNS包括NS记录,A记录,MX记录等相关信息的工具。
通过 dig (参数: trace)命令,我们可以看到上面描述的 DNS 解析的详细过程
从返回的结果,我们可以看得出几点信息
如果你只想看到结果,可以使用 short参数,可以直接返回 www.163.com 对应着哪几个ip
你也可以加个@参数 ,指定从某个 DNS 服务器进行查询
如果你只想查看指定的记录类型
host 命令
host命令 可以看作dig命令的简化版本,返回当前请求域名的各种记录。
whois命令
whois命令用来查看域名的注册情况。
nslookup命令
nslookup也是常用的一个查询 DNS 解析结果的工具
$nslookup[查询的域名][指定DNS服务器]
你也可以指定公网的域名服务器进行查询,比如常见的 114.114.114.114
10. 手动清理本地缓存
MacOS
$sudodscacheutil-flushcache$sudokillall-HUPmDNSResponder
Windows
$ipconfig/flushdns
Linux
#使用NSCD的DNS缓存$sudo/etc/init.d/nscdrestart#服务器或者路由器使用DNSMASQ$sudodnsmasqrestart
以上便是我今天的分享,如果对你有帮助,可以帮忙转发一下。
明哥原创文都已传至 Github:https://github.com/iswbm/PythonCodingTime
本文永久博客链接:http://python.iswbm.com/en/latest/c10/c10_01.html
推荐阅读
太赞了!《Python 黑魔法指南》终于面世了
翻车了!pyc 文件居然曝光了我的密码
使用 pyecharts 打造酷炫的 BI 大屏
玩转 PyCharm ,这篇文章就够了
代码被反编译了?这两个小技巧能帮到你
pip install 和conda install有什么区别吗?