科学上网二三事,用 SS 实现 Mac、iOS、Android、Windows 科学上网

因为一些众所周知的原因,国外一些很棒的服务和网站在我国无法正常访问,例如 Google。但“无法正常访问”不代表“无法访问”。

来源:科学上网二三事 2


通过使用代理服务器可实现穿透防火长城(GFW)1,访问被屏蔽的网络和服务的目的,即我们所说的“科学上网”。常见的科学上网方式包括:


  • VPN(虚拟专用网络)
  • shadowsocks 及相关衍生项目(如 SSR 等)
  • 其它方式(如修改 host、DNS 等方式)
VPN 是最常见的科学上网方式,几乎所有设备、所有操作系统都提供了 VPN 连接服务,毕竟 VPN 最原始的目的并不是用来科学上网2,但也因此提供了相当的便利性。但 VPN 也并非十全十美,对新手而言,VPN 最大的局限性在于不能方便地对 IP 进行分流(分流直连与限制的 IP),另外在自动连接方面 VPN 也不是很便利(包括 Mac 和 iOS 平台都不能很方便地实现自动连接)。
shadowsocks 是一款轻量级 Socks5 代理,拥有体积小、速度快、抗干扰能力强的特性,是目前主流的翻墙方式,平台支持广泛,在 iOS9 开放了 Network-Extension3 权限之后,iOS 平台也有了免越狱的 shadowsocks 代理方案。同时,shadowsocks 提供了代理规则设置,以区分需要代理的网址 IP 和不需要代理的网址 IP。
至于其他方案,例如修改 host、DNS 等方式,由于 GFW 封锁能力的提升,可以对科学上网起到辅助作用,但无法作为日常使用的方案(毕竟时不时就会挂掉)。

Mac 翻墙方案总结


作为一台电脑,翻墙方式多种多样,从最初的 VPN、OpenVPN,到现在的 shadowsocks,都有非常成熟的方案。最初我采用的是 VPN 配合路由表的方式翻墙,也大概实现了 IP 分流的效果,但是 VPN 在 Mac 上非常容易断,受网络条件影响,后来使用 OpenVPN,稳定性要好很多。期间采用了很多方法来实现自动化,比如通过判断网络情况来自动连接 VPN,每周固定时间生成新的路由表等,后来有了 SS,VPN 的方案就不再使用了。
用 SS 没那么多折腾的过程,直接下载 SS 应用,填上服务器和密码,然后选择基于 gfwlist 的 pac 就可以了,一直用着都没什么问题,国内外自动分流,速度也很理想,用了很长一段时间。中途 gfwlist 的地址从 googlecode 迁移到 github,而 SS 应用内 gfwlist 的获取地址仍然是 googlecode 的地址,从 github 下载了一个脚本,每周定时更新 pac。
期间出了一起 Dropbox 和 Gmail 的连接事故,具体可见我的博文《Dropbox 和 Gmail:解决问题和更改方式》,由 SS 换到了 GoAgentX + Proxifier,Proxifier 可以根据应用、IP、域名进行分流,并且可以选择不同的节点。但问题在于没有成熟的脚本化规则导入的方案,从网上下载了一个基于地理位置的 IP 规则,但需要手动复制粘贴导入,很麻烦。Proxifier 的方案用了将近一个月,满分 10 分给 7 分。
后来在网上了解到 COW,拥有自动探测网站是否被屏蔽的功能,COW 的介绍是:
COW 的设计目标是自动化,理想情况下用户无需关心哪些网站无法访问,可直连网站也不会因为使用二级代理而降低访问速度。
COW 是一个 HTTP(S) 代理,能最大程度兼容各种软件(可以设置为程序代理)和设备(设置为系统全局代理)。实际使用上,除了第一次连接需判断网站时会花费一点事件来检测网站是否被墙,其他时候 COW 的连接速度都非常理想,不比 SS 慢多少,COW 也有一些 SS 没有的特性,例如 设置多个二级代理,多个二级代理的设定与 Surge 的 Proxy Group 类似,COW 可以在多个二级代理中选择延迟最小的代理进行连接。但目前我所用的设定是固定连接到一台装有 COW 的服务器,当服务器不可用时,再连接到备用的 SS 节点。
使用 COW 的另一个优点在于,不用设置复杂的规则,COW 自己判定网站是否被墙,决定是否使用代理,免去了更新和维护规则的工作。
目前我仍然使用 COW 作为电脑端的代理,速度和稳定性非常满意,还未发现特别明显的缺点。

iOS Apps & Rules


iOS 一直以来都支持 VPN(基本所有设备都支持 VPN),但 iOS 的 VPN,限制很多,即使使用类似 Cisco Anyconnect 这样的应用,仍然无法保证 VPN 的稳定使用,还不支持分流。
后来某些代理供应商推出了一系列针对 iOS 的代理解决方案,在 WiFi 环境下,使用 PAC 代理方式,在蜂窝网络环境下,通过描述性文件的方式,为数据网络添加 HTTP 代理。局限性在于,某些采用 SPDY 方式连接的应用无法通过代理连接(不过现在基本已经没有了)。
在 iOS 9 之前,通过越狱来实现稳定的翻墙方案,最早的有 GoAgent(就是那个把整个 Python 都搬到 iOS 上的方式),后来使用越狱版 shadowsocks,支持代理规则和分应用代理,但 Cydia 上的 shadowsocks 已经有两年没有维护了,iOS 9 以后已经无法正常使用。
iOS9 之后 Apple 开放了 NE 权限,SS 得以在 iOS 上实现,iOS 上最早的 SS 代理是“备受争议”的 Surge。后来 NE 类 App 百花齐放,有了 ShadowRocket 和 Potatso,然后是 Wingy
我最先买了 SR 和 Potatso,最初的 SR 稳定性不好,经常出现掉线的情况,于是转而使用 Potatso,但 Potatso 也有一些小问题,DNS 解析无效,某些规则无法生效等,比如微信朋友圈图片刷不出等。后来 SR 的作者(的老婆)孩子生完,像打了鸡血一样更新 SR,从功能到稳定性再到界面基本都重做了一番,当然价格也涨了,在 Potatso 作者撸 2 代而不管 1 代死活的时候,我从 Potatso 转到了 SR。
在 SR 的规则上浪费了不少时间,一开始使用内置的规则,但这个 Default 规则很奇怪的一点在于,既包括了常用的被墙网站走代理的规则,又包括了常见国内网站直连的规则,最后还来一个 Final Proxy,不是很理解作者的逻辑。后来上网找了一个精简版 + 广告屏蔽的规则,本来用的挺好,但有一次打开网易严选,图片刷不出来。再然后使用了由 gfwlist 转换过来的规则,但 gfwlist 里无效规则非常多,效率很低。所以最后的最后,我把规则做了一下减法,保留两条规则:
GEOIP CN, Direct
Final, Proxy
简单粗暴,目前用着还没出现什么奇奇怪怪的现象。
另:事实证明,通过 SR 这类应用来屏蔽广告,真的没什么用。

Android


Android 上从很早开始就有了 SS for Android 应用,稳定性和功能都非常完善,而且还在不断更新。
说一个 Android 上的小故事:
在更早以前,还没有 SS 的时候,翻墙还是通过 VPN 的方式,2.2、2.3 时代的 Android,没有一键启动 VPN 的工具,而每次到系统设置里启动,都需要输入 VPN 密码。于是 Google Play 上出现了一款小工具,旨在帮你快速连接 VPN,其步骤是这样的:
  1. 在软件里预先设置好你的 VPN 密码;
  2. 点击“连接”,软件复制 VPN 密码,然后跳转到系统 VPN 界面;
  3. 点击要连接的 VPN,长按粘贴密码,然后连接。
有点不知道说什么好,其实这个工具我用了挺长时间的。

Windows


一直用的是 SS for Windows,似乎也没什么可说的,当然也可以使用 COW。

  1. 详见 Great Firewall – Wikipedia ↩
  2. 详见 Virtual private network – Wikipedia ↩
  3. 详见 NetworkExtension | Apple Developer Documentation ↩
发表评论