使用stunnel突破网络管制

2011-02-24 21:39 by hackerzhou

当前网络审查相当严格,不仅有政府的GFW来扫描过往的数据包,好多公司也有各自的“墙”,用策略来过滤一部分的网络请求,本文描述了如何在比较苛刻的审查条件下进行突破数据包扫描的方法。

公司屏蔽了除21/80/443之外的其他端口,端口绑定协议(也就是21必须是FTP协议,80是HTTP,443是HTTPS),禁止IMCP协议(也就是说过滤了ping数据包);配合域名过滤以及ip地址过滤,比如对qq/飞信的过滤就是屏蔽了服务器的ip地址;更加变态的是居然有类似GFW的链接被重置,比如你访问的一个网站上引用到了某个被屏蔽的站点的url,那个网站也会被屏蔽几分钟,机制很诡异。

解决思路:

思路1:在自己的VPS上把SSHD绑定在21或443端口,利用MyEntunnel配合ssh翻墙(这招在突破GFW上很管用,比VPN简单易用,直接得到一个SOCKS代理,配合Firefox的AutoProxy用)。结果由于端口绑定协议,ssh根本不能访问。

思路2:在外网找一台Server,我用的是自己家的ADSL+一台ATOM D510小主机,开放80端口做HTTP(S)代理,成功的解决了ip地址过滤的问题,飞信和qq成功登录。

思路3:同样是借助外网Server,在443端口上假设stunnel server端,在内网架设stunnel client端,C/S端用密钥对加解密,成功的突破了防火墙的限制,得到加密的一条隧道至一个HTTP代理。至此,突破网络扫描的工作完成,任何TCP请求都能够顺利通过隧道。

stunnel的机制以及局限性:

作用机制:stunnel(官方站点www.stunnel.org)其实是一个用SSL加密来保护不受加密的通信的工具,简单的说就是建立一个消息隧道,本地未加密的消息传输到stunnel的客户端,客户端使用加密后传输给服务器端,服务器端解密后进行数据包的转发,比如转发到一个代理,数据返回的机制类似。穿透防火墙的原理是因为通信采用的是标准的HTTPS,因此网关不能扫描包内容,也不会进行拦截。这样就保证了数据传输的安全性,在非安全的网络条件下适用。

局限性:stunnel并没有提供客户端程序使用HTTP代理访问服务器端的支持(或者是我没找到),其实从原理上来说是可以增加一层代理的,因为是标准的HTTPS通信,多一层proxy不影响整个数据的流通。还有一个不容忽视的问题就是速度被明显的拖慢了,中间环节变多了,速度没可能不慢,我的解决方法是在客户端做一个squid代理缓存,对静态文件(比如css,图片,js等)高概率(90%)缓存命中,减少重复的通过隧道请求服务器。

stunnel配置方法:

1. 下载stunne和openssl:

ftp://ftp.stunnel.org/stunnel/ 子目录中也有openssl

2. 生成证书:

openssl req -new -x509 -days 365 -nodes -config openssl.cnf -out stunnel.pem -keyout stunnel.pem
将产生的stunnel.pem拷贝到服务端/客户端各自的安装目录,替换同名文件

3. 在服务器上安装服务器端,修改配置文件stunnel.conf:

cert = stunnel.pem
key = stunnel.pem
client = no
[https]
accept  = 443
connect = 80

//[https]表示声明一个endpoint,此处即监听443端口,转发到本地的80端口

4. 在本地机器上安装客户端,修改配置文件stunnel.conf:

cert = stunnel.pem
key = stunnel.pem
client = yes
[https]
accept  = 8888
connect = xxxx.com:443
//同样,声明https这个endpoint,监听本地的8888端口,转发到xxxx.com的443端口
//注意,服务端和客户端使用的stunnel.pem一定要一致

Cache:

由于使用加密隧道进行通信的时间成本比较大,如果不做本地缓存的话可能会严重的影响速度。因此,我做了两个缓存服务器,一个在客户端,一个在服务器端,客户端squid配置成对静态文件90%命中,即无视http header中的Expires设置,有点类似强制命中。这样就基本能保证同一个文件不会经常占用速度比较慢的隧道而影响浏览效果,因此客户端squid的memory缓存和磁盘缓存大小必须设置得比较大。

本文基于 署名 2.5 中国大陆 许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名 hackerzhou 并包含 原文链接
发表评论

本文有 17 条评论

  1. yip
    2018-02-05 17:52

    现在这个方案还行吗?我这里按要求配置的,一直提示
    CApath: none
    * SSLv3 (OUT), TLS handshake, Client hello (1):
    * LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to http://www.google.com:443
    * stopped the pause stream!
    * Closing connection 0

    是客户端和服务端的私钥和证书必须一致??用的是stunnel+sniproxy的方式

    • hackerzhou
      2018-02-05 19:35

      很早GFW就已经能识别这种用公钥私钥加密的流量的。不过你这哥错我倒是没见过,可以研究下这个error code代表什么。

  2. ym
    2012-12-31 12:46

    hi,
    你说“客户端squid的memory缓存和磁盘缓存大小必须设置得比较大。”,不过SQUID在WIN下有客户端吗?

  3. ym
    2011-05-21 12:05

    我在网上下载了一个绿色版,并上传到了box.net: http://www.box.net/shared/xm3ublm12h,我用这个绿色版倒是成功翻墙了

  4. ym
    2011-05-20 22:00

    hi.
    我重装了系统。并安装stunnel-4.33-installer.exe,提示出错。只好去ftp://ftp.stunnel.org/stunnel/下载最新版stunnel-4.36-installer.exe (下载旧版stunnel-4.33-installer.exe来安装,仍然提示出错),安装好最新版并设置好后,却翻不了墙了。我怀疑是不是客户端和服务器端的版本要一致呢?如果是的话,如何升级服务器上的stunnel为4.36版?(我服务器上的stunnel为4.33版)

    • hackerzhou
      2011-05-21 10:58

      说明你还是没配置好,仔细读说明文档。如果没有很严格的限制的话并不推荐stunnel,ssh什么的比这个方便多了

  5. ym
    2011-05-18 18:53

    原来是stunnel去监听ssmtp的端口了,我在服务器端的stunnel.conf中,注释掉了ssmtp的那三行就ok了

    • hackerzhou
      2011-05-19 10:25

      恩,仔细的研究下配置文件就行。本来我这篇文章就是看到国内没怎么有人用过抛砖引玉的。

  6. ym
    2011-05-16 22:51

    hi.博主,怎么用stunnel翻墙失败?难道gfw封锁了443端口?

    • hackerzhou
      2011-05-17 14:40

      可以的啊,可能是你没有配置正确。至少目前GFW还没有封443端口。

  7. ym
    2011-04-24 23:48

    终于搞定了。不容易啊。是要把服务器端的配置文件stunnel.conf中的[https]段的connect = 80改为connect=squid的端口。建议博主修改一下帖子,把80改为squid的端口以免引起误会。

  8. ym
    2011-04-24 21:12

    hi.
    我设置ff的http代理为:127.0.0.1:8888,然后启动stunnel.exe,并且调整了一下我vps上的stunnel服务,不过访问任何网站,显示的都是我的mydomain.com网站的内容,why?

    • hackerzhou
      2011-04-24 22:21

      对啊,connect = 80,表示接受443端口的数据,重定向至80端口,当然就是你的网页服务了,你改成你的squid端口就好了呗.。。。搞vps的这点应该知道的吧。。。另外,读帖要仔细哟
      看到//[https]表示声明一个endpoint,此处即监听443端口,转发到本地的80端口这句话没?

  9. ym
    2011-04-24 20:06

    在哪里看log?远程端的对应端口上配置的是https,
    我把xxxx.com:443替换为了mydomain.com:443

    • hackerzhou
      2011-04-24 22:22

      看你怎么配置的。。。仔细读下stunnel的文档

  10. ym
    2011-04-24 16:12

    hi.我按此文的内容,然后设置ff的http代理为:127.0.0.1:8888,然后启动stunnel.exe,但在访问任何一个网站时,都显示Connection Interrupted,怎么回事呢?

    • hackerzhou
      2011-04-24 18:08

      看log,你的远程端的对应端口上配置的是什么代理?

发表评论