GFW原理和封锁技术

image-20240227192354264

一、简介

计算机的防火墙,和物理意义上的墙并不一样,物理上的墙建立以后,那就既进不来,也出不去了。而计算机的墙,则是可以对两个方向进行控制。

其实我们今天所说的计算机防火墙,大致有两种,一种是对内的,一种是对外的。

传统意义上的防火墙,一般是用来防止外部访问的,当然,你也可以设置禁止访问某些IP或者网站,禁止内部访问。

简而言之,GFW对网络内容的过滤和分析是双向的,GFW不仅针对国内读者访问中国境外的网站进行干扰,也干扰国外读者访问主机在中国大陆的网站。

我们使用计算机的时候,会开放很多端口,比如22,139,3389等等,而作为非开发者的用户,往往用不到这些端口。 再考虑到使用这些端口的程序有的时候是有漏洞的,开放了容易被攻击,所以干脆打开防火墙封闭了就好。 这就好比你日常宅在家,并不需要出门,就把锁孔都堵死来保证安全一样。

而我们今天讨论的主角,主要的功能不是阻止别人进来(入侵),而是阻止你出去的。 你访问不了Google/Youtube/Facebook/LINE/Twitter/。。。的根本原因: 防火长城,GreatFireWall,简称GFW。

每当谈起互联网的历史,都会有一种恍如隔世的感觉,当年上网大部分的网站并不需要注册,博客随便看,甚至可以匿名评论。就算要注册,有个邮箱就够了,不需要实名制(实名制在今天的体现是大部分网站注册都要手机号)。大家在网上大体友善的讨论,无私的分享,自由的交谈。几乎所有的网站不需要VPN即可访问。搜索引擎就管搜索,聊天软件也只聊天,没有那么多弹窗和流氓软件。那是互联网的田园时代。

和之前的互不联网公司是如何恶心用户的(持续更新)一样,老网虫应该都对这些事情有一些印象,而00后乃至10后可能并不知道这些黑历史。 不论是寿司之神,还是其他顶级的厨师都说过,要想成为好的厨师,首先要吃得出什么是美食。最近辗转反侧,我觉得有必要把这些内容写出来,让人看见,哪怕只是一两个人,告诉大家互联网原来应该是什么样子的,今天为什么是这个样子。

二、墙的历史

1987年,中国发出了第一封电子邮件:“Across the Great Wall, we can reach every corner in the world”(越过长城,走向世界每个角落)。从那一年开始,我们用互联网和这个世界联系在一起了,但是就在12年后,那个越不过去长城,回来了。

1998年,为了防止大家访问部分网站,针对IP和DNS的污染,开始了。伴随着污染,墙和梯的较量正式开始。 早期的GFW不能称之为墙,更像是一个补丁,只是单纯的污染DNS,那么我们修改DNS服务器就可以绕过去。 加上国内的DNS也流氓,所以大家大多会把DNS改成Google提供的 8.8.8.8/8.8.4.4

这样幼稚的屏蔽方式,政府也知道是不行的,于是,真正的GFW正式登上历史舞台。

除了屏蔽特定的IP或者域名之类,GFW还会审查流量内容,因为当时大部分的网站都没有用HTTPS进行加密,所以流量是非常透明的,审查起来很容易。 当然,也会对URL进行审查,有一段时间Google无法访问,就是因为URL里面又一个叫gs_rfai的参数,其中“rfa”字样,与在大陆被封锁的自由亚洲电台的网址和英文缩写巧合而被GFW屏蔽。 近几年HTTPS普及了,针对内容审查手段也就慢慢失效了。

墙的其它升级就简单的多了,主要就是两个任务:

  1. 针对IP、域名列表的扩充,扩大黑名单范围;
  2. 对新增的翻墙工具的封堵。

这些是功能上的升级,性能上也在升级,据传说16年,GFW就拥有100多台小型机做的集群了(而且,各地的GFW似乎也没能完美的同步(也可能是故意的),大致是以省为单位,有的时候会出现某个网站只能被某些省访问的情况出现)。

举些升级的例子:

  • 比如你用HTTP/SOCKS代理翻墙,那我就检测代理的流量特征(于是HTTP/SOCKS代理,卒……)。
  • 你用SSH翻墙,我就检测你的流量特征,分析你到底是在执行命令,传输文件还是在打隧道翻墙
    • 但是SSH隧道目前仍然可用,技术角度说,完全区分SSH/SFTP和翻墙流量还是有难度的
  • 你用GoAgent翻墙,那我就屏蔽Google的所有IP。
  • 你用PPTP翻墙,那我就检测PPTP的协议,直接杀。
  • OpenVPN也遭遇了PPTP同样的待遇。
  • 但是AnyConnect没有,因为很多外企在使用它连接公司内网。
  • Shadowsocks也差点遭受和各大VPN一样的待遇,但是因为SS的流量实在难以识别,所以当时(大约2015年)解决的方式更加粗暴:请Shadowsocks的作者喝茶。详细看下图:

spaces_-M6TU8XK0hd3CZdz_gQ__uploads_git-blob-72b69bd1787e99358c1ef8cc4e4ea646a973ef17_2020-08-09-17-49-53

  • 后来(大约2020年前)Shadowsocks还是被识别了,参见这个报告
  • 目前最强大的工具应该是V2Ray,除了支持的协议多,其中的VMess协议对计算机时钟的要求让这个系统可以抵御一定的流量重放攻击。
  • 最近大家开始用Vultr/Linode搭建服务器……这个的确不好管,但是重要节假日(每年0110月/0100日前后,国庆,两会)就批量屏蔽这些IP。
  • GFW不仅防止国内用户访问国外主机,有的时候还会禁止一些境外IP访问国内的主机,这样可以屏蔽部分使用内网穿透技术的人。

三、今天我们怎么翻墙

  1. HTTPS代理,TLS给HTTP代理穿上了铠甲,使之又能再战500年。但是考虑到GFW会主动刺探,所以最好将代理的endpoint隐藏在正常网站的某个子路径下。
  2. SSH隧道,SSH采用非对称加密,再加上有广泛的正常用途(管理服务器)所以目前SSH隧道还是可用的。
  3. Shadowsocks/V2Ray/GoProxy 其实可以理解为对你的代理流量进行加密和混淆的工具,但是GFW在慢慢尝试识别这些流量。
    • 需要特别说明一下的是,GoProxy比较特殊,支持内网穿透。
  4. AnyConnect等商用方案。

除此之外,还有内网穿透等一系列骚操作 当然,这一系列教程不能说翻墙,也不能说科学上网,要说连接公司内网,本质上,在公司外部管理公司内网和翻墙的技术基本一致,但是会多一些诸如混淆之类的不必要操作。然后本文章不会传播翻墙具体教学等,只作为技术分析,私自搭建梯子在国内是违法的,我也不想被请喝茶。

四、我对墙的记忆

事实上,我个人没有经历过只有DNS污染这个阶段,我第一次感受到墙的威力,是谷歌退出中国。

山雨欲来风满楼,事实上,早在2007~2009年,就开始出现一些Google搜索的负面新闻:

据了解,今年1月和4月,“谷歌中国”网站因存在大量淫秽色情和低俗链接,曾两次被互联网违法和不良信息举报中心公开曝光。近期,举报中心又接到公众举报,经核查发现,“谷歌中国”网站仍然存在大量淫秽色情和低俗信息,包括大量极其低级、丑陋的色情图片、视频和文字。 举报中心有关负责人表示,“谷歌中国”网站未按照我国法律法规的要求做好淫秽色情内容的过滤工作,大量境外互联网上的淫秽色情信息通过该网站传播到我境内,严重违反了《全国人大常委会关于维护互联网安全的决定》和国务院《互联网信息服务管理办法》等法律法规,以及有关行业自律规范,严重侵害青少年身心健康,损害公众利益。 举报中心在强烈谴责“谷歌中国”网站的同时,还建议相关执法部门依法处罚,并希望广大网民继续予以监督。

那么这些色情联想是什么呢:

spaces_-M6TU8XK0hd3CZdz_gQ__uploads_git-blob-b9c84c815b622d8724888d03dd7d890ec04e895d_2020-08-09-17-58-58

但是后来有人发现,这些词以前都没人搜索,是在新闻播出的前些天才有人搜索,搜索量还全部来自于北京。

spaces_-M6TU8XK0hd3CZdz_gQ__uploads_git-blob-7083e12385f36bcac03b5b9ba03323437e96d3fc_2020-08-09-18-03-58

我只能说,你们北京人好BT……当时的说法是,这个事情是百度策划的,的确,深入理解搜索引擎,并且能做出有效的内容攻击,怎么看都不像电视台那帮子文科生能做出来的事情。 只可惜Google的日志留的太全了,被发现了。

很多人说Google退出中国是因为不接受审查,这个是错误的,事实上,Google不是没有配合中国审查,也不只有中国要求Google进行审查。

10年就有人提问,为啥温度计和胡萝卜都不能搜索了(参见这里)

但是按照规则配合审查是不够的,因为根本就没有什么规则,政府对谷歌(当然对其它所有互联网公司都一样)的要求是自我审查。一般来说,还需要配合网信办等神秘机构做一些舆论引导:

spaces_-M6TU8XK0hd3CZdz_gQ__uploads_git-blob-4d4d5915afb24c0ff1c31425f1528048c68fe921_2020-08-10-21-50-08

这些舆论引导并不合符合政府一般的办事流程,比如发红头文件,通知,办法之类的。 往往就是个微信消息或者邮件,乃至一个电话,但是不设立专门的部门应对这种不规范的办事方式,公司可能就开不下去。

大致流程就是,你的网站的内容,你自己看着办,我这里只给出精神和模糊的指导意见,但是如果我(政府部门)觉得你内容有问题,那就先约谈,让你再自己琢磨琢磨哪里做错了,要是还是不满意, 我就封鲨你:

spaces_-M6TU8XK0hd3CZdz_gQ__uploads_git-blob-436f8465936f7e6977839b155efc0cad7beff8af_2020-08-09-18-04-52

简而言之就是:

spaces_-M6TU8XK0hd3CZdz_gQ__uploads_git-blob-d2afe0d28e529e0df02ac3b710c396a0a2dfd39c_2020-08-09-17-34-38

2010年,Google与政府彻底谈崩了,但是还没等Google关闭服务,首先就遭到了DNS污染,这个时候大家通过修改hosts文件还是可以上Google的,那个时候往上大多流传着好多hosts文件的版本。 后来Google就把google.cn做成了静态页面,指向Google香港,但是随着事态恶化,先是用香港Google搜索国家领导人的时候会自动断开,后来香港的Google也很快不能用了。

就是从这里开始,我感受到了墙,也就是从这里开始,百度的搜索质量开始下跌,广告越来越多,越来越隐蔽,广告质量也下降,出现很多虚假广告,比如莆田系的医院。这些都是后话了。

详情可以参考这篇文章,写的相对翔实。

以及这一篇:深度调查 | 为什么我们不能访问谷歌?(长文慎入) 写的有理有力,调查清晰,证据翔实,部分稍微有些小错误,但是长文难免有纰漏,瑕不掩瑜,我认为值得一读。

五、墙的设计者

说到墙,不得不讨论一下墙的设计者:方滨兴教授,这个人在中文互联网可谓是臭名昭著。 2011年,方滨兴出现在武汉大学,被学生用鞋子和鸡蛋砸。 同年,方滨兴接受采访的时候说,自己电脑上装了6个VPN。 2013年,方滨兴在微博上发了一条拜年微博,转发评论万余次,大多都是“滚”,评论后被和谐,并被水军洗地。 同年,方滨兴说因为身体原因不再担任北邮校长职务,大家在网络上表示:“祝病魔早日战胜校长”。 搜索引擎上搜索方滨兴,有的时候会联想出来“方滨兴死了吗”。 2016年,方滨兴以杰出校友身份,回到其母校哈尔滨工业大学做题为《定义网络空间安全》的报告。报告中,他试图以韩国政府也架设网络防火墙来论证中国架设网络防火墙的必要性。但由于论证其观点的韩国网页被防火墙阻挡,无法登录,方滨兴只能在众目睽睽之下连接VPN绕过大陆的网络防火墙继续演讲。但连接VPN后,1分钟之内便断线2次,只得用Google搜索网页截屏。由于场面尴尬,报告结束后没有安排任何提问环节。

详细内容可参见Wiki

对于这个人,我只认可他的一句话:中国防火墙与虚拟专用网VPN之间是场“永恒的战争”。

六、GFW是怎么拦住我们的?

1 关键字过滤阻断

关键字过滤系统。此系统能够从出口网关收集分析信息,过滤、嗅探指定的关键字。主要针对HTTP的默认端口:80端口,因为HTTP传播的内容是明文的内容,没有经过加密,而GFW是一个IDS(Intrusion detection system)。普通的关键词如果出现在HTTP请求报文的头部(如“Host: www.youtube.com”)时,则会马上伪装成对方向连接两端的计算机发送RST包干扰两者正常的TCP连接,进而使请求的内容无法继续查看。如果GFW在数据流中发现了特殊的内文关键词(如轮子,达赖等)时,其也会试图打断当前的连接,从而有时会出现网页开启一部分后突然停止的情况。在任何阻断发生后,一般在随后的90秒内同一IP地址均无法浏览对应IP地址相同端口上的内容。

2 IP地址封锁

IP地址封锁是GFW通过路由器来控制的,在通往国外的最后一个网关上加上一条伪造的路由规则,导致通往某些被屏蔽的网站的所有IP数据包无法到达。路由器的正常工作方式是学习别的路由器广播的路由规则,遇到符合已知的IP转发规则的数据包,则按已经规则发送,遇到未知规则IP的数据,则转发到上一级网关。

而GFW对于境外(中国大陆以外)的XX网站会采取独立IP封锁技术。然而部分XX网站使用的是由虚拟主机服务提供商提供的多域名、单(同)IP的主机托管服务,这就会造成了封禁某个IP地址,就会造成所有使用该服务提供商服务的其它使用相同IP地址服务器的网站用户一同遭殃,就算是正常的网站,也不能幸免。其中的内容可能并无不当之处,但也不能在中国大陆正常访问。现在GFW通常会将包含XX信息的网站或网页的URL加入关键字过滤系统,并可以防止民众透过普通海外HTTP代理服务器进行访问。

3 特定端口封锁

GFW会丢弃特定IP地址上特定端口的所有数据包,使该IP地址上服务器的部分功能(如SSH的22、VPN的1723或SSL的443端口等)无法在中国大陆境内正常使用。

在中国移动、中国联通等部分ISP(手机IP段),所有的PPTP类型的VPN都被封锁。

2011年3月起,GFW开始对Google部分服务器的IP地址实施自动封锁(按时间段)某些端口,按时段对www.google.com(用户登录所有Google服务时需此域名加密验证)和mail.google.com的几十个IP地址的443端口实施自动封锁,具体是每10或15分钟可以连通,接着断开,10或15分钟后再连通,再断开,如此循环,令中国大陆用户和Google主机之间的连接出现间歇性中断,使其各项服务出现问题。GFW这样的封锁手法很高明,因为Gmail并非被完全阻断,这令问题看上去好像出自Google本身。这就是你们认为Google抽风的原因。

4 SSL连接阻断

GFW会阻断特定网站的SSL加密连接,方法是通过伪装成对方向连接两端的计算机发送RST包(RESET)干扰两者间正常的TCP连接,进而打断与特定IP地址之间的SSL(HTTPS,443端口)握手(如Gmail、Google文件、Google网上论坛等的SSL加密连接),从而导致SSL连接失败。

当然由于SSL本身的特点,这并不意味着与网站传输的内容可被破译。

5 DNS劫持和污染

GFW主要采用DNS劫持和污染技术,使用Cisco提供的IDS系统来进行域名劫持,防止访问被过滤的网站,2002年Google被封锁期间其域名就被劫持到百度。中国部分ISP也会通过此技术插入广告。

对于含有多个IP地址或经常变更IP地址逃避封锁的域名,GFW通常会使用此方法进行封锁。具体方法是当用户向DNS服务器提交域名请求时,DNS返回虚假(或不解析)的IP地址。

全球一共有13组根域名服务器(Root Server),目前中国大陆有F、I这2个根域DNS镜像,但现在均已因为多次DNS污染外国网络,而被断开与国际互联网的连接。

DNS劫持和污染是针对某些网站的最严重的干扰。

干扰的方式有两种:

一种是通过网络服务提供商(Internet Service Provider)提供的DNS服务器进行DNS欺骗,当人们访问某个网站时,需要要把域名转换为一个IP地址,DNS服务器负责将域名转换为IP地址,中国大陆的ISP接受通信管理局的屏蔽网站的指令后在DNS服务器里加入某些特定域名的虚假记录,当使用此DNS服务器的网络用户访问此特定网站时,DNS服务便给出虚假的IP地址,导致访问网站失败,甚至返回ISP运营商提供的出错页面和广告页面。

另一种是GFW在DNS查询使用的UDP的53端口上根据blacklist进行过滤,遇到通往国外的使用UDP53端口进行查询的DNS请求,就返回一个虚假的IP地址。

6 加密连接的干扰

加密连接不总是加密的,公钥还是明文的,所以 GFW 就能识别出特定服务的证书。然后在遇到 “黑名单” 加密连接时,它会发送RST数据包,干扰双方正常的 TCP 连接,进而切断加密连接的握手。
即使 GWF 有这么多阴招,我们还是有办法的,本文主要也是说这个的。

文章引用:

about-firewall/中国网络防火长城简史.md at main · yzxsblog/about-firewall (github.com)

fq-book/docs/abc/gfw.md at master · hoochanlon/fq-book (github.com)