qyb的博客

翻墙代理的本地部分

我的这个 proxy 代码参考自 SUZUKI Hisao 的 Tiny HTTP Proxy。主要修改的有两点:

  1. 原版的 do_CONNECT 是两个套接字直接互相转发数据,我改成了 SSL 中间人代理.. 而且依赖到 python 2.6 才支持的 server-side ssl wrap
  2. 另外就是自己封装了 descrypto 类,完成和远程 PHP 的加密
配合其运行的代码见
翻墙代理的远程部分

翻墙代理的加密部分


# -*- coding: utf-8 -*-
# 建议 Python 2.6 环境,以支持 https proxy
# Win32 下需安装
# http://www.python.org/ftp/python/2.6.5/python-2.6.5.msi
# http://www.voidspace.org.uk/downloads/pycrypto-2.0.1.win32-py2.6.exe
# 至于 IronPython 目前还没有 server-side ssl 支持,据说 IP 2.6.1 将会有...
try:
from ipcrypto import descrypto
#IronPython 里的 socket 不支持 bind 到 '0.0.0.0'
import platform
bind_address = (platform.node(), 8000)
except:
from pycrypto import descrypto

bind_address = ('0.0.0.0', 8000)

import urllib2

import BaseHTTPServer, SocketServer

#REMOTEURL/PASSWORD 和国外主机配合
REMOTEURL = 'http://www.dup2.org/blarblarblar.php'

PASSWORD = 'yourpasswordhere'

# KEY/CERT 的生成参考 http://docs.python.org/library/ssl.html
KEYFILE = 'cert.pem'

CERTFILE = 'cert.pem'

#自定义允许的IP列表, 给每个IP起个名字帮助记忆

allow_clients = {'127.0.0.1': 'myself'}

desobj = descrypto(PASSWORD)

skip_headers = ["keep-alive", "proxy-connection", "connection", "accept-encoding"]

class pseudofile():
''' SSL Pseudo File Object'''
def __init__(self, sslobj):
self.sslobj = sslobj

self.closed = 0

def read(self, size):
chunks = []
read = 0
while read < size:
data = self.sslobj.read(size-read)
read += len(data)
chunks.append(data)

return ''.join(chunks)

def readline(self):
line = []
while 1:
char = self.sslobj.read(1)
line.append(char)

if char == "\n": return ''.join(line)

def write(self, data):
bytes = len(data)
while bytes > 0:
sent = self.sslobj.write(data)
if sent == bytes:
break # avoid copy
data = data[sent:]

bytes = bytes - sent

# 下面两个方法是 BaseHTTPServer 里会调用到的
def flush(self):
pass

close = flush

def checkip(f):
def new_f(_self):
(ip, port) = _self.client_address
if ip in allow_clients:
f(_self)
else:
_self.send_error(403)

return new_f

class ProxyHandler(BaseHTTPServer.BaseHTTPRequestHandler):

@checkip
def do_GET(self):
content_length = 0
if hasattr(self, "sslhost"): self.raw_requestline = "%s https://%s%s %s\r\n" % (self.command, self.sslhost, self.path
, self.request_version)
h = [self.raw_requestline]
for kv in self.headers.items():
if kv[0] == 'content-length':
content_length = int(kv[1])
if kv[0] in skip_headers: continue
h.append("%s: %s" % kv)
h.append("connection: close")

req = "\r\n".join(h) + "\r\n\r\n"

if content_length:

req += self.rfile.read(content_length)

encreq = desobj.enc(req)
req = urllib2.Request(REMOTEURL, encreq)

f = urllib2.urlopen(req)

text_mode = f.read(1)
response = f.read()
if text_mode == "1":
response = desobj.dec(response)
self.wfile.write(response)
print 'REQUEST:', self.raw_requestline.strip()
#有时候一些看起来是 text/* 的请求也是 binary mode,通常是 304 Not Modified

print 'RESPONSE: %s, %d Bytes' % ('crypted mode' if text_mode == "1" else 'raw mode', len(response))

self.close_connection = 1

@checkip
def do_CONNECT(self):
# print self.raw_requestline
# "CONNECT twitter.com:443 HTTP/1.1"
self.sslhost = self.raw_requestline.split()[1]
self.wfile.write(self.protocol_version + " 200 Connection established\r\n")
self.wfile.write("Proxy-agent: QYB\r\n\r\n")
# TODO 浏览器端会看到一个警告,但是没有办法;避免警告是不对的,必须让使用者认识到现在是中间人模式
try:
import ssl
self.rfile = pseudofile(ssl.wrap_socket(self.connection, KEYFILE, CERTFILE, True))
self.wfile = self.rfile
self.handle_one_request()
except:
print 'ssl error:', self.raw_requestline

self.close_connection = 1

do_PUT = do_GET
do_POST = do_GET
do_HEAD = do_GET

do_DELETE = do_GET

class ThreadingHTTPServer(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer): pass
httpd = ThreadingHTTPServer(bind_address, ProxyHandler)
httpd.serve_forever()

Topic: 技术

今天审判赵连海

关键词:结石宝宝家长

RT @ranyunfei: 中国民众必须知道一个残酷的事实:如果你不想让你的孩子成为奴隶主的添头,在中国生小孩是需要勇气的。如若没有替孩子的自由和权利而战的准备就最好别生。

RT @aiww 判刘晓波,那是读书人的事;判谭作人,那是四川的事;今天审判赵连海,这是每一个有后代的人的事,除非你觉得中国人就该断子绝孙。

Topic: dada

狼堡里的隐藏角色

今天达达和我说,在她想象的剧情里,小灰灰还有一个姐姐,叫小红红。。。小红红和美羊羊一样,都有漂亮的蝴蝶结,穿粉红色的衣服,长相也差不多。。。囧

喜羊羊和灰太狼里的设定很奇怪,反方是很有代入感的温馨三口之家,正方是一个怪爷爷带着一大群父母不知道在哪里的孩子。

不过百亩森林也是这样,除了小豆,其他的小朋友身世都不清楚;米老鼠唐老鸭亦是如此。相比较美国动画片而言,是不是中国这个年龄段的动画片一直以来人物关系都有明显的长幼尊卑呢?欧洲动画片好像也展现家庭关系的多?

Topic: dada

最近为翻墙作的一些技术准备

本来自从换到国外主机后,也就有了一个 ssh 帐号,用来翻墙是通行无阻。但是在某些情况下无法访问外面的 22 端口(比如搜狐的WIFI),那就只能想法通过80端口来翻了.

大概有三种方案:
  1. 弄一个代理页面,输入URL,得到HTML。更强一点的还可以把内容变化一下,在浏览器端重新组装,以避开深度包检测。
  2. 直接在URL上生成一个HTTP Proxy,在浏览器里配置通过它访问。这个可能会被RESET
  3. 我尝试的方向是类似phpproxy,在本地启动Proxy服务。这样的好处是可以同时帮助其他人翻墙

我这个重复造的轮子比 phpproxy 增加的地方有两处,一个是在墙内外传输之间弄了一个DES加密,避开内容检查;另外一个是很凑合的实现了HTTPS代理(就是会有浏览器警告,很像中间人证书欺骗)。本地的 Proxy 在 Python 和 IronPython 下都能运行,如果哪天想用手机翻墙的话再试试 PyS60 能不能跑起来

感觉对付防火墙还是得靠 P2P 的模式,部分人贡献出口通道,静态内容在墙内大量缓存。打算要是有时间的话研究研究 .NET Framework 里的 P2P 支持,做出来的产品能在 Windows 上运行才是王道。

Topic: 技术

简单搜索了一下转基因相关的知识

看起来 Say No To GMOs 是一个反对理由的很好来源。可惜,我没时间一一查看,只是学习了一下 http://en.wikipedia.org/wiki/Genetically_modified_organism

从维基百科看,GMOs 有三个反对点:
1. 专利问题 (涉及到跨国公司vs穷国等等意识形态观点)
2. 环境问题 (从实验室出来的新基因作物大规模种植是否会导致生态危机)

3. 转基因作物的食用安全

我自己感觉问题 1 还好说,专利不是太大的问题。市场竞争一定会出现专利方面可以制衡的另一方,再不济也有政府保障——虽然现在这个政府不太知道怎么去保障民众权利。俺只关注大公司,比如孟山都,是否会利用滥用专利权或垄断地位损害消费者利益。

问题2是真正要研究的,有可能导致灾难后果.

至于食品安全,维基有点语焉不详,只是说部分国家要求明确分开食物和饲料,以及外包装。看样子是要把选择权交给消费者。【有可能孟山都的雇员每天会上来删除对它不利的信息】

但我个人觉得我能吃地沟油,能吃三聚氰胺,被打劣质疫苗;每天被电脑手机辐射;上个互联网还常常被RESET而而火气很大...转基因食物对我个人健康,以及遗传DNA的影响(就算有影响也被基本国策湮灭了),大概是可以忽略不计的

Topic: 社会

闪电邮箱-梦工场,以及第三方应用

其实 Labs 这个东西,本来我最初是想起名为"作坊"的,一方面是俺们行业总是被称呼为作坊,另一方面我确实认为这是项手艺活,该名字非常贴切。但是这个主意肯定会被产品同学痛批,所以还是用"工场"来代替"作坊"了

如果不是来自理工专业的研究生,只能凭空想象 Labs 是什么地方吧。我把它称之为工程师梦开始的地方,希望不会遭到误解。

在我的计划里,梦工场的出产未必是用户所迫切要求,未必是产品/运营所欣赏;而完全是工程师主导的,充满了不确定,以及那么一点点小bug的项目;梦工场的另外一个考虑就是优化框架,让各项应用可以很方便的以 plugins 形式嵌入——但现在还没这么作,需要长时间的磨合。

之所以有上述这样的打算,是因为我认为未来可能有样激动人心的事情就是把WebMail作为一个平台,鼓励第三方加入开发。2月份我在twitter上说,"关于gmail,实验室就是它的appstore...另外,google apps潜在的appstore商业机会才叫一个大"。仿佛为了回应我这段话,上个星期,GoogleCode Blog连续发表两条消息,一条针对企业,"Integrate, Publish, Sell - The Google Apps Marketplace",一条针对个人应用,"Coming soon: Gmail contextual gadgets available for trusted testers"

回到现实,梦工场目前也是产品经理们的实验地,看看产品经理驱动和工程师驱动最后谁会被用户接受,也是让人期待的事情。

Topic: 商业 技术

关于 RPM 的一些事实

不喜欢有人妖魔化 rpm,尤其是如果从来没有用过 fedora/opensuse 也出来乱喷

1. 这只是一个应用的打包规范,本质上和 deb 没有什么差别。
2. 它是 LSB(Linux Standards Base) 的标准格式
3. 它支持 LZMA 压缩,比传统的 zlib 压缩比更高

4. 有一种叫 DeltaRPM 的格式,可以极大缩小每次 Update 的带宽开销。这非常酷

另外和 apt 对应的是 yum/zypper 等高级命令行工具
1. yum 的 fastestmirror 插件自动选择最快的 mirror

2. 我使用 yum 和 zypper 的时候,没有感到什么 rpm 依赖关系的麻烦

我最近两年使用的都是 rpm 的系统,确实不了解最近 deb 的进展。但就我搜索来看,LZMA,Delta Patch 这两个特性 deb 系应该还差一点.

Topic: 技术

福建南平

1. 就是报复社会,用精神病来当幌子不会增加我的安全感
2. 别以为中国禁枪老百姓就安全了。如果他有一支枪,我觉得他更可能会去市政府
3. 俺们无法独善其身

4. 所以想法让这个世界更好一些吧

Topic: 社会

国新办网络局就谷歌搜索退出中国内地发表谈话

  这位负责人指出,贵国政府在中国运营必须遵守中国宪法。贵国政府违背进入中国市场时作出的书面承诺,这是完全错误的。我们坚决反对将政治问题商业化,并表示不满和愤慨。

  这位负责人说,贵国政府在未事先与中国人民通气的情况下,公开发表声明,不愿在中国运营 “受到中国人民审查的政府”。如果贵国政府自绝于中国人民,那是贵党自己的事情,但必须按照中国法律和国际惯例,负责任地做好有关善后工作。

Topic: 社会

本周流水账

1. 周二送达达去幼儿园的时候,被她同班同学家追尾

2. 周二达达掉了第八颗牙

3. 被王菲暗涌里的钢琴迷住,遂去搜索琴谱——虽然知道自己肯定弹不来。。。结果发现漩涡也是陈辉阳的作品,汗,以前只注意两个"伟文"了。《声音变魔术(陈辉阳钢琴作品集一)》 强烈推荐

4. 周日下午看了十二怒汉。这类密室题材很好,期待啥时候大陆翻拍。理论上可以一个镜头从头跟到尾

5. 小说《嫌疑人x的献身》;之前读过东野圭吾的另一本《白夜行》,还是这本新作好看

6. 看到有人猜测盛大的"锦书"是取清照词的"云中谁寄锦书来",想到这句其实最适合的是EMail。盛大要弄个@jinshu.com邮箱才叫有文学气质呢,哈哈

订阅 RSS - qyb的博客