工控网络基础入门篇之敏感词过滤

我们平常浏览网页所用的协议叫做 HTTP 协议,基本上你在每个网页的开头都可以看到 “http://” 的字 样。HTTP 协议本身是一个比 TCP,UDP 更高一层的 (更贴近用户) 的应用层协议,但上层协议最终都是 要以封包后以更底层传输层的方式进行传输。例如 DNS 协议是用 UDP 协议传输,HTTP 协议使用的就是 TCP 协议。 

我们说 TCP 相对 UDP 来说是更为安全的,但这只是相对的,TCP 数据依然是可以被中间人修改的。 最简单的例子,就是你们可能用过的一些屏蔽优酷,土豆视频广告的插件和脚本,这些东西的原理就是 拦截并修改 HTTP 数据流,将涉及广告的部分代码进行替换。

这说明了两点,TCP 协议的内容是可以被 感知和识别的 (比如找到广告代码的部分),也是可以被修改的 (替换成无广告的代码)。虽然 TCP 协议不 会像 UDP 那么容易让第三方伪造和修改数据,但肯定位于你和境外服务器中间的 GFW 还是可以做到的, 没见过圣旨的情况下伪造圣旨有困难,可是让传旨太监拿着现成的圣旨改个字还是很容易的。

HTTP 连接的建立,有一个著名的三次握手过程: 客户端先向服务器发出连接请求,服务器返回一个 连接许可,客户端再发起连接确认。如果 GFW 检测到你要访问的某个地址中包含了敏感信息 (域名本身 可能就是敏感信息),他就修改或冒充服务器返回的连接许可,告诉你服务器拒绝连接,这样客户端就会 自己放弃连接,你们平常上网经常看到的大部分 “网络连接被重置” 就是这个的结果,当然,少数情况下 可能服务器真的出问题也会拒绝连接。 

你也许会问我们能不能忽略这个重置 (RST) 消息? 当然可以,可是 GFW 比你想得更多,他不光发送 RST 给你,还发送 RST 给服务器,这样服务器也会认为你已经断开连接了,就不再发送数据给你了。 

GFW 这种做法的优势很明显: 不需要对完整的 HTTP 页面数据进行检测,只要发现 URL(网页地址) 中有敏感信息,就直接断开了你和服务器之间的连接,大大减轻了他自己系统的负担。但这种做法的缺 点也很明显,检测力度太弱了。你输入一些敏感主站域名一般都是连接被重置,但只要找个其他的 IP 替代域名,一点问题都没有,因为 GFW 对这 些网站检测的敏感信息仅仅是 URL 中的域名,在你把域名替换为不敏感的 IP 之后,你就可以直接查看页面了。 

但不是说 GFW 对敏感信息的检测仅限于域名,对于一些数据量很大,内容庞杂的网站,GFW 的 URL 检测会精确到页面。例如你在 wikipedia 上查 “种猪饲养技术”,绝对不会阻拦你,可是如果你要查一些敏感词,那 90 秒内你就别想访问 wikipedia 了。 

我们也经常碰到另一种情况,就是某些网站使用的是 HTTPS 协议,似乎在使用这些网站的时候我们 从来不会碰到页面连接被重置的问题,这是为什么呢? 这是因为 HTTPS 采用了公钥 + 私钥9 加密技术,数 据在封包成 TCP 包之前就已经被加密过,敏感的信息被加密之后就是一堆无法解读的乱码,这些信息对 于 GFW 来说是无法解读的,或者说解读成本是巨大的,这就使得我们一直也没有看到哪个 HTTPS 页面被 GFW 连接重置。