2014年5月17日星期六

Architect_009:goagent工作原理(摘录+整理)

虽然使用goagent翻墙成功了,但不知道其原理,于是研究了一下下。
想翻还没有翻墙的同学,请参考《使用goagent为电脑翻墙》。


1. http请求发送到本地代理服务器上:127.0.0.1:8087。

2. 本地代理器封装http请求数据,然后调用GAE fetch服务,即调用你之前部署在GAE 上的应用,比如:http://xxx.appspot.com/fetch.py。
这里有一个问题:就是http://xxx.appspot.com本身是被墙的,那么在这一步是如何出去的呢?
查看proxy.ini,查看iplist部分:
[iplist]
google_cn = 203.208.46.131|203.208.46.132|203.208.46.133|203.208.46.134|203.208.46.135|203.208.46.136|203.208.46.137|203.208.46.138
google_hk = www.google.com|mail.google.com|www.google.com.hk|www.google.com.tw|www.l.google.com
google_talk =talk.google.com|talk.l.google.com|talkx.l.google.com
google_ipv6 = 2404:6800:4005:c00::64|2404:6800:4005:c00::65|2404:6800:4005:c00::5e|2404:6800:4005:c00::67|2404:6800:4005:c00::2f

;google_tw = www.google.com.tw|www.google.com.sg|www.google.co.jp|www.google.sg|www.google.cat|mail.google.com|mail.l.google.com
可以发现,其中内置了两套Hosts,一套是谷歌北京的IP(203打头),一套是谷歌香港的域名,注意,这些地址是没有被墙的。
GFW还没有丧心病狂到封杀这些地址,呵呵。
因此,本地代理服务器是通过这些地址(此时还在墙内),把你的请求通过类似于VPN的东东传送给美国谷歌总部服务器(这就出去了),而GAE PaaS平台就是运行在这些服务器上,至少有几十万台服务器,你的应用就是部署并运行在GAE PaaS平台上。
另外,有一种说法是,走谷歌香港出去时,使用https加密请求,墙无法解密,也就无法墙,只好放行。
这种说法,我没有验证,除非使用sniffer之类的嗅探器查看一下数据包是不是被加密了。
验证过的朋友告诉我一下啊。

3. GAE向目标服务器发送请求,然后再一路回来。
剩下的事,就简单了,谷歌美国总部服务器向目标服务器发送请求,目标服务器返回结果给谷歌总部服务器,谷歌总部服务器再返回谷歌北京或谷歌香港服务器,然后再一路回来返回到你的浏览器。

4. 翻墙后你的机器是美国IP吗?
有人说,翻墙后用浏览器去某测IP的网站,发现IP地址是位于美国山景城就对了。
我的实验结果是,我的机器依然是在国内的,60.207.193.197,来自于北京。

5. 最后附上访问我的博客地址时,goagent代理的输出,方便分析与查看。
INFO - [May 17 11:13:33] 127.0.0.1:52226 "DIRECT GET http://csi.gstatic.com/csi?v=3&s=blogger&action=item_blogspot&it=wtsrt_.1019,tbsd_.2924,tbnd_.2&srt=1019&tbsrt=3944&tran=15&blogId=6169420854489130819&e=templatesV1&rt=headEnd.5236,widgetJsBefore.5252,widgetJsStart.5260,widgetJsEnd.5282,prt.5282,ol.15162 HTTP/1.1" 204 0
INFO - [May 17 11:13:35] 127.0.0.1:52192 "URL GET http://maping930883.blogspot.com/2014/05/cloud020.html HTTP/1.1" 304 0
INFO - [May 17 11:13:35] 127.0.0.1:52366 "MOCK GET http://www.google.com/uds/css/gsearch.css HTTP/1.1" 301 0
INFO - [May 17 11:13:37] 127.0.0.1:52141 "URL GET https://www.blogger.com/dyn-css/authorization.css?targetBlogID=6169420854489130819&zx=14bce8c5-1b49-473b-985e-fc32ee9c7eac HTTP/1.1" 200 89
WARNING - [May 17 11:13:41] create_tcp_connection to 'www.google.com' with [('74.125.128.94', 443), ('74.125.128.17', 443), ('74.125.128.147', 443), ('74.125.128.94', 443)] return timeout('timed out',), try again.
INFO - [May 17 11:13:41] 127.0.0.1:52368 "FWD CONNECT www.google.com:443 HTTP/1.1" - -
INFO - [May 17 11:13:42] 127.0.0.1:52402 "FWD CONNECT csi.gstatic.com:443 HTTP/1.1" - -
INFO - [May 17 11:13:43] 127.0.0.1:52397 "FWD CONNECT accounts.google.com:443 HTTP/1.1" - -
INFO - [May 17 11:13:43] 127.0.0.1:52392 "FWD CONNECT apis.google.com:443 HTTP/1.1" - -
INFO - [May 17 11:13:44] 127.0.0.1:52359 "URL GET http://maping930883.blogspot.com/2014/05/cloud020.html?action=backlinks&widgetId=Blog1&widgetType=Blog&responseType=js&postID=4196305914791045908 HTTP/1.1" 200 333
INFO - [May 17 11:13:44] 127.0.0.1:52141 "URL GET https://www.blogger.com/navbar.g?targetBlogID=6169420854489130819&blogName=%E7%83%AD%E7%88%B1Java+%EF%BC%8C%E7%83%AD%E7%88%B1%E7%94%9F%E6%B4%BB&publishMode=PUBLISH_MODE_BLOGSPOT&navbarType=TAN&layoutType=LAYOUTS&searchRoot=http://maping930883.blogspot.com/search&blogLocale=zh_CN&v=2&homepageUrl=http://maping930883.blogspot.com/&targetPostID=4196305914791045908&blogPostOrPageUrl=http://maping930883.blogspot.com/2014/05/cloud020.html&vt=5704430368953175731&usegapi=1&jsh=m%3B%2F_%2Fscs%2Fapps-static%2F_%2Fjs%2Fk%3Doz.gapi.zh_CN.SmwPUR6ZzZM.O%2Fm%3D__features__%2Fam%3DAQ%2Frt%3Dj%2Fd%3D1%2Fz%3Dzcms%2Frs%3DAItRSTNjvLOR7hGyEIN5zmy19Buv4UHWRQ HTTP/1.1" 200 2978
INFO - [May 17 11:13:48] 127.0.0.1:52411 "URL GET http://andrejusb.blogspot.com/favicon.ico HTTP/1.1" 200 412

参考文献:
1. http://www.zhihu.com/question/20370059
2. http://goagent.ldsf.info/goagent的工作原理/
3. http://www.dewen.org/q/8739/goagent翻墙的原理是什么呢?
4. https://code.google.com/p/goagent/issues/detail?id=714

没有评论: