Bloodline's Blog Notes and thoughts from Bloodline

构建 NetworkExtension 应用(一)

Comments

前言

个人水平实在有限,大多数时候只能依靠谷歌来解决编程中遇到的难题。可是国庆后各路科学上网工具逐一翻车,蓝灯(7 月份刚续费两年)整个十月份基本不可用,当前新版本可用但已经没有之前稳定、快速了。 Nydus 这种无良商家更是过分,整个团队直接消失(会员至少有一年多才到期)。中间试用过别的工具,也都并不稳定。

程序员的诉求很简单,编程中遇到问题的时候,能够顺利的搜索到原因和方案就可以了。于是决心自己动手,丰衣足食。本来想直接写 NetworkExtension 扩展项目的,后来觉得作为技术博客,还是介绍下技术原理比较好。知其然,更要知其所以然。

以下链接可能存在墙内打不开的情况。

Shadowsocks 相关

中国特色社会主义互联网发展史:

很久以前,访问网站很简单。

whats-shadowsocks-01

后来,GFW 出现。

whats-shadowsocks-02

翻越 GFW 比直接的方案就是:墙外有一台不受限制的服务器,我们要请求或发送的数据通过这台服务器进行中转,这就需要我们通过加密来保证与墙外服务器通讯时不被 GFW 怀疑和窃听。比较常用的技术有:HTTP 代理服务、Socks 服务、VPN 服务等,其中以 SSH tunnel 的方法比较有代表性。

whats-shadowsocks-03

  • 首先用户和墙外服务器基于 SSH 建立起一条加密的通道。
  • 用户通过建立起的隧道进行代理,通过 SSH 服务器向真实的网站发起请求。
  • 网站数据返回到 SSH 服务器,再通过创建好的隧道返回给用户。

SSH 本身基于 RSA 加密技术,GFW 无法从数据传输的过程中的加密数据内容进行关键词分析,避免了被重置链接的问题,但由于创建隧道和数据传输的过程中,SSH 的特征明显。GFW 也不是吃素的,它会通过特征分析,识别出 SSH 隧道然后进行干扰。

于是,Shadowsocks 诞生。

whats-shadowsocks-04

  • 客户端发出的请求基于 Socks5 协议跟 SS-Local 端进行通讯,由于这个 SS-Local 一般是本机或路由器或局域网的其他机器,不经过 GFW,所以解决了上面被 GFW 通过特征分析进行干扰的问题。
  • SS-Local 和 SS-Server 两端通过多种可选的加密方法进行通讯,经过 GFW 的时候是常规的 TCP 包,没有明显的特征码而且 GFW 也无法对通讯数据进行解密。
  • SS-Server 将收到的加密数据进行解密,还原原来的请求,再发送到用户需要访问的服务,获取响应原路返回。

不过关于 Shadowsocks 特征被识别的消息一直有,随时准备新的技术吧。

方案

首先需要创建 SS-Server ,也就是创建墙外的那台服务器。VPS 提供商推荐 VultrDigitalOcean(这两个链接包含了我的邀请码,注册后我们都能有优惠,也算是对我的支持,这样遇到问题请教我的时候,我也会很热情哒😆)。

方案一: 科学上网的终极姿势:在 Vultr VPS 上搭建 Shadowsocks

方案二: 使用 Linux 快照搭建 GFW.Press 服务器

几乎没遇到坑。需要注意的是 Vultr 上只要建立了服务器,就会开始计费,无论是否在运行中,所以不用的服务器请直接删掉。另外 Tokyo 和 Los Angeles 的节点貌似容易被封掉,反正我建了一个节点是 ping 不通的。

One more thing: 在部署锐速时,可能会有以下提示:

...
锐速暂不支持该内核,程序退出.自动安装判断比较严格,你可以到http://www.91yun.org/serverspeeder91yun手动下载安装文件尝试不同版本

这说明需要更换内核,过程很简单。因为我们部署的是 CentOS 6,所以执行命令:

rpm -ivh http://soft.91yun.org/ISO/Linux/CentOS/kernel/kernel-firmware-2.6.32-504.3.3.el6.noarch.rpm
rpm -ivh http://soft.91yun.org/ISO/Linux/CentOS/kernel/kernel-2.6.32-504.3.3.el6.x86_64.rpm --force

然后再执行 rpm -qa | grep kernel,查看内核是否安装成功。如果显示里面有这个内核就对了。

05

重启服务器,重新执行 wget -N --no-check-certificate https://raw.githubusercontent.com/91yun/serverspeeder/master/serverspeeder-all.sh && bash serverspeeder-all.sh 即可。

最后,向 clowwindy 及后续的维护人员致敬。

下篇将会开始我们的 iOS NetworkExtension 应用。

备注: 各种翻墙工具的个人浅见