breakjail

breakjail internet fireware to access all website

npm install breakjail
5 downloads in the last week
9 downloads in the last month

Todo

  • (done) 修改 server 名称, domestic/foreign
  • (done) 添加新的 app,或者称其为改 app 名称为 undefined
  • (done) 进行 ip 记日志于内存中,可以访问 breakjail.noradle.com/log/ip 查询
  • (done) 进行权限过滤,基于 IP 地址的,只限产创指定 IP.
  • (done) 记录访问者 IP,记录日志,发现白名单外的就要显示系统500障碍
  • (close) 增加特殊 UA 特征的允许访问权限,把自己加进去,意义不大,因为自己使用也蛮烦
  • (done) 当访问了 breakjail.noradle.com/door/open 后即可运行自己的 IP 使用系统,并可坚持一个小时
  • (done) nodester 如何支持高版本 node, 至少支持到它所生成的 v0.6.17
  • (done) foreign proxy use agent to access target website
  • (done) 到国内站点则不绕道国外的nodester再回来,而是直接访问
  • (done) 记录视频URL(不过似乎视频url都不是http协议的)
  • (done) 使用 bootstrap 来实现
  • (done) 内代理清除所有 hop-to-hop header 后才发给外代理
  • (done) 通过 websocket connect upgrade 101 将内外代理进行 socket tunneling
  • 支持 L2TP,PPTP,IPSec VPN 访问,用以支持 iOS 设备访问

不着急的功能

  • 进行内容加密(目前是审查器不会查看http实体内容)
  • 可以选择多个 node 云部署,本地可以按策略选择最合适的国外代理
  • support audio/video stream (非http只会按照IP封网,而域名对应的IP总会变一般不容易被封)

如何绕过 nodester 的 proxy 限制

nodester 的 proxy 拦截机制

  • 来自 browser 浏览器的 proxy 会发送 x-forward-xxx request header,nodester 不会拦截
  • 请求中包含 proxy-connection header 代表将 nodester 平台当代理,自然要被拒绝
  • 请求 url 中如果包含 http://host:port 那么就说明将 nodester 当代理了,自然也要被拒绝
  • 请求中的 host header 如果不是 undefined.nodester.com 当然被拒或者路由到其他的 nodester app 上了

解决方法:二级 proxy

第一级:将 request url 信息保存到 x-breakjail-url 中

将 proxy 请求的痕迹完全清除,并将其信息转移到 x-breakjail-xxx 中

在第一级将进行鉴权,考虑到 windows 下 browser 可能不支持设置代理的用户名和密码,

暂时先设计成按照客户端 ip 进行限制,比如只有指定 ip pattern 才能访问第一级 proxy

第二级:将 x-breakjail-url 变成请求的 host/port

只允许来自第一级 proxy 的请求,也就是 nodester 给出的 x-forwarded-for 的地址访问,

当然还有就是来自我自己IP地址的访问。

代理对 http 头的处理

http header 有 end-to-end, hop-to-hop 两种,应该只对 end-to-end header 进行继承, 对 hop-to-hop header 进行 override

比如说 connect header,只在代理层进行处理即可

Problem

隐藏可能泄露敏感信息的 http headers

  1. path in request line,因为上面的 query string 可能存在要被过滤的信息
  2. referer 上面可能包括要被过滤的信息
  3. cookie 上的信息 要将上述信息一起打入一个逗号分割的 base64 header - x-undefined: 然后
  4. path = /favicon.jpg
  5. referer = 空
  6. cookie= 空 这样关于用户信息就没有什么可用于泄露的了

变更域名

重新从 nodester 上申请新应用名字,叫做 ntmxfwdm 这样谁也不知道他是干什么的,但是使用一个不在字典里的名字可能也会遭到怀疑,因此还是起个字典里的名字好些,比如叫做 undefined.nodester.com,正常其他人都不会注意它了。

上行下行内容进行加密传输

对上行下行传输的内容使用客户 header 敏感信息 作为 key 进行加密, 这样即使通过暴力破解找到了 key,该 key 也只在很小的范围内有用,不能用于解开其他人的通信。

todo

用户认证和权限控制

用户名,密码

使用 node2psp 数据库配置允许访问的列表

只有来自该列表ip的访问才允许访问

使用手机号认证

当来自非允许访问范围的访问时,会获取手机号,并参照允许访问的手机号控制

  • 来自 wap 的直接获取手机号
  • 来自联通 gprs 的访问调用号码识别服务获取手机号
  • 来自手机短信

将调用获取手机号做成标准 connect 模块

原先的号码识别服务进行三位一体的升级

  • 用户直接访问号码识别服务获取自己的号码
  • 网站使用本 connect module 获取号码(服务器IP,端口都有 request 对象自动导出,如果behind reverse proxy,需要给定参数指定 server ip/port,然后从 x-forwarded-xxx 获取客户端地址端口)

速度

对于国内的请求,直接在一级代理帮助转发

这样用户不会对可以在一级代理访问的情况下网站,绕道美国在出口转内销

所有来自美国代理的返回结果,都进行压缩返回

使用 gzip 按照尽量最大压缩比传回,然后在本地一级代理解压缩或者直接供给浏览器

本地代理会缓存来自国外代理的返回内容

这样可以避免每次访问都从国际出口加载内容

加密

国内国外代理间使用 https

这样浏览器完全加密,就不可能被审查过滤掉,因为没有过滤过程,速度也会相应加快。

deployment

curl -X POST -d "coupon=ryahrox&user=kaven276@vip.sina.com&password=pspdweb&email=kaven276@vip.sina.com&rsakey=ssh-rsa AAAA..."

npm install nodester-cli -g nodester user setup kaven276 nodester276@ nodester user setkey

http://breakjail.nodester.com port 17225

从开发者机器同步软件到目标服务器

rsync -av -C -e "ssh -p 60222" /Users/cuccpkfs/dev/project/breakjail node@noradle.com:

从命令行启动各个服务

ssh -p 60222 node@noradle.com cd breakjail nohup forever server_mine.js prod & nohup forever server.js test2 &

rsync -av -C -e "ssh -p 60222" ~/.ssh/id_rsa.pub node@61.181.22.93:./ssh

undefined.rs.af.cm mdb-kiv

npm loves you