ichuan.net

自信打不死的心态活到老

【译】中国的 DNS 缓存污染(DNS cache poisoning)

本文翻译自:http://viewdns.info/research/dns-cache-poisoning-in-the-peoples-republic-of-china/

中国文学审查的历史长河延续到今天的表现形式就是互联网审查。在公元前 213 年,秦始皇为了防止人们将他与历代君主作比较而把几乎所有书籍都烧毁。两千年后,随着中国共产党的壮大,中国的审查制度又一次得到提升。

自从 1949 年掌权以来,中国共产党已经强制把数不尽的电影、书籍、报纸和电视节目销毁或者关闭。在与自己负面信息的长久作战中,中国推出了自己的一套审查方案,那就是公安部建造的“金盾工程”。这项工程旨在部署所谓的“中国防火长城”(Great Firewall of China,简称:GFW),它可被中国共产党用来控制中国国内的互联网使用。

为了达到审查目标,这个系统使用了几种不同的技术,最普遍的就是 DNS 缓存污染(DNS cache poisoning)。本文将介绍什么是 DNS 缓存污染以及它是如何被 GFW 实施的。

DNS 基础

首先,简单说下 DNS 是如何工作的。当你在浏览器里输入一个域名时,你的电脑需要确定这个域名对应的 IP 地址,以便知道从哪里取网页。

当要确定 IP 地址时,系统首先会去查该信息是否在一个本地 DNS 缓存里,不在的话会向你机器配置的 DNS 服务器去取 IP 信息。这些 DNS 服务器会进行一系列查询,首先去查根域名服务器,其次去查域名后缀(例如 .com)的父域名服务器,最后去查该域名的权威域名服务器。

一旦域名服务器从权威域名服务器那里取到了 IP 地址,大部分情况下它会在把结果返回给你的电脑之前先把它缓存起来(以便下次查询不用再去权威域名服务器去查),你可以使用这个工具看看返回的是什么数据。

下面是一个域名查询示例:

  1. 你在你浏览器里输入 google.com
  2. 你的电脑在缓存里找不到这个域名对应的 IP 地址,因此会去机器配置的 DNS 服务器(可能是你的 ISP 提供的)查询 google.com 的 IP 地址
  3. DNS 服务器查询根域名服务器,然后请求被重定向至 .com 顶级域名的服务器,最后被重定向至 Google 的域名服务器
  4. Google 的域名服务器返回该域名对应的 IP 地址(例如:74.125.237.80)
  5. 其余的 DNS 服务器将缓存该结果,并把它返回给你的电脑
  6. 你的电脑然后会去连接查询到的 IP 地址(例如:74.125.237.80)并且请求 google.com 的网页

什么是 DNS 缓存污染

DNS 缓存污染指的是从权威域名服务器返回的 IP 地址在传递给最终用户的过程中被篡改了。由于查询结果要返回给最终用户需要经过很多系统,有很多地方都是可以篡改结果内容的,例如一台在你 ISP 范围内被动了手脚的路由器,一个通道中透明的 DNS 服务器,甚至可能是最终用户电脑上的病毒或木马。

还是上面的例子,加入 DNS 污染以后的情况是:

  1. 你在你浏览器里输入 google.com
  2. 你的电脑在缓存里找不到这个域名对应的 IP 地址,因此会去机器配置的 DNS 服务器(可能是你的 ISP 提供的)查询 google.com 的 IP 地址
  3. DNS 服务器查询根域名服务器,然后请求被重定向至 .com 顶级域名的服务器,最后被重定向至 Google 的域名服务器
  4. Google 的域名服务器返回该域名对应的 IP 地址(例如:74.125.237.80)
  5. 其余的 DNS 服务器将缓存该结果,并且尝试把它返回给你的电脑
  6. 这个结果要传送到你的电脑需要经过很多系统,例如路由器、服务器。本例中,其中一台服务器被配置成会“污染”任何匹配 google.com 的结果,因此由它传递回来的结果会是另一个 IP 地址(例如:123.123.123.123)
  7. 你的电脑然后会去连接查询到的 IP 地址(123.123.123.123)并且请求 google.com 的网页。因为该地址和域名对不上,可能会出现两种情况:一是该地址没有返回任何内容,二是载入的会是另一个站点的内容。

DNS 缓存污染还可能返回正规的(有争议)内容,例如 ISP 的一个域名搜索页面。如果你曾经输错了域名而进入了 ISP 的标准错误界面,没错,那就是 DNS 缓存污染。

中国的 DNS 缓存污染

由公安部运营的 GFW 有能力基于关键词操作进出整个国家的 DNS 响应包。这是有可能的,因为中国共产党操纵着中国国内所有的国际级别的路由器。一旦一个 DNS 响应包被某个关键词匹配到,用户收到的将是被修改后的 DNS 结果。

让我们来看看一个被中国屏蔽了的域名——facebook.com。如果我们在美国境内查询下这个域名,返回的将是一下结果:

facebook.com    3600    IN  A   69.63.189.11
facebook.com    3600    IN  A   69.63.189.16
facebook.com    3600    IN  A   69.63.181.12

如果我们在中国境内查询下这个域名,会看到返回的是其他 IP 地址:

Beijing             159.106.121.75
Shenzen             78.16.49.15
Inner Mongolia      159.106.121.75
Heilongjiang Province   78.16.49.15
Yunnan Province     159.106.121.75

每次查询的结果都不一样。

我们可以验证 DNS 污染是基于关键词匹配的。首先,我们在美国用 dig 查询下 facebook.com.notarealdomain 域名的 IP 地址。正确的返回结果里状态字段是 NXDOMAIN,表示这个域名不存在。见下图:

enter image description here

如果我们在中国境内执行相同查询,得到的是下图:

enter image description here

注意看,我们收到的不是 NXDOMAIN 响应,而是一个包含被污染 IP 的“正确”(NOERROR)结果。

多次执行这个查询,我们可以得到一些 IP 地址,这些都是被污染的结果。下面是其中一些 IP 的地理位置及拥有者:

IP Address      Location    Owner
8.7.198.45      United States   ARIN
37.61.54.158    Europe      European Regional Registry
46.82.174.68    Germany     Deutsche Telecom
78.16.49.15     Ireland     Esat Telecommunications Limited
93.46.8.89      Italy       Fastweb
159.106.121.75  United States   DoD Network Information Center
203.98.7.65     New Zealand Telstra Clear

有意思的是,上面这些 IP 地址没有一个在中国政府的控制之下。为什么 GFW 使用的 IP 地址都不属于中国政府呢?为什么有个 IP 居然是美国国防部信息中心的?

另外一个有意思的现象是,如果你在 IP 反向查询工具里输入这些 IP,比如 8.7.198.45,得到的是下面的结果:

0513js.com  2011-09-08
0514y.com   2011-09-08
119xxx.com  2011-07-12
1688888sf.com   2011-09-08
175175.com  2011-09-08
41xxx.com   2011-09-07
48888sf.com 2011-09-07
567888sf.com    2011-07-12
61xxx.com   2011-05-20
776488.com  2011-09-10
86888sf.com 2011-09-07
91888sf.com 2011-09-07

很明显,一个被 GFW 屏蔽的关键词就是 xxx.com。任何包含这个关键词的域名都会被自动 DNS 污染。有意思的是,xxx.net 居然不是一个关键词。

被屏蔽的关键词有:

  • twitter.com
  • xxx.com
  • 888sf.com
  • pk999.com

在中国国内访问含以上任何关键词的域名都会被 DNS 污染。第一个关键词可以理解,Twitter N年前就被中国屏蔽了,但最后两个关键词令人费解。

感谢中国防火墙测试工具、IP 反向查询工具和 DNS 查询工具,我们得以对 GFW 的工作原理有个细致的了解。

译后记

GFW 有一项直接封禁 IP 的策略,DNS 污染返回的诡异 IP 就是被封禁过的,所以会造成 Twitter 等域名无法用浏览器打开(连接超时),给人以该网站无法连接(当掉)的假象。

nginx 配置技巧

这段时间因为折腾 VPS,学习了下 nginx 的配置。下面分享一些我觉得有用的配置,更多的配置参见 nginx 配置手册

不让以 IP 形式访问

一个 IP 下可能同时挂了好多站,别人直接用 IP 访问不定会访问到哪个站,还容易被人发现这个 IP 下挂了某些站。下面这个配置就是让用 IP 访问的人重定向到一个错误页面(下面是 google 404 页面):

server {
    listen 80 default_server;
    add_header Location http://www.google.com/404.html;
    return 301;
}

上例中 default_server 指的是如果没有找到对应域名的网站时用这个配置,用 IP 访问就属于这一种了。

让 www 域名跳转到主站

域名贵在短小,加上 www 访问简直就像乔布斯费尽心思降低 0.5mm 厚度的 iPhone 到中国后被贴上个 5mm 的屏幕膜一样。下面例子是如果访问 http://www.ichuan.net/a/b 会被重定向到 http://ichuan.net/a/b

if ($host = 'www.ichuan.net'){
    rewrite  ^/(.*)$  http://ichuan.net/$1  permanent;
}

媒体文件加缓存头

这个是从 nginx 官网找的代码,很方便:

if ($request_filename ~* \.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|mov)$){
    access_log   off;
    expires      30d;
}

意思是对这些后缀的文件,不记录访问日志,并让浏览器缓存 30 天。

aliasroot 的区别

这个一般用在 location 字段。假如是 location ^~ /static/ ,浏览器请求 /static/css/screen.css 时,如果你 location 里面写的是 alias /var/www/static/;,则 nginx 会去找 /var/www/static/css/screen.css 文件发给浏览器;但如果你写的是 root /var/www/static/;,nginx 则会去找 /var/www/static/static/css/screen.css 文件,也就是说 root 找文件时是不会忽略 location 后面的路径的。

先列这几个,以后有新的了再更新。

域名的NS记录

一直以来不是很了解域名的 NS 记录。最近接触了一些域名服务器相关的东西,现在总算理解了。

我们购买域名后,就拥有了对该域名的所有权,具体说就是修改该域名的 NS 记录的权利。为什么这么说呢?先看看维基上一个例子,当别人查询 zh.wikipedia.org 的相关信息(A记录、CNAME记录等)时:

  • 客户端发送查询报文 query zh.wikipedia.org 至DNS服务器,DNS服务器首先检查自身缓存,如果存在记录则直接返回结果。
  • 如果记录老化或不存在,则
    1. DNS服务器向根域名服务器发送查询报文 query zh.wikipedia.org,根域名服务器返回 .org 域的权威域名服务器地址。
    2. DNS服务器向 .org 域的权威域名服务器发送查询报文"query zh.wikipedia.org",得到 .wikipedia.org 域的权威域名服务器地址。
    3. DNS服务器向 .wikipedia.org 域的权威域名服务器发送查询报文 query zh.wikipedia.org,得到主机 zh 的A记录,存入自身缓存并返回给客户端。

比如你买的是 a.com 这个域名,别人查询时最终会查到 a.com 这一层,你域名的 NS 记录就是 a.com权威域名服务器。别人最终会去 a.com 关联的 NS 服务器上查 a.com 的A记录、CNAME记录、NS记录等等。拥有 a.comNS 记录的修改权就等于拥有了 a.com 的所有权。

因为最终还是会去 NS 记录对应的域名服务器上去查询,所以如果你的域名 NS 是国外的域名服务器(比如 godaddy 默认的),国内用户第一次访问你网站会比较慢,因为花了很多时间在DNS递归和迭代查询上。如果你的用户大部分是国内的,把 NS 记录改为国内一个域名服务器(比如 DNSPodDNS.la),访问会比较快。

P.S. 今天和小虎、老杨去人大游泳了。回来时路上发现一个车的车牌巨牛逼。老杨描述说是“太2了”:

enter image description here