.:. 草榴社區 » 技術討論區 » 转载:扫盲 DNS 原理,兼谈“域名劫持”和“域名欺骗/域名污染”
--> 本頁主題: 转载:扫盲 DNS 原理,兼谈“域名劫持”和“域名欺骗/域名污染” 字體大小 寬屏顯示 只看樓主 最新點評 熱門評論 時間順序
次次換床單


級別:精靈王 ( 12 )
發帖:2982
威望:311 點
金錢:268782424 USD
貢獻:60564 點
註冊:2015-08-10


转载:扫盲 DNS 原理,兼谈“域名劫持”和“域名欺骗/域名污染”




文章目录★DNS 是啥?有啥用?
★域名的结构是咋样滴?
★“域名解析”是咋实现滴?
★域名服务器如何知道这些信息?
★啥是“域名劫持”?
★谁有“域名劫持”的企图?
★如何对付“域名劫持”?
★啥是“域名污染”?
★谁有“域名污染”的企图?
★GFW 的两种“域名污染”
★咋对付“域名污染/域名欺骗”?
  前天下午(1月21日),咱们天朝发生了全国性的互联网故障,导致大量国内网站无法访问。这次故障说白了就是一次全国性大范围的域名污染。所以俺借此机会,给大伙儿扫盲一下 DNS 的常识。既然是扫盲 DNS,也顺带说说“域名劫持”和“域名污染”这两个很容易混淆的概念。提醒一下:这两者的其中之一是 GFW 的大杀器,爱翻墙的同学有必要了解。


★DNS 是啥?有啥用?

  如果你是技术菜鸟,在看这篇博文之前,确保你已经【看完】如下这篇:
计算机网络通讯的【系统性】扫盲——从“基本概念”到“OSI 模型”

  DNS 是洋文“Domain Name System”的缩写,直译过来就是“域名系统”。
  咱们每天打交道的这个互联网,其底层的基石是“IP”。IP 是“Internet Protocol”的缩写,中文就“互联网协议”(光看名字就知道这玩意儿很重要)。咱们日常用的那些互联网软件(浏览器、聊天工具、下载工具、等等)在工作时,必须依靠【IP 地址】才能进行网络数据传输。
  “IP 地址”是设计给软件用滴——虽然软件很容易处理,但对于人类而言,却很难记忆。于是,后来又发明了 DNS。有了 DNS,人类就不需要记住长长的一串 IP地址,而只需记住“域名”(域名通常更短,也更具有可读性)。
  比如你上网的时候,只需在地址栏输入网站的“域名”,而不用输入网站的“IP 地址”。然后电脑系统会利用 DNS 来把“域名”翻译成“IP地址”。这个翻译的过程术语叫“域名解析/DNS解析”。


★域名的结构是咋样滴?

  互联网上的域名按照【树形层次结构】来组织。不懂得啥是“树形结构”的同学,可以对照一下电脑硬盘上的目录结构。域名的结构和目录结构很类似,目录结构是用“斜杠”作分隔符,而域名是用小数点作分隔符。两者的主要区别在于:目录结构名称的形式是从【左到右】(上级在左,下级在右),而域名是从【右到左】(上级在右,下级在左)。
  以俺博客的域名为例:
program-think.blogspot.com 的上级域名是 .blogspot.com
.blogspot.com 的上级域名是 .com
这里的 .com 就被称为顶级域名(Top-Level Domain,简称 TLD),跟 .com 类似的那些 .net、.org、.gov 也都是顶级域名。还有那些以国家/地区的代码命名的(比如: .cn、.tw、.hk、.jp 等等)也是顶级域名。


★“域名解析”是咋实现滴?

  如果你曾经配置过电脑的网卡,应该记得上面除了有 IP 地址、掩码等设置,还有一项设置是“DNS 服务器/域名服务器”。这项设置就是用来帮助你的电脑进行域名解析的。你可以把这个“DNS 服务器”想象成114查号台。每当电脑需要翻译某个域名,就找这个域名服务器查询,然后域名服务器会告诉你的电脑,要查询的域名对应的IP地址是啥。

  下面简单说一下,你的电脑进行域名解析的过程。
  为了叙述方便,以俺博客为例。当你在浏览器的地址栏中输入 https://program-think.blogspot.com/,然后敲回车,这时候电脑软件会进行如下一系列事情。
1. 首先根据输入的网址,提取出域名(在本例中,也就是 program-think.blogspot.com)
2. 如果你在系统中配置了 Hosts 文件,那么电脑会先查询 Hosts 文件,看这个 program-think.blogspot.com 否已经在 Hosts 里面有了对应的记录。如果有,直接就可以拿到该记录中的 IP 地址,过程就结束了。
3. 如果 Hosts 里面没有这个别名,那么电脑会看你有没有设置域名服务器(DNS 服务器)。如果你的系统没有设置域名服务器,那电脑就没辙了,浏览器直接会报错,说网站的域名无法解析。过程就结束了。
4. 如果你设置过“域名服务器”,那么电脑会向这个域名服务器发送一个域名查询(DNS query)的请求,然后等候域名服务器的回应。
5. 如果域名服务器始终没有回应(比如域名服务器挂了,或域名服务器的 IP 填错了,或请求被 GFW 拦截了),那么电脑还是没辙(浏览器会报错)。
6. 如果域名服务器回应了,那么你的电脑就可以根据域名服务器的应答信息,得到该域名的 IP 地址。之后浏览器就会向这个 IP 地址对应的 Web 端口发送 HTTP 请求。

  通常情况下,电脑拿到的(DNS 服务器)应答信息是正确的——也就是说,应答中的 IP 地址确实对应那个域名——这种情况下,你的网络软件就可以正常工作了。
  但是在天朝这个奇葩的国家,电脑拿到的 DNS 应答有可能是【错的】。为啥会这样捏,本文的后半部,俺会介绍一下“域名劫持”和“域名污染”。


★域名服务器如何知道这些信息?

  (本小节的内容偏技术化,技术菜鸟请仔细理解)
  刚才介绍了“客户端域名解析”的过程。接下来说说域名服务器是如何得到这些信息的。

◇域名的缓存

  大伙儿平时使用的域名服务器,技术术语叫“递归域名服务器”。“递归服务器”是面向普通网友的。刚才介绍“域名解析”的时候提到的服务器就是“递归服务器”。
  “递归服务器”的内部通常会有一个“DNS 记录的缓存”——这个缓存是为了提高查询效率的。当某台电脑向递归服务器发起域名查询时,递归服务器首先看自己的缓存中有没有该域名的记录,如果有,直接就回复该记录给查询的电脑。
  万一对方想要查询的域名没找到,咋办捏?这时候就要进行缓存的同步。

◇缓存的同步

  下面就拿俺博客的域名为例,说说这种情况的处理流程。
1. 对方查询 program-think.blogspot.com 这个域名,“递归服务器”发现自己的缓存中没有
2. “递归服务器”会先去找“根域名服务器”帮忙,“根服务器”会告诉“递归服务器”说:这个域名属于 com 这个分支之下,你去找 com 这个域名的“权威服务器”,这个权威服务器的 IP 地址是 xxx。
3. 然后“递归服务器”根据拿到的这个 xxx地址,又去找“com 域名的权威服务器”。“com 域名的权威服务器”告诉它:你应该去找“blogspot.com 域名的权威服务器”,这个权威服务器的 IP 地址是 yyy
4. 然后“递归服务器”又屁颠屁颠地去找“blogspot.com 域名的权威服务器”。这时候“blogspot.com 域名的权威服务器”才会告诉它,program-think.blogspot.com 这个域名的 IP 地址到底是多少。
  大伙儿看到没有?整个过程如同“踢皮球”,效率是很低的。所以俺前面提到,“递归域名服务器”必须得有一个缓存,以此来优化效率(不用每次查询都来一次“踢皮球”)。

◇同步的周期

  说完了“域名的同步”,顺便提一下“同步的周期”。
  因为互联网上的域名信息是有可能发生变化的。比如增加了某个新域名,注销了某个旧域名,或者某个域名对应的 IP 地址变了。所以,“递归服务器”上保留的缓存中,每一条域名记录都有一个生命周期(可能是几分钟,也可能是几小时)。如果某条记录的生命周期过了,就会被删除,然后重新同步。


★啥是“域名劫持”?

  刚才说了,域名服务器上都会保存一大堆的域名记录(每条记录包含“域名”和“IP地址”)。当收到域名查询的时候,域名服务器会从这堆记录中找到对方想要的,然后回应给对方。
  如果域名服务器上的某条记录被【人为修改】了(改成错的),那么一旦要查询这条记录,得到的就是错误的结果。这种情况称之为“域名劫持”。


★谁有“域名劫持”的企图?

  “域名劫持”通常是电信运营商(ISP)干的好事儿。很多宽带用户用的域名服务器就是 ISP 提供给你的。而天朝的 ISP 也是很奇葩的——经常耍流氓。
  举例:
  前几年曾经出现过:某个 ISP 跟百度勾结,把谷歌的流量重定向到百度。具体搞法是:该 ISP 篡改自己的域名服务器的记录,把里面跟 google.com 相关的域名记录的 IP 地址修改为百度服务器的 IP 地址。如此一来,假设你用的是这个 ISP 的域名服务器,当你在浏览器输入 www.google.com 的时候,你的电脑查询到的 IP 地址其实是百度的 IP 地址,所以浏览器打开的是“百度”的主页。


★如何对付“域名劫持”?

  刚才说了,“域名劫持”的根源在于:域名服务器上的记录被人给改了。要对付这种耍流氓,最直接的办法就是不要使用这种流氓 ISP 提供的域名服务器,改用国外那些比较靠谱的。目前口碑最好的,大概是 Google 提供的两个域名服务器,IP 地址分别是 8.8.8.8 和 8.8.4.4 ——这俩不光是地址好记,更重要的是,不会耍流氓搞劫持。


★啥是“域名污染”?

  先提醒一下:“域名污染”这个词还有其它几个别名,分别是“域名欺骗”、“域名缓存投毒”(洋文叫:“DNS cache poisoning”)。今后看到这几个别名,要晓得是同一个意思。
  “域名污染”的原理,简单说来是这样滴:当你的电脑向域名服务器发送了“域名查询”的请求,然后域名服务器把回应发送给你的电脑,这里存在一个【时间差】。如果某个攻击者能够在域名服务器的“DNS 应答”还没有到达你的电脑之前,先伪造一个错误的“DNS 应答”发给你电脑。那么你的电脑收到的就是错误的信息,并得到一个错误的 IP 地址。


★谁有“域名污染”的企图?

  从技术上讲,只要攻击者能够位于“你”和“域名服务器”的传输线路中间,那么攻击者就有机会搞“域名污染”。能够做到这点的,可能是一个黑客/骇客,也可能是 ISP。不过这些都不是本节聊的重点。本节的重点是 GFW——它是最有资源搞域名污染的,同时也最有意愿搞域名污染的。在《如何翻墙?》这篇全面扫盲教程中,俺提到 GFW 最有名的三板斧,其中一板斧就是“域名污染”。
  举例:
  比如某个国外网站,长年累月地抹黑咱们伟大光荣正确的党国,搞得咱们的“伟光正”很没面子,很不爽。那么朝廷的“真理部”就会给 GFW 下达封杀令——要求 GFW 全面封锁某某网站。对于 GFW 而言,要全面封掉某个网站,最简单的一个办法就是直接污染该网站的域名。用了这招之后,那些不懂翻墙的网友只要是通过【域名的方式】访问该网站,他们的电脑进行 DNS 查询之后,多半会得到错误的结果(也就是说,查到的 IP 地址【是假的】);既然拿到假 IP,当然就无法打开这个网站的页面啦。


★GFW 的两种“域名污染”

  刚才俺解释了“域名污染”的原理,那种形式不妨称为“直接污染”。由于 GFW 的特殊性,它不但可以做到“直接污染”,还可以做到“间接污染”。而普通的骇客顶多只能做到“直接污染”,难以做到“大范围的间接污染”。
  那么这两种污染有啥区别捏?且听俺细细道来。

◇GFW 部署在哪?

  首先有必要先扫盲一下【GFW 的部署位置】。咱们天朝的互联网只有少数几个国际出口(名气较大的是:北京出口、上海出口、广州出口)。如果你要访问天朝之外的网站,你的网络数据流就必定会经过其中的某个“国际出口”。而天朝的【每一个】国际出口都部署了 GFW 的设备。
  说到 GFW 的设备,顺便插一句:
  GFW 是洋文“Great FireWall”的缩写。很多同学(包括很多懂技术的同学)都望文生义,【误以为】GFW 就是某种“防火墙”设备。其实不然!GFW 是基于 IDS打造滴(IDS 是“入侵监测系统”的缩写)。
  今后有空的话,俺再来聊聊 GFW 本身的技术细节。

◇GFW 的直接污染

  因为 GFW 部署在天朝的【国际出口】。如果你用的是【国外】的域名服务器,你的“DNS 请求”必定会经过国际出口;同样,域名服务器的“DNS 应答”必定也会经过国际出口才能到你的电脑。这一来一回就给 GFW 提供了耍流氓的机会。
  这种污染就是俺所说的“直接污染”。

◇GFW 的间接污染

  刚才介绍了:“使用【国外】的域名服务器会被直接污染”。那如果你用的是【国内】的域名服务器捏?就会被“间接污染”。过程如下:
1. 比方说你用的是中国电信的 DNS 服务器,然后你想要访问某个(被封杀的)反共网站。
2. 对于被封杀的网站,其网站服务器必定在国外,而且网站的域名肯定也不会使用 CN 之下的域名。所以,被封锁的网站,其上级域名的“权威域名服务器”肯定也是在国外。
3. 当你向“电信的 DNS 服务器”查询反共网站的域名,这台“电信的 DNS 服务器”就会去找这个反共网站的上一级域名对应的“权威域名服务器”去进行“域名查询”。
4. 因为是从国外进行域名查询,相关的数据流必定要经过国际出口。一旦经过国际出口,就会被 GFW 污染。
5. 如此一来,“电信的域名服务器”拿到的是已经被污染的域名记录(里面的 IP 是假的)。而且“电信的域名服务器”会把这条错误的记录保存在自己的域名缓存中。
6. 下次如果有另一个网友也找这台“电信的域名服务”查询这个反共网站,也会查到错误的结果。

   上述过程不断重复,最终会导致:全国所有的域名服务器,它们的缓存中只要是包含了那个反共网站的记录,记录中的“IP 地址”必定是错的(这个错误的“IP 地址”也就是 GFW 伪造的那个)。所以说“间接污染”是很牛逼滴——可以把错误的域名记录扩散到全国。
  刚才俺说了,“域名污染”也叫“域名缓存投毒”。“投毒”一词真的非常形象——就好象在某条河流的【源头】下毒,从而把整条河流的水都污染。在互联网时代搞“域名污染”是非常卑鄙下流的做法。因为 DNS 是互联网的基础设施,而“域名污染”直接破坏了互联网的基础设施。所以说,天朝是一个非常奇葩的国度;咱们面对的是一个做事情毫无底线的政府。


★咋对付“域名污染/域名欺骗”?

  这个话题有点大。因为有很多种招数可以对付“域名污染”。统统都写在这里,篇幅太长了。
  所以俺决定:抽空另写一篇教程,专门谈这个问题。敬请关注。

  后续更新:
  本文发布4年之后(2018),俺又写了另一篇教程《对比4种强化域名安全的协议——DNSSEC,DNSCrypt,DNS over TLS,DNS over HTTPS》。
  上述这篇教程介绍了4种【新的】域名协议,有助于对抗 GFW 这个流氓。


俺博客上,和本文相关的帖子(需翻墙)
计算机网络通讯的【系统性】扫盲——从“基本概念”到“OSI 模型”
对比4种强化域名安全的协议——DNSSEC,DNSCrypt,DNS over TLS,DNS over HTTPS
扫盲 HTTPS 和 SSL/TLS 协议》(系列)
多台电脑如何【共享】翻墙通道——兼谈【端口转发】的几种方法
如何让【不支持】代理的网络软件,通过代理进行联网(不同平台的 N 种方法)版权声明
本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者[url=mailto:program.think@gmail.com]编程随想[/url]和本文原始地址:
https://program-think.blogspot.com/2014/01/dns.html

赞(5)
TOP Posted:2021-04-30 17:29 樓主 引用 | 發表評論
法外狂徒李四


級別:風雲使者 ( 13 )
發帖:16714
威望:8587 點
金錢:415 USD
貢獻:27580 點
註冊:2020-10-24


好家伙,收藏吃灰系列
------------------------
L
TOP Posted:2021-04-30 18:21 #1樓 引用 | 點評
没有女人的夜


級別:禁止發言 ( 8 )
發帖:4491
威望:450 點
金錢:101 USD
貢獻:0 點
註冊:2018-05-20

感谢分享
------------------------
$
TOP Posted:2021-04-30 18:55 #2樓 引用 | 點評
震动棒


級別:騎士 ( 10 )
發帖:3817
威望:382 點
金錢:26 USD
貢獻:0 點
註冊:2020-02-08

感谢分享
TOP Posted:2021-04-30 21:01 #3樓 引用 | 點評
镇魂哥


級別:精靈王 ( 12 )
發帖:899
威望:218 點
金錢:186 USD
貢獻:41080 點
註冊:2018-06-17

1024
TOP Posted:2021-04-30 21:59 #4樓 引用 | 點評
阴阳调和


級別:騎士 ( 10 )
發帖:3831
威望:384 點
金錢:1 USD
貢獻:300 點
註冊:2020-09-12

感谢分享
TOP Posted:2021-04-30 22:33 #5樓 引用 | 點評
伤心牛B


級別:天使 ( 14 )
發帖:5212
威望:6068 點
金錢:2147483647 USD
貢獻:3600000 點
註冊:2011-06-06

感谢科普 网络基础
TOP Posted:2021-04-30 22:36 #6樓 引用 | 點評
iah0625


級別:精靈王 ( 12 )
發帖:12018
威望:1172 點
金錢:636984 USD
貢獻:0 點
註冊:2015-04-04

感谢分享
TOP Posted:2021-04-30 22:38 #7樓 引用 | 點評
贫僧夜探鸡窦


級別:俠客 ( 9 )
發帖:981
威望:104 點
金錢:464395787 USD
貢獻:1173 點
註冊:2015-09-24

内容精彩
TOP Posted:2021-05-01 06:28 #8樓 引用 | 點評
mashang


級別:聖騎士 ( 11 )
發帖:3018
威望:302 點
金錢:1 USD
貢獻:20253 點
註冊:2021-01-21

感谢作者的分享
TOP Posted:2021-05-01 06:29 #9樓 引用 | 點評
爱似秋枫叶


級別:騎士 ( 10 )
發帖:1945
威望:196 點
金錢:1379 USD
貢獻:5400 點
註冊:2020-03-05

感谢作者的技术分享
TOP Posted:2021-05-01 07:09 #10樓 引用 | 點評
思无涯


級別:新手上路 ( 8 )
發帖:267
威望:40 點
金錢:37 USD
貢獻:3 點
註冊:2021-03-09


我就想得知移动宽带浏览网站,打不开怎么解决?(别抬杠的说换网)
TOP Posted:2021-05-01 07:47 #11樓 引用 | 點評
龙狼蝶影


級別:聖騎士 ( 11 )
發帖:7474
威望:752 點
金錢:16750933 USD
貢獻:0 點
註冊:2015-05-12

感谢分享
TOP Posted:2021-05-01 07:54 #12樓 引用 | 點評
水清天蓝


級別:光明使者 ( 14 )
發帖:4748
威望:3706 點
金錢:1062065200 USD
貢獻:535555 點
註冊:2015-08-23

感谢分享
TOP Posted:2021-05-01 08:55 #13樓 引用 | 點評
米奇


級別:新手上路 ( 8 )
發帖:425
威望:43 點
金錢:5200425 USD
貢獻:0 點
註冊:2020-02-28

感谢分享
TOP Posted:2021-05-01 08:55 #14樓 引用 | 點評
只上青楼


級別:精靈王 ( 12 )
發帖:4863
威望:542 點
金錢:672 USD
貢獻:23461 點
註冊:2014-10-24

学习了
------------------------
y
TOP Posted:2021-05-01 09:14 #15樓 引用 | 點評
honus


級別:聖騎士 ( 11 )
發帖:7297
威望:730 點
金錢:1800262 USD
貢獻:1319 點
註冊:2020-08-05

很有意思
TOP Posted:2021-05-01 09:27 #16樓 引用 | 點評
thinkpad3320


級別:新手上路 ( 8 )
發帖:589
威望:59 點
金錢:206 USD
貢獻:21 點
註冊:2015-03-19


1024
TOP Posted:2021-05-01 10:05 #17樓 引用 | 點評
砂石比亚


級別:騎士 ( 10 )
發帖:3648
威望:365 點
金錢:3548 USD
貢獻:3138 點
註冊:2016-06-08

谢谢大佬分享
TOP Posted:2021-05-01 12:34 #18樓 引用 | 點評
青火


級別:騎士 ( 10 )
發帖:3562
威望:406 點
金錢:10686473 USD
貢獻:1 點
註冊:2014-10-08

感谢分享
TOP Posted:2021-05-01 12:55 #19樓 引用 | 點評
流水的木耳


級別:騎士 ( 10 )
發帖:2280
威望:363 點
金錢:11 USD
貢獻:0 點
註冊:2015-03-01

感谢分享,只懂得简单上网,这么复杂的还没涉及
TOP Posted:2021-05-01 12:57 #20樓 引用 | 點評
爱就现在


級別:聖騎士 ( 11 )
發帖:1909
威望:191 點
金錢:1000004 USD
貢獻:25100 點
註冊:2020-10-25

感谢分享
TOP Posted:2021-05-01 13:29 #21樓 引用 | 點評
装羊


級別:騎士 ( 10 )
發帖:4151
威望:377 點
金錢:4160 USD
貢獻:75 點
註冊:2011-06-06

感谢分享
TOP Posted:2021-05-01 14:03 #22樓 引用 | 點評
mashang


級別:聖騎士 ( 11 )
發帖:3018
威望:302 點
金錢:1 USD
貢獻:20253 點
註冊:2021-01-21


感谢作者的分享
TOP Posted:2021-05-01 14:56 #23樓 引用 | 點評
喝酒吃肉


級別:精靈王 ( 12 )
發帖:13767
威望:1222 點
金錢:2386888 USD
貢獻:0 點
註冊:2020-08-30

感谢分享
TOP Posted:2021-05-01 15:00 #24樓 引用 | 點評

.:. 草榴社區 -> 技術討論區

快速回帖 頂端
內容
HTML 代碼不可用

使用簽名
Wind Code自動轉換

按 Ctrl+Enter 直接提交