Category: Tech

  • 使用SSH突破移动WAP网关封锁

    上次说到使用Openvpn通过移动WAP网关来使得电脑上网,现在某些地方的移动网关已经进行了屏蔽,可以想象,现在只是还没有大量的企业应用,一旦有了真正的移动企业应用,比如一直在推广的黑莓,SSL隧道是不可能被完全屏蔽的,下面我要说的是,使用另外一种方法通过移动的WAP网关来使得电脑可以上网,此方法通常被用在安全连接远程局域网应用中,比如,在VNC没有对协议进行加密之前,网络管理员不得不使用SSH端口转发来使得远程连接VNC变得更为安全,这样,VNC的数据传输都是通过SSH转发的,不会有对外暴露VNC端口的危险,那么,很显然,我们可以使用这种方法,将HTTP代理服务器的端口转发到本地,也就是SSH tunnel,移动的WAP网关屏蔽了代理服务请求,但是它不能屏蔽加密协议通过,因为它没有办法知道传输的是什么,要达到上述的目的,需要以下条件:

    1,一台公网服务器
    2,公网服务器安装有SSH服务器
    3,公网服务器安装有代理服务器,squid,tinyproxy等
    4,居家旅行杀人越货必备软件putty

    首先,当然是使用putty进行设置,通过移动的WAP网关10.0.0.172:80,然后设置转发端口,例如,在公网服务器上代理服务器的端口是8080,我们想通过SSH隧道把它转发到本地的8080端口,如图所示:


    设置完成之后,即可登录服务器,如果没有意外发生的话,我们可以在putty的日志中看到如下字样:

    2008-01-19 12:41:32 Allocated pty (ospeed 38400bps, ispeed 38400bps)
    2008-01-19 12:41:34 Started a shell/command
    2008-01-19 12:41:41 Opening forwarded connection to localhost:8080

    这表示端口已经打开,你可以使用浏览器设置代理服务器为localhost:8080,然后就可以上网浏览啦,网上盛传的多是修改浏览器UA以达到欺骗移动WAP网关从而浏览网页的目的,经过处理,移动WAP网关输出的网页头均带有WML标记,使得浏览器无法正常显示,当然,还可以修改mime type使得浏览器能够正常显示,这对于一般用户来说基本上是很困难的,而使用SSH进行端口转发,也只是极少数网络管理员可以使用的方法,对于大多数人没有意义,这里只是提出一种方法,这种方法被大规模的应用,是在一个不太合适用来表述的环境中,我们说到,加密的协议,是无法被网关识别的,显然,网关知道是一些加密的数据通过,但是网关不可能知道这些数据是什么,也就无从进行屏蔽,这种方法,被广泛应用在XX功的破网软件上,即使是GFW也不能检测到,因为它不是明文的,我一直在猜测这些个软件的工作原理,大致如下,以工作步骤为序,大家可以探讨:

    1,使用境外DNS对动态域名进行解析,通过SSL隧道得到若干通知服务器地址,这些通知服务器都是各国动态IP。
    说明:国内DNS对一些境外网站进行了屏蔽,特别是一些不听话的动态域名服务商,例如较为著名但迅速在国内销声匿迹的no-ip,使用境外DNS能得到准确的地址。
    2,根据通知服务器返回的地址,得到正在工作的SSL隧道内容服务器地址,这些内容服务器当然也是各国的动态IP。
    说明:可以屏蔽域名,也可以屏蔽IP,但是不能屏蔽动态IP,不能屏蔽DSL线路上的IP,如果IP地址在这个星球上刚好够用,才能解决这个问题,无论IP地址是缺乏,还是剩余过度,都不可能进行准确的屏蔽,使用SSL隧道是必须的,因为GFW会直接过滤掉明文的非法内容使得链接断开,也就无法继续下面的通信。
    3,使用内置的stunnel对内容服务器的ssl隧道转发到本地某个端口,使得浏览器只需打开类似于http://127.0.0.1:1234 这样的链接即可浏览内容服务器上的内容。
    说明:直接调出ssl内容服务器的IP地址带有风险,会使得网监人员的封锁变得有目的性,而普通用户也会困扰于浏览器因为错误的证书弹出的提示,使用stunnel转发,给普通用户一个较为友好的界面,我认为这才是最主要的目的。

    下面我们讨论一下屏蔽的可能性,在第一步,屏蔽境外DNS是不可行的,当年169工程就是试图建立一个完全国内的网络,不过很快就被证明是失败的,只要在第一步没有办法屏蔽境外DNS对动态域名进行的解析,后面的就没有办法了,屏蔽对特定的动态域名解析是可行的,但是只要不把境外的动态域名服务商都屏蔽掉,这基本上没有太大作用。走向第二步,就没有什么办法可以屏蔽了,全是加密过的IP链接。至此,我实在是想不出来什么办法可以屏蔽这样的一个过程,可以考虑从源头着手,重点屏蔽通知服务器,不过,如果这些通知服务器和内容服务器都是在一起的,互相之间可以通知网络的变化,连成一个随时变化的动态网络,那就没办法了,综上,唯一可以屏蔽的地方就是在使用境外DNS对动态域名进行解析的地方,这是没有经过加密的数据。

  • MySQL Proxy

    我考虑了一下Mysql数据库服务器负载均衡的架构,发现大多数应用似乎没有加载mysql-proxy,当然本意是为企业版本开发的,那么在这之前的load balancing,他们是用什么来做的呢?使用管理节点+集群的方式是一种,不过我估计PF中的address pools应该也可以,而且PF的方案更有通用性,但是设置过于复杂,且牵涉到具体网络结构,mysql-proxy是一种全新的方案,大家可以把它和mysql的关系理解为squid和apache的关系,不过mysql-proxy并不包含cache的部分,这部分由第三方连接池做了,当前的web应用,瓶颈其实都在数据库,奥运门票预订网站的垮掉,正是这种瓶颈的体现,并不是说在前端没有瓶颈,而是数据库的瓶颈尤为明显。

    Mysql-proxy是一个很小巧的程序,只需要一行命令即可执行,如果仅仅是代理的话:

    mysql-proxy –proxy-address=202.202.0.10:3389 –proxy-backend-addresses=10.0.0.2:3306

    不过很显然,这样做就没办法在mysql中限制访问数据库的IP了,因为都是本地的访问,如果是mysql集群,那么可以用下面的命令来进行负载的均衡:

    mysql-proxy –proxy-address=202.202.0.10:3389 –proxy-backend-addresses=10.0.1.2:3306 –proxy-backend-addresses=10.0.1.3:3306 –proxy-backend-addresses=10.0.1.4:3306

    mysql-proxy是一个简单的程序,因为它仅仅是做一个代理,如果加上Master-Slaves的方式来做集群,然后把数据库的读写分离,应该是效率非常高的,但是,很多程序的读写并不是分离的,mysql-proxy中指定了一个参数,可以read-only,很大程度上这个参数是多余的,因为在mysql中去统一管理读写的不同用户,更为合理,如果mysql-proxy能把read-only和write-only分开,那么就完美了,把read-only请求转发到Slaves,把write-only请求转发到Master,使用一个端口,一个用户,就能够读写到不同的数据库服务器。

    MySQL Proxy is a simple program that sits between your client and MySQL server(s) that can monitor, analyze or transform their communication. Its flexibility allows for unlimited uses; common ones include: load balancing; failover; query analysis; query filtering and modification; and many more.

  • 封掉百度MP3搜索下载

    百度的MP3搜索流量果然是很大,一直没有找到合适的屏蔽方法,终于找到了一个较为合适的方法,依然是Setenv,不过和限制reffer不同,限制的是UA,这下大家明白为什么百度的MP3搜索在前年从直接网页点击改为了弹窗再点击,我原本以为是出于展示更多广告的目的,其实不是,是百度为了防止这些个网站封掉它的来源URL,将每个弹窗随机IP reffer,要封掉一堆reffer IP,简直就是疯了,虽然也是可行的,但是不可靠。

    以下方法依然不够可靠,因为直接试听的话,还是可以收听的,只是不能下载,不过这至少达到了一个高尚的目的:音乐只能用来听~

    # Play by mediaplayer
    BrowserMatch “RealMedia” local_media=0
    BrowserMatch “Media Player Classic” local_media=0
    BrowserMatch “WMFSDK” local_media=0
    BrowserMatch “Windows-Media-Player” local_media=0
    BrowserMatch “NSPlayer” local_media=0
    <FilesMatch “\.(mp3|wma|wmv)”>
    Order Deny,Allow
    Deny from all
    Allow from env=local_media
    </FilesMatch>