Tohr - HTTP 层上的洋葱路由器

Tohr (The Onion HTTP Router) 是我上个星期写的一个小的研究项目,它的名字起源于 Tor (The Onion Router)。简单地来说,它就是试图在 HTTP 层上实现类似于 Tor 实现的功能—— HTTP 层上的 HTTP(S) 隧道。

这个 idea 不是我想出来的,而是受到 GAppProxy 的启发(GAppProxy 是一个 great work)。但是 GAppProxy 只是利用 Google 的平台,而且受到 GAE 的很多限制。那么我的贡献呢,就是把这个 idea 通用化,设计一个协议使其支持多平台,解决了 GAppProxy 的一些 bug,完善了 HTTPS 的支持。(哦,忘记了,我还给它起了一个很 fancy 的名字 ^_^)目前 Tohr 的路由器可以是 Google App Engine 上的 Python 网站,也可以是普通的 Apache+PHP 站点。

Tohr 是怎么工作的?

Tohr 的工作原理

Tohr 的工作原理见上图。首先您得拥有一个墙外的主机(免费或者收费的)作为 Tohr 路由器,Tohr目前支持 Google App Engine 和 Apache+PHP 服务器,您将对应的 tohr-router 文件上传到服务器上;然后您在本地运行一个 tohr-daemon 守护程序,设置 tohr-daemon 连接 tohr-router 的 url,tohr-daemon 默认会开启 9090 来提供一个 HTTP(S) 代理服务,您只需要将浏览器的 HTTP 代理设置为 localhost:9090,您的访问请求就会通过 tohr-daemon 转发到 Tohr 路由器上,这样就能通过它来访问被防火墙禁止访问的网站了。

Tohr 是给什么人用的?

目前来讲 Tohr 仍然不很完善,而且还需要加入对其它类型的主机,比如 asp.net、jsp 的支持,还有对多跳和匿名的支持,还没有一个针对普通用户易用性的优化。要求普通用户都有一个墙外主机也是件比较为难的事情(虽然申请一个国外免费 PHP 空间并不困难,比如这里),因此 Tohr 目前还仅适合爱折腾的人使用,尤其是懂 Python 或 PHP 的爱折腾的人,所以在这里是找不到一个一步步的图文教程教普通用户怎么配置的。当然,如果哪位用户愿意做一个,请发送到邮件列表或者提交补丁,我很乐意将它放在项目文档里。

分类: Open Source 标签: , , ,
  1. 2009年8月10日23:49 | #1

    赞,抢鲜试用一下。

  2. 2009年8月10日23:58 | #2

    顶了,改天试试看。
    好东西哈。
    如同,有了国外服务器就有了自由

  3. 2009年8月11日00:21 | #3

    实验成功一半,HTTP可用,但HTTPS不工作,在此处留IP为证。果然是需要小折腾一下的东西。在我的Apache上“RewriteRule ^tohr$ tohr-router.php”的似乎没有生效。有关CA证书什么的我不太懂,有空学习研究一下。

  4. 2009年8月11日08:31 | #4

    收藏至20ju.com

  5. 2009年8月11日11:25 | #5

    大大很牛,不懂的您是在墙内是怎么加密的连接呢?

  6. 2009年8月11日11:30 | #6

    @sswv
    HTTPS 的问题,你安装了 OpenSSL,然后把 ca.crt 安装到你浏览器的信任CA中就可以了。IE 可以直接双击 ca.crt 安装,Linux 下的 firefox 可以直接打开 ca.crt 安装,Windows 下的 Firefox 需要自己到选项->高级->加密里面导入 ca.crt 文件。
    但是强烈建议重新生成自己的 ca.key 和 ca.crt,而不是使用项目自带的 ca key pair,security reasons。Linux 下用那个 update-ca.sh 执行一下就可以了,Windows 下脚本还没有写,win 下安装 ca 要考虑的浏览器太多,烦。

  7. 2009年8月11日11:43 | #7

    先顶再看,顺便赞一个,弓虽!

  8. 2009年8月11日13:23 | #8

    没地儿下载?哪里可以下载到?

  9. 2009年8月11日16:04 | #9

    @Michael
    没有 release,您可以使用 svn check out。

  10. 2009年8月11日16:11 | #10

    @appz
    其实加密是完全没有必要的,只要将数据压缩一下,就是乱码了,关键字过滤就没效果了。真的想要加密,也很简单,因为这个东西就自己用,自己随便写点儿什么简单的密码算法,大概不会有人有兴趣去破解一个普通老百姓使用的密码算法的。

  11. 2009年8月11日20:33 | #11

    @Solrex
    搞定了,谢谢。

  12. 2009年8月12日10:24 | #12

    wow!曾经想过搞一个这样的东西,没想到已经实现了~

  13. 2009年8月12日16:03 | #13

    Tohr router 在 http://www.000space.com 提供的免费空间上测试通过,您可以他们使用免费的 PHP 空间作为 Tohr Router 了。

  14. 2009年8月13日10:49 | #14

    暂时在国内还没有找到不错的免费PHP 空间
    验证码输入几次都是错误
    呵呵~

  15. 2009年8月13日17:39 | #15

    @园子
    国内...就别想了,免费的PHP在国内是不可能赚钱的。

  16. bearqq
    2009年8月20日20:18 | #16

    有个疑问,那个tohr.conf里地址的填法,我填的 http://xxx.xxx.com/tohr 这个是否正确啊~ 我是php的空间,连上后显示

    Error response

    Error code 591.

    Message: Tohr-daemon: Http error, see command line log..

    Error code explanation: 591 = ???.

    请问是怎么回事啊

  17. 2009年8月21日00:55 | #17

    @bearqq
    这取决于您的空间是否支持url rewrite和您是否正确上传.htaccess文件,所以我在配置文件中说您需要首先用浏览器测试一下url是否可以访问

  18. bearqq
    2009年8月21日21:57 | #18

    @Solrex Yang
    感谢您的回复,之前我在浏览器里已经试过了,显示it works,,.htaccess也上传了,不过貌似还是连接出错。反正是免费空间,也不怕提供地址:http://is.gd/2rT0D,再次感谢您的解答。

  19. jijide
    2009年8月23日00:19 | #19

    现在可以在google app engine上面用吗?

  20. 2009年8月23日17:32 | #20

    @bearqq
    我正休假在家,只能用手机处理事务,等我休假结束后,会尝试调试一下您的问题.

  21. Facebook
    2009年8月24日06:52 | #21

    https有点小问题,无法完全载入页面,图片无法显示。比如gmail.com。

  22. facebook
    2009年8月24日07:01 | #22

    用Google App Engine作代理服务器,https连接无法完全载入,图片无法显示。。。
    比如gmail.com

  23. 2009年8月26日14:49 | #23

    从哪儿下载啊?

  24. 2009年8月26日23:47 | #24

    今天checkout了新版的代码,明天传到服务器试试

  25. bearqq
    2009年8月29日13:05 | #25

    @Solrex Yang
    感谢 当时用的是ubuntu9.04测试的~~gap没有试,条件不足,不过您推荐的那个网站好像也没成功,或许是我哪里做错了

  26. forkei
    2009年8月30日16:06 | #26

    这不就是跟 PhpProxy 差不多么 ……

    比如这个介绍 http://www.billwsy.com/phpproxy-intro/

  27. 2009年8月30日16:11 | #27

    @forkei
    哈哈,谢谢您的提醒,原来也有人做过类似工作呀 :) 我居然都不知道,又重新发明轮子了。

  28. forkei
    2009年8月30日16:27 | #28

    @Solrex

    那个貌似很早就有了,不过有很多bug,使用几十分钟浏览器就会白屏,要重新启动客户端才可以继续使用。

  29. 2009年9月3日23:40 | #29

    @bearqq
    经我的测试,你的服务器只支持 HTTP 抓取,不支持 HTTPS 抓取。这个大概是你的服务器提供商的限制,我想可能那个服务器不是 Linux 服务器,或者没有安装 curl,因为 tohr 的抓取 HTTPS 页面功能是使用 curl 实现的,PHP 好像没有相应模块。

  30. bearqq
    2009年9月3日23:56 | #30

    @Solrex Yang
    感谢您的测试,昨天我在windows下面又用svn下载了一次源代码,用python连上了,或许那个问题是linux和windows的svn不同点产生的吧~

  31. 2009年9月6日15:52 | #31

    forkei :
    @Solrex
    那个貌似很早就有了,不过有很多bug,使用几十分钟浏览器就会白屏,要重新启动客户端才可以继续使用。

    phpproxy的加密已经被gfw解密了 现在还有glype等 其实在proxy.org还是那里 有很多不同类型的代理

  32. client
    2009年10月5日03:39 | #32

    可以很快的翻墙,哈哈,非常不错。可是看不了YouTube,不知道能否解决这个问题 ?

  33. 12345
    2009年11月23日18:46 | #33

    我怎么出现这样的错误呢?

    D:\tohr\daemon\python>tohrd.py
    Traceback (most recent call last):
    File "C:\Python26\lib\logging\__init__.py", line 765, in emit
    self.stream.write(fs % msg.encode("UTF-8"))
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 296: ordina
    l not in range(128)

  34. 77
    2009年11月24日00:11 | #34

    发现问题了,图片不能显示的原因是,每个接收的文件,在头部会加上本次会话的报文。导致文件发生变化,普通htm或文本页,反正可以显示的,但图片文件就被破坏了。

  35. abacuspix
    2009年12月25日09:02 | #35

    其实就是 http 隧道的一个应用吧

  36. abacuspix
    2009年12月25日09:06 | #36

    Loki ICMP tunneling
    ACK tunneling
    HTTP tunneling
    呵呵 看来好好研究一下穿墙技术还是有必要的

  37. forkei
    2010年1月23日12:59 | #37
  38. newbie
    2010年2月3日20:05 | #38

    您好,我在GAE上遇到了一些问题:首先我上传到GAE上没问题,访问那个地址也显示It works了。但是运行Daemon之后,显示下列信息:
    Tohr INFO: Loading configuaration from tohr.conf
    Tohr INFO: Using Tohr router(s): [u'https://----.appspot.com/tohr
    Tohr INFO: Using outgoing proxy:
    Tohr INFO: Start serving at http://127.0.0.1:9090
    但是这时候用这个代理,却显示404 not found错误。任何网站都打不开,不知是什么原因呢?

  1. 2009年8月12日01:30 | #1
  2. 2009年8月13日10:42 | #2
  3. 2009年8月28日23:52 | #3
  4. 2009年8月30日02:40 | #4
  5. 2009年8月30日11:59 | #5
  6. 2009年8月30日22:15 | #6
说明:点击回复/引用, 会发邮件给该用户, 请慎用; 填写非真实电邮地址, 评论可能会被自动过滤, 无法及时显示, 不要责怪我. 卡内基梅隆大学的 reCAPTCHA 计划使用验证码帮助辨认古老典籍扫描时无法识别的文字,输入验证码的同时,您也为保存人类知识做了一分贡献,谢谢!