翻越GFW的正确姿势

天才第一步

Posted by Yeoman on 2016-12-12

写在前面

刚开始工作的时候老大给了一个支持PPTP协议的VPN账号,听说墙外的世界还是比较美(zhen)好(shi)的。那个时候虽然可以成功FQ,但是有几个问题一直比较困扰我:

  1. VPN访问网页的速度非常有限。
  2. 每次在切换网络状态(从4G到wifi)的时候,VPN必须断线重连。
  3. 所有的请求都会被代理,导致访问国内的站点速度也非常慢。

自iOS 10和OS X –> macOS之后,就不再支持PPTP协议的VPN了。因此也准备花点时间好好倒腾一下FQ这件事,没想到收益良多。

网上已经有很多文章来介绍 在VPS搭建一个FQ服务 这样一个事情,整个过程也相对比较简单。不过我在这个学习的过程中还是碰到挺多新概念的,涨了不少姿势。因此我觉得有必要写一篇文章来记录一下我在 搭建FQ服务 的整个过程。

为了不重复造轮子,同时为了回应自己的第一篇 文章, 这篇文章不会罗列文档内容,而只提供工具链接,相信对于读者搭建FQ服务已经足矣。不想听我叨叨,直接想看搭建方法可以点击 这里

为什么需要FQ

原因很简单,因为GFW(Great Firewall)的存在,让我们无法访问类似google,facebook,instagram等国外服务。但作为一名互联网从业者,我认为掌握一些 科学上网 的姿势是非常有必要的。

目前常用FQ技术

目前个人用户最常用的FQ手段不外乎两种:

注意: 这里指的只是FQ技术,不包括穿墙等技术

  • VPN(Virtual Private Network),基于PPTP,L2TP,IPSec,IKEv2等协议。
  • SSH(Secure Shell),目前最好用的应该是 clowwindy 开源的Socks5代理。

VPN原理简介

VPN方式下,必须让客户端和VPN服务器先建立连接。这个时候本地VPN客户端会通过 操作系统 的接口创建一个虚拟的网卡,后续整个操作系统的网络通讯都可以通过这张虚拟网卡进行收发。vpn

  1. VPN客户端启动成功之后,操作系统的缺省路由就被改成了VPN本身。
  2. 之后客户端发出去的请求会先由VPN客户端加密发送给VPN服务器,(这个时候由于数据是被加密的,GFW无法通过内容来进行关键词解析)
  3. 再由VPN服务器解密,来转发给目标服务器。这样通过VPN协议的加密通讯和一台没有被墙的VPN服务器就绕过了GFW而实现了FQ的效果。

shadowsocks原理简介

shadowsocks 基于ssh协议,将Socks5协议拆分成Server端和Client端。
工作原理如图:
vpn
可以看出,shadowsocks是在Local和Server端同时代理的。

  1. 客户端发出的请求基于 Socks5 协议跟 Local 端进行通讯
  2. Local 和 Server 通过多种可选的加密方法进行通讯,这和VPN方式类似,GFW同样无法做关键字分析过滤
  3. Server端解密,然后代理请求,再返回给客户端

VPN VS shadowsocks

回来困扰我的那几个问题上,来看看这两者的差异:

  1. VPN和shadowsocks都需要remote的服务器做代理请求,因此服务器的地域和带宽对FQ速度影响较大,我在相同一台VPS上同时部署了VPN和shadowsocks,shadowsocks速度较优。
  2. 传统的VPN方案都会在切换网络的时候断开链接,而 IKEv2 是唯一使用 “MOBIKE” – Mobility and Multihoming 技术来达到加密通讯不中断目的的协议。而shadowsocks的代理是在应用层,所以切换网络也不会中断。
  3. 开头提到的第三点,也是在我看来一个VPN方案选择最重要的一点,在需要FQ的时候走代理,而访问国内站点的时候走本地网络。
    从上述原理简介来看,VPN其实是接管了整个系统的网络通讯,是在IP层工作的,因此VPN方式只能通过筛选IP来选择使用哪一张网卡。而shadowsocks可以在URL的级别上筛选网址走加密通道。
    shadowsocks本身就是支持 PAC(Proxy auto-config)方式代理的。一个PAC文件就是一个JSON白名单对象,像 这样

如何在自己的VPS上搭建FQ服务器

1. 购买一台VPS

VPS的选择有很多,比如 DigitalOcean搬瓦工,AWS还有12个月的 免费服务。我目前用的就是AWS的EC2。购买完成之后,通过ssh的方式连接到服务器。ssh-server

2. 部署VPN服务

strongSwan 是在Linux系统下IPsec协议的实现。因此我们要在Linux下部署VPN服务就需要用到strongSwan。
这里给一个我找到的,使用strongSwan,并适用于Ubuntu/CentOS的IKEV2/L2TP的 VPN部署脚本。脚本的作者已经详细介绍了脚本的使用方法。
这里需要注意一点,如果要用ikeV2的协议,需要将生成的证书导入到需要FQ的设备中并且信任。如果是iOS设备,可以通过发送到自己的邮箱,然后手机在邮箱中打开,系统会自动添加证书到设备。

3. 部署shadowsocks服务

shadowsocks的部署相对要简单一些,直接看官网 教程 就可以完成部署了。下面是我的shadowsocks的配置文件:

{
    "server":"my_server_ip",
    "server_port":10240,
    "local_address": "127.0.0.1",
    "local_port":10240,
    "password":"mypassword",
    "timeout":300,
    "method":"aes-256-cfb",
    "fast_open": false 
}

这里讲下我在部署的过程中碰到的一个坑,我在部署完成之后,并且打开shadowsocks客户端,还是无法访问Google。根据shadowsocks的工作原理,我的调试过程如下:

// 检查本地端口工作情况,这里是mac环境下
// port 就是你在local_port填写的端口
lsof -i:port

本地端口正常工作,再检查服务器端口,在服务器上输入:

// port 就是上面文件中的server_port
sudo netstat -anp|grep port

我发现服务器端口也已经正常工作了,这时候可能出问题的环节就是 ss-local 访问 ss-server 出现问题了。然后马上检查了AWS的安全组设置,发现确实是只打开了ssh端口,设置成允许全部流量和全部端口。aws
自此,成功FQ,Google大法好唉【唱】。
aws

Tips

iOS平台的shadowsocks客户端已经被强制要求下架了,目前我用的是wingy。