网络访问攻防战 转自 月光博客

在很多大型企业中和有些国家中,为了限制员工或人民访问某些网站或使用某些网络应用程序,通常做了一些访问限制。限制的方法通常有路由器IP过滤和强制使用代理服务器等几种方式。

  路由器IP过滤指的是通过在路由器中加入外网或国外的IP黑名单,使得内网或国内无法访问外网或国外的这些IP,达到限制访问的目的。强制使用代理服务器的过滤方式通常只在大型企业中应用,指的是内网必须通过代理服务器才能访问外网,那么在代理服务器上可以实现更为复杂的过滤机制。本文主要讲述IP过滤的攻防战,关于代理服务器的攻防战下次讨论。下面依次讲述网络访问攻防战的不断升级过程:

  首先,如果要禁止人们访问某些网站,那么路由器管理者可以在路由器中设置IP过滤规则,把这些网站的IP加入黑名单,自然人们就无法访问这些网站了。

  之后,人们为了继续访问这些网站,就会用代理服务器绕过限制。代理服务器的IP成千上万,而且不停在变化,使得限制网络访问的工作处于被动局面。

  然而,由于代理服务器协议是明文的,通过监听网络数据包并制作自动搜集整理的程序可以知道人们访问了哪些代理服务器并自动把代理服务器的IP加入到IP黑名单中,这样使用普通代理服务器绕过访问限制的方式就失效了,绕过网络访问限制的工作处于相当被动的局面。

  所以,为了避免被侦测到代理服务器地址,加密代理软件应运而生。用户和代理服务器之间的通讯协议进行了加密,使得无法简单通过侦听网络数据包分析出代理服务器的IP地址。又一次使得限制网络访问的工作处于被动局面。

  但是,加密代理软件也需要和代理服务器进行通讯,也需要知道加密代理服务器的IP地址。所以加密代理软件一般会在启动时去某些发布加密代理服务器IP地址的地方获得加密代理服务器的IP。那么,只需要单独拿出一台计算机,启动加密代理软件,对这台计算机的网络通讯进行监视,那么即可知道发布加密代理IP 地址的地方,从而对发布点进行IP过滤。而且可以做成程序自动启动加密代理软件,自动监视数据包,自动把加密代理IP的发布地点的IP加入黑名单,这样加密代理软件无法获得加密代理的IP,加密代理软件失效,绕过网络限制的工作又一次处于十分不利的位置。

  加密代理软件为了对付这种情况,就需要把访问代理IP发布点的流量混杂在访问非代理IP发布点的流量中。比如,加密代理软件启动时,首先访问其它大量网站,在访问其它网站之中的某一次访问代理IP发布点,这样就把流量进行混杂了,无法通过简单的网络数据包侦听获得代理IP发布点的IP地址。如果把所有侦听到的地址全部加入黑名单,那么将会误封很多网站。限制网络访问的工作又处于不利的位置。

  然后,为了能继续对网络访问进行限制,网络管理员就转而对加密代理的IP(而非发布点的IP)进行过滤。在加密代理软件启动完毕之后,通过加密代理下载一个大文件,那么流量比较大的IP即为加密代理的IP。通过这种方法,网络管理员仍旧可以做出自动封锁加密代理软件的程序,绕过网络限制的工作又失败了。

  那么,加密代理软件可以采取同样的思路,把访问代理IP的流量混杂在其它流量中,并使分散的流量平分并不断变换代理IP,使得无法通过网络数据包流量统计获得加密代理的IP。人们又可以重新绕过网络访问限制了。然而,因为对流量进行了平分,所以网速通常只有几分之一了,大部分流量都耗费在混淆网络管理员的程序上面了。

  到了这里,网络访问攻防战似乎走到头了,但是聪明的网络管理员并不是束手无策了。通过对加密代理软件进行逆向工程,还是可以找到代理IP的发布点,从而过滤这个发布点。不过,这样已经不能通过分析网络流量用程序自动找出IP进行过滤了。

  最后,加密代理软件为了防止被逆向工程,对加密代理软件本身进行了软件加密处理,使得逆向工程变得十分困难。接下去就是软件加密与破解之间的智力较量了。

  总结:如果不进行网络流量混淆,那么能被程序自动找出有用的IP进行过滤。如果不对加密软件进行加密,也比较容易被逆向工程,从而找到有用的IP进行过滤。加密代理软件作者需要时刻提防软件被破解,一旦被破解,那么需要对升级加密代理软件,使得限制网络访问的工作需要重新破解软件才能继续实施。

  来源:读者投稿,作者的Twitter: @davidsky2012 ,作者的Google Reader: https://www.google.com/reader/shared/lehui99

 在上一篇《网络访问攻防战》中说到,在很多大型企业中和有些国家中,为了限制员工或人民访问某些网站或使用某些网络应用程序,通常做了一些访问限制。限制的方法通常有路由器IP过滤和强制使用代理服务器等几种方式。那么,本篇主要讲述使用代理服务器进行网络访问时的攻防战。

  通过代理服务器进行网络访问的很多情况,和直接访问网络的情况十分相似。代理服务器能做到不使用代理服务器的所有过滤方式,这些过滤方式在上一篇中已经有了详细地说明,唯一的区别是网络访问的攻防全部在代理服务器上进行。也就是说,如果你希望应用直接访问网络的访问攻防技术到代理服务器中,那么首先必须使浏览器或网络应用程序设置了代理服务器。

  然而,寻找访问外网的代理服务器地址又是一门学问。有些网络环境是在浏览器中直接设置了代理服务器的地址和端口,这样获得其地址十分容易;而有些网络环境使用了“自动代理配置脚本”的功能,以达到访问不同的网络使用不同的代理服务器的功能,其中著名的AutoProxy插件也使用了这种技术;甚至有些网络环境使用了“自动检测网络代理设置”的功能,以达到计算机在不同的网络环境中都能自动配置代理的功能。不过,在后两种设置的网络环境中寻找访问外网的代理服务器地址就需要了解这些技术了,具体可以参考Proxy auto-config和Web Proxy Autodiscovery Protocol。如果不熟悉这些技术,也可以通过netstat工具或者sniffer工具找出访问外网的代理服务器地址。这些技术和工具不在本篇中展开讨论。

  如果你顺利找到了代理服务器的地址,那么接下来我们就可以分析一下代理服务器究竟可以做哪些限制,以及如何突破这些限制的方法了。

  我们略过上一篇中已经详细说明的直接访问网络情况下的攻防,来看看代理服务器还能进一步做哪些过滤。在此列举一下通常情况下会碰到的过滤方式:

  1、域名过滤。在使用代理服务器访问网络时,会遇到某个域名下的所有网页都是访问被拒绝的情况,这就是域名过滤。然而,通常情况下代理服务器对于域名的过滤只是通过分析访问地址中的域名进行的过滤,而不是通过HTTP代理协议中的Host字段进行的过滤。那么我们可以通过把访问地址中的域名换成域名对应的IP地址,来解决这个问题。

  2、IP地址过滤。在访问网络时,有时候访问某个IP地址下面的网页会出现全部拒绝访问的情况。和域名过滤一样,这种过滤方式很多情况下也只是对访问地址中的IP进行过滤,那么我们可以把IP地址换成对应的域名解决问题。如果这个IP地址没有域名或者暂时找不到其对应的域名,也可以为这个IP注册一个免费的二级域名,之后就可以把IP换域名了。

  3、 端口过滤。由于浏览网页使用的是HTTP和HTTPS协议,这两个协议使用的默认端口分别是80和443,那么为了防止人们使用其他协议,很多时候代理服务器也会限制访问的外部端口只能是80和443。碰到这种过滤方式,只能使用支持代理服务器级联的软件访问其他端口了。但由于HTTP协议是明文传输的,所以也有很多代理服务器不对HTTP协议的端口进行过滤,只对HTTPS协议的端口限制为443。如果需要使用其他协议,而其它协议使用的端口正好是 443,那么我们正好可以利用HTTPS的密文传输特性,连接到目标服务器的443端口,代理服务器无法知道我们使用的是HTTPS协议还是其它协议。如果不碰巧,其它协议使用的端口不是443,那么我们仍旧需要使用支持代理服务器级联的软件访问其他端口了。

  4、探测HTTPS协议头。由于HTTPS协议的初始握手过程仍旧是明文的,那么代理服务器可以检测连接到外部443端口的协议头。如果不是 HTTPS协议,那么就断开连接。碰到这种过滤方式,我们可以先把正常的HTTPS协议头sniff下来,加入到通讯双方,之后再进行其它协议的通讯,就可以解决问题。

  5、NTLM密码认证。有些代理服务器使用了NTLM密码认证,那么IE用户不会感觉到有什么问题,使用了其它内核的浏览器或者其它应用程序时,就会提时输入访问代理服务器的口令。由于很多代理级联软件并不支持需要经过密码认证的代理服务器,会造成一定麻烦。可以使用一款名为NTLM Authorization Proxy Server的软件解决问题。

  6、URL过滤。有时候代理服务器为了防止用户访问某一类特定的应用——比如bbs——会过滤URL中带bbs的所有访问请求。碰到这种过滤方式,我们也只能使用代理级联的软件了。

  上面大致讲述了会经常碰到的代理服务器过滤方式。不过由于代理服务器过滤的方式千奇百怪,本文无法罗列所有的过滤方式。而且除了代理级联软件有现成的之外,其它解决问题的方式都需要代理服务器使用者自己编写网络程序,所以其它方式也主要是供大家进行研究的。

  最后,我给出使用了HTTP协议进行级联的软件源代码(下载),使用方式为java -Dhttp.proxyHost=代理服务器地址 -Dhttp.proxyPort=代理服务器端口 net.tools.web.TunnelClient 本地代理服务器端口 级联的代理服务器URL,然后就可以使用本地代理服务器进行网络访问了。比如我们必须通过代理服务器192.168.0.200:8080进行外部网络访问,我们可以运行命令java -Dhttp.proxyHost=192.168.0.200 -Dhttp.proxyPort=8080 net.tools.web.TunnelClient 7890 级联的代理服务器URL,之后我们把浏览器的代理服务器设置为127.0.0.1:7890即可使用。我再给出一个级联的代理服务器URL为 http://jinshan.isysjs.com.cn/tunnel/。此URL只供测试使用,请勿滥用。如果碰到NTLM密码认证的情况,请参考上述第5种代理服务器的过滤方式。

  如有兴趣继续和我讨论有关代理服务器的网络访问攻防战,可以去我经常访问的论坛(需要使用国外IP进行访问)找我,或者直接给我发Email。

  作者的Twitter: @davidsky2012 ,作者的Google Reader: https://www.google.com/reader/shared/lehui99