关于ssh -D翻墙分享的一些遗补(附pac文件的改进探索)
我曾在过去的文章中提到过,由于购买的商业ssh服务器大多数只允许一个用户在一个机器上登录,因此如果你家里有超过2个电脑需要翻墙,又或者你的iPhone或者iPod touch、PSP等和你的电脑位于同一个无线路由器下,你希望你的设备同样能分享主机的ssh -D连接。 前文中我写到可以把代理服务器指向你已经创建ssh -D代理的主机,这样做在我的VM虚拟机里面是能够分享到宿主机Mac上的ssh -D连接。但是上个星期我购买了一款叫做Simplenote的软件,正当我想要同步Mac上的笔记到iPod touch上的时候发现同步失败。经过研究发现Simplenote同步需要连接Google appspot服务器,然而appspot在我所在的区域已经被“墙歼”了,于是我尝试在iPod touch上分享我Mac上的ssh -D连接,意外地失败了。测试手上的P1i通过wifi分享来自Mac上的ssh -D连接,同样失败。经过一番折腾,发现原来ssh -D默认是不响应来自远程主机发起的连接的,如果确实需要分享,你需要在ssh -D后面再加上一个-g的参数,如: ssh -D 7070 -g username@ssh.yourdomain.com 用这个参数创建的连接能够顺利把ssh -D的代理分享出去,当然了,你可能还会遇到pac文件的烦恼,毕竟每个人所要求翻墙访问的站点都不同。下面我分享一下我的pac文件的写法: // Flora AntiGFW PAC // Version 5.0 // by LeaskH.com // i@leaskh.com function FindProxyForURL(url, host) { // AntiGFW var arrStrGFWSites = [ “appspot.com”, “honeonet.spaces.live.com”, “blogger.com”, “blogspot.com”, “w3schools.com”, “box.net”, “bit.ly”, “j.mp”, “vimeo.com”, “mediafire.com”, “wordpress.com”, “tistory.com”, “aol.com”, “aim.com”, “bebo.com”, “cnn.com”, “hellotxt.com”, “dougscripts.com”, “iphone-dev.org”, “dailymotion.com”, “yylyyl.co.cc”, “googlevideo.com”, “imageshack.us”, “cafepress.com”, “twitterfeed.com”, “hotspotshield.com”, “youtube.com”, “twitpic.com”, “mckaywei.com”, “mimima.com”, “no-ip.com”, “oikos.com.tw”, “////”, “ytimg.com”, “sesawe.net”, “freemorenews.com”, “theappleblog.com”, “chinagfw.org”, “chinadigitaltimes.net”, “dropbox.com”, “facebook.com”, “s.leaskh.com”, “sites.weborigin.co.nz”, “docs.weborigin.co.nz”, “calendar.weborigin.co.nz”, “google.com/search?twitter”, “google.com/search?@”, “google.com/search?youtube”, “sites.leaskh.com”, “docs.leaskh.com”, “openvpn.net”, “simplenoteapp.com”, “code.leaskh.com”, “moderator.leaskh.com”, “calendar.leaskh.com”, “mail.weborigin.co.nz”, “mail.leaskh.com”, “yfrog.com”, “viewmorepics.myspace.com”, “messaging.myspace.com”, “*http://*twitter.com”* *]; // Block unsafe sites var arrStrUNSSites = [“74.55.154.140”]; var strActProxy = “DIRECT”; for(var iAS = 0; iAS < arrStrGFWSites.length; iAS++) { if(shExpMatch(url.toLowerCase(), “” + arrStrGFWSites[iAS].toLowerCase() + “”)) { switch (myIpAddress()) { // When I using Virtual Machine case “172.16.49.133”: // My Virtual Machine’s IP strActProxy = “PROXY 127.0.0.1:8118”; // My Privoxy Proxy on VM shared from Mac’s ssh -D break; // When I using iPod touch case “10.0.1.253”: // My iPod touch’s IP strActProxy = “SOCKS 10.0.1.254:7070”; // My iPod touch can visit my My by this IP break; // When I using Mac default: strActProxy = “SOCKS 127.0.0.1:7070”; // My real ssh –D break; }; }; }; for(var iAS = 0; iAS < arrStrUNSSites.length; iAS++) { if(shExpMatch(url.toLowerCase(), “” + arrStrUNSSites[iAS].toLowerCase() + “”)) { strActProxy = “PROXY honeonet.spaces.live.com”; // Input a site which is already blocked by GFW }; }; return strActProxy; }; 以上就是我的pac脚本,应该说用pac分配代理服务器是非常便利和强大的。pac配合ssh -D简直就是“奔向自由”的两件神器。我的pac主要有如下特点: 通过单独一个pac文件,管理你所有设备的代理服务器,不再需要为每个不同的设备配置不同的pac文件了; 把Twitter的适配URL写为:[http://twitter.com](http://twitter.com),区别于网上的写法,因为Twitter是能够通过https访问的(改host),当我们通过https访问的时候,我们不需要通过代理,对于Tiwtter重度使用者,这样能够节省下很大程度的ssh流量,这样写只有使用普通http协议访问的时候才会通过代理; 引入 google.com/search?twitter* 的写法,就是当你的Google搜索关键字包含“Twitter”的时候,也通过代理访问Google,这个写法是很有用的,当然了根据实际用途,你要把“Twitter”改为你关心的,被和谐了的关键字哦,例如“六四”等等(不许联想)。 引入 //// 的写法,就是加入一个网站你突然访问不到,你可以在URL地址后面加////,然后再尝试打开,那么这个地址就 会通过代理访问了,那就不需要每次都改pac文件才知道站点是不是被墙了,十分便利哦; 引入 google.com/search?*@ 的写法,由于Google出于私隐保护的需要,Email地址中的@符号是不会被Google索引的,所以@在搜索关键字中会被自动忽略,利用这一特性,我们在搜索一个敏感关键字的时候在关键字中插入一个@符号,那么就会自动通过代理访问Google了,由于Google会自动忽略@,所以并不会影响你的搜索结果,特别是在屏蔽比较多的图片搜索中,这个方法十分管用; 出于安全考虑,有一些站点虽然没有被墙但是我们是不愿意访问的,例如带有病毒的站点或者钓鱼站点等,这些站点也能够利用pac文件来屏蔽,因此,我的pac脚本中带有两个数组,第一个是用来分辨是否被gfw墙的站点的,这个数组叫做arrStrGFWSites,然而我还引入了另一个数组arrStrUNSSites,用来过滤不安全的站点,你把自己认为不安全的站点写在里面就行了,脚本将把这个URL指向一个被墙的站点,达到过滤的目的。 本文的pac文件大家是不能直接用在自己的网络环境里的,写出来只是为了抛砖引玉,期待有喜欢折腾的高手写出更加智能的pac文件。 服务于生活,这正是编程的意义所在。今天就写到这里。 // 补充:如果你只需要在iPhone或者iPod touch上翻墙,那么由于iPhone OS基于Unix,是可以直接创建ssh链接的,只需要Cydia安装Openssh、Openssl和Mobile Terminal就可以了。基于Linux的设备也大同小异,例如Google的Android电话。