Internet网络浏览的监听、拦截和过滤-浅析GFW原理

一月 2, 2010 by Hans Adreaman

我国网络界“和”风劲吹,GFW威力无边,网民不断抱怨网站被“墙”,这固然是制度、利益等政策性原因导致的,我们这里就不多言政治了,仅仅对相关技术问题探究一二。

据我所知,网络浏览的拦截无外乎下列三个方式:IP过滤、内容过滤和DNS劫持。这些过滤的前提就是浏览者“浏览”动作的相关IP报文均能被拦截者截获和分析。这一前提对于ISP来说是天然成立的。

先简单介绍一下一次浏览网页的技术流程。用户在终端上使用浏览器(IE、Firefox等)向网页服务器(例如IIS、Apache等等)发出一个HTTP协议的请求报文(一般是一个HTTP的GET或POST请求),这个请求报文中指明了浏览器想要获取的网页内容,网页服务器收到这个请求后把相应访问结果以HTTP响应的方式发回给浏览器(例如状态码200表示成功,404表示网页不存在,等等类似的一系列状态),而且如果是可正常处理的访问请求,就把用户请求的网页内容(一般就是HTML字符串)发送回用户的浏览器,浏览器收到之后,将HTML字符码解释后以网页的形式呈现在用户面前。当然,这一系列HTTP协议的交互是以TCP连接为通道通信的,TCP连接的建立和维护是这一切的基础和前提。

假如用户终端和网页服务器的TCP连接通道之间存在防火墙等类似的设备,这些设备就可以截获这个TCP连接的建立,乃至其上承载的HTTP交互动作,用户和服务器之间的任何HTTP通信都没有秘密可言,防火墙可以决定整个浏览过程的各个方面。

一、IP过滤(封IP)

拦截者(防火墙)截获了浏览者的HTTP请求,发现浏览器请求的网站的IP是“非法”、应该被禁止访问的,就可以直接丢弃掉(这样网页服务器就不能收到)这个请求,然后防火墙再分别把浏览器和网页服务器之前建立的TCP连接断开(可通过TCP的RST报文实现,实际上,TCP连接的建立也是在防火墙的监管下进行的)。对用户的每次请求都进行这样的处理,这样一来,搭建在这个IP地址上的网页服务器的所有网页就都无法访问到了。

二、内容过滤

网页服务器收到浏览器的请求后,会将自己的服务内容(网页内容)发回给浏览器,这时,位于浏览者和网页服务器之间的防火墙截获这一内容(一堆字符串),一旦发现这些内容有“非法”信息,丢掉这一内容报文,RST掉两端的TCP连接,这一含有“非法”内容的网页就不能被访问到了。

三、DNS劫持

浏览者访问网站时,一般是使用网站的域名来访问,也就是说,以这个域名为目的地建立前面提到的TCP连接、再发送HTTP请求报文等。但是TCP和HTTP这些IP报文,实际上是以IP地址来访问目的服务器主机的,所以,浏览器终端首先要把这个域名转换为IP地址。这个转换过程是通过DNS协议来进行的。浏览器发起DNS请求,问DNS服务器“这个域名的IP地址是多少?”,DNS服务器回应“这个域名的IP是xxx.xxx.xxx.xxx”。然后浏览器得到目的IP地址后,就可以如前面介绍的那样继续后面的浏览过程了。首先,网络服务商(ISP)给浏览器自动分配的DNS服务器是可以“捣乱”的,它提供的DNS服务是否“可靠”关系到DNS的结果;另外,防火墙当然可以截获浏览器终端和DNS服务器之间的
DNS报文(防火墙无所不能,因为它处于我们和服务器之间,我们与外面交互的所有报文都经过它),所以它可以让你获得不到这个IP地址,也可以给你假的IP地址!剩下的就不用多说了吧…

应对之策:


首先,孙猴斗不过如来,因为猴子永远在佛祖的手中。用户使用ISP的网络,就不可能有ISP对付不了的手段。

对于IP过滤,简单直接,封一个IP就换一个IP。

对于内容过滤,网页服务器提供HTTPS访问支持的话,浏览器用https方式访问网页服务器,所有的报文都是ssl方式加密的,那防火墙虽然可以截获报文,但是它无法“看懂”,也就无法过滤。浏览者拨入专用的VPN网络的技术也是在此范畴之内。

对于DNS劫持,可以不使用ISP提供的DNS而自己指定更可靠的DNS,另外,浏览终端的操作系统也可以跳过DNS解析这一步,例如HOSTS文件等。

另外,如果浏览者可以找到并使用合适的代理服务器(就是一个位于防火墙和网页服务器之间的服务器主机),浏览者就可以通过这个代理服务器跳过某些防火墙的封锁。

四 特定端口封锁


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抽风的原因。

五、SSL连接阻断


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

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

Reference:

http://adreaman.com/0102internet-web-snooping-block-filter-firewall-gfw.html

http://blog.renren.com/share/201954194/12564032401

时间: 2025-01-11 14:53:31

Internet网络浏览的监听、拦截和过滤-浅析GFW原理的相关文章

[android] 网络断开的监听

标签: android 网络监听 杂谈 分类: Android [转自]  http://blog.sina.com.cn/s/blog_5d5996d001012o07.html 其实手机在网络方面的的监听也比较重要,有时候我们必须实时监控这个程序的实时网络状态,android在网络断开与连接的时候都会发出广播,我们通过接收系统的广播就可以实现网络的监听,下面是代码--- onCreate的时候实例化 //监听器     private NetState receiver=new NetSta

(一二五)手机网络状态的监听

对于一些需要与服务器进行长连接的App,需要对网络状态进行监控,当网络不佳时及时提醒用户,从而提高用户体验.通过苹果自带的框架和Reachability类可以实现网络状态改变的监听. 要实现网络监听,按照下面的步骤进行. ①导入SystemConfiguration框架. ②通过Xcode的帮助文档搜索Reachability,打开样例工程,将其中的Reachability类的代码拷贝到自己的工程,有两个文件,如下图所示. ③创建对象,保存对象,添加监听和启动监听. 注意reachability

MUI判断网络连接以及监听网络变化JS

来源:netChange问题:怎么判断网络状态 MUI用于获取当前设备的网络类型 1 function plusReady(){ 2 3 var types = {}; 4 5 types[plus.networkinfo.CONNECTION_UNKNOW] = "Unknown connection"; 6 7 types[plus.networkinfo.CONNECTION_NONE] = "None connection"; 8 9 types[plus.

Android开发之使用广播监听网络状态变化

我们经常需要判断网络状态的变化,如有无网络,所以需要监听网络状态的变化,比如网络断开,网络连接给予友好提示.如何监听网络状态的变化呢,最近工作中需要用到这个,于是就用广播机制来实现了网络状态的监听. 使用广播机制来监听网络状态主要涉及到以下几点: 1.需要自己编写个网络广播接收器,该接收器继承BroadcastReceiver类,用来接收系统发出的广播.比如我自己写了个NetStatusReceiver广播接收器.代码如下: package com.log.system; import andr

OC - 18.监听iPhone的网络状态

使用系统的方法来监听网络状态 系统的方法是通过通知机制来实现网络状态的监听 实现网络状态监听的步骤 定义Reachability类型的成员变量来保存网络的状态 @property (nonatomic, strong) Reachability *reachability; 注册为通知中心的的观察者 // 在通知中心注册观察者 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getNetworkS

监听网络

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; //开启网络状况的监听 [[NSNotificationCenter defaultCent

Android 网络流量监听开源项目-ConnectionClass源码分析

很多App要做到极致的话,对网络状态的监听是很有必要的,比如在网络差的时候加载质量一般的小图,缩略图,在网络好的时候,加载高清大图,脸书的android 客户端就是这么做的, 当然伟大的脸书也把这部分代码开源出来,今天就来带着大家分析一下脸书的这个开源代码. GitHub 地址https://github.com/facebook/network-connection-class 注意这个项目下载下来以后 会报很多错误,导致很多人运行不了,大家要根据各自电脑不同的情况修改gradle脚本,才能让

Android OkHttp + Retrofit 下载文件与进度监听

本文链接 下载文件是一个比较常见的需求.给定一个url,我们可以使用URLConnection下载文件. 使用OkHttp也可以通过流来下载文件. 给OkHttp中添加拦截器,即可实现下载进度的监听功能. 使用流来实现下载文件 代码可以参考:https://github.com/RustFisher/android-Basic4/tree/master/appdowloadsample 获取并使用字节流,需要注意两个要点,一个是服务接口方法的 @Streaming 注解,另一个是获取到Respo

oracle 监听服务自动停止与无法启动问题

描述:监听服务莫名其妙终止,必须手动启动. 网上关于该问题的资料很多,总结下来,有以下几点 1.地址使用了主机名,修改Host文件和监听文件即可解决该问题. 2.防火墙作怪. 3.安全软件的优化功能作怪. 4.环境变量有问题 但是,我们这边的情况比较复杂,在尝试关闭防火墙,修改host文件等,还原优化选项,查看环境变量等操作之后,仍有主机出现该问题. 分析:1.不是所有主机都会产生该问题,大致先排除服务器问题,2.可能某些网络原因导致监听服务停止.3.系统方面导致的该问题.因为该问题具有随机性,