树莓派之使用Shadowsocks科学上网

Shadowsocks是一个开源安全的Socks5代理,中文名称“影梭“,类似于SSH代理。与一度非常流行的基于GAE的科学上网方式相比,Shadowsocks部署简单,使用灵活;同时与全局代理的VPN不同,Shadowsocks可以仅针对浏览器代理,轻巧方便,如果说VPN是一把屠龙宝刀,那么Shadowsocks就是一把瑞士军刀,虽小巧但功能强大。

Shadowsocks原理

简单理解的话,Shadowsocks是将以前通过SSH创建的Socks5协议拆开成Server端和Client端,流程和利用SSH tunnel大致类似,下面这个示例图能简单理解其科学上网的原理。

配置/购买Shadowsocks server

偷懒在http://www.shadowsocks.com上买了两年的VPS服务,$99/y,稳如狗。

最近在知乎上看见说这是个盗版的网站,与shadowsocks官方没有关系。shadowsocks官网是https://shadowsocks.org

安装Shadowsocks client

在树莓派上配置Shadowsocks客户端, 实现树莓派通过VPS代理上网。

安装ss客户端

1
2
sudo apt-get install python-pip python-m2crypto #安装pip管理python包
sudo pip install shadowsocks #安装python版shadowsocks

设置配置文件

sudo vim /etc/shadowsocks.json #设置shadowsocks客户端配置

输入以下内容

1
2
3
4
5
6
7
8
9
10
11
{
"server":"xxx.xxx.xxx.xxx",
"server_port":xxx,
"local_address": "127.0.0.1",
"local_port":1080,
"password":"xxx",
"timeout":600,
"method":"aes-256-cfb",
"fast_open": false,
"workers": 1
}

开机启动

vim /etc/rc.local
在最后的exit之前添加
/usr/local/bin/sslocal -c /etc/shadowsocks.json -d start
运行服务
sudo systemctl status rc-local.service
检查sslocal是否正确运行
sudo systemctl status rc-local.service

如果rc.local正确运行,可以看到类似下面的的输出:

1
2
3
4
5
6
7
8
9
pi@Raspberry:~ $ systemctl status rc-local.service
● rc-local.service - /etc/rc.local Compatibility
Loaded: loaded (/lib/systemd/system/rc-local.service; static)
Drop-In: /etc/systemd/system/rc-local.service.d
└─ttyoutput.conf
Active: active (running) since Sun 2016-10-16 23:17:33 CST; 16h ago
Main PID: 769 (sslocal)
CGroup: /system.slice/rc-local.service
└─769 /usr/bin/python /usr/local/bin/sslocal -c /etc/shadowsocks.json -d start

至此已经可以实现VPS代理上网,但是使用curl www.google.com.hk依旧走不通,因为shadowsock走的Socks5协议,对于Terminal的get,wget等走Http协议的地方是无能为力的,所以需要转换成Http代理。

Shadowsocks转换HTTP代理

这里使用的转换方法是基于Polipo

安装Polipo

输入命令安装Polipo:

sudo apt-get install polipo

修改配置文件:

sudo vim /etc/polipo/config

将下面的内容整个替换到文件中并保存:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# This file only needs to list configuration variables that deviate
# from the default values. See /usr/share/doc/polipo/examples/config.sample
# and "polipo -v" for variables you can tweak and further information.
logSyslog = false
logFile = /var/log/polipo/polipo.log
socksParentProxy = "127.0.0.1:1080"
socksProxyType = socks5
chunkHighMark = 50331648
objectHighMark = 16384
serverMaxSlots = 64
serverSlots = 16
serverSlots1 = 32
proxyAddress = "0.0.0.0"
proxyPort = 8123

重启Polipo:

/etc/init.d/polipo restart

设置http_proxy环境变量

vim /etc/profile
写入
export http_proxy="127.0.0.1:8123/"

验证代理是否正常工作:

curl www.google.com

Done

Reference

  1. 树莓派折腾之:树莓派和ShadowSocks
  2. Ubuntu14.04使用Shadowsocks及转换HTTP代理