Shadowsockets Introduce

一、简介

1.原因

GFW(Great Fire Wall, 网络防火城墙)。

2.方法

Shodowsockets转发请求。代理服务器隐藏了请求客户端(正向代理),因此请求不被拦截。

3.流程

以访问google为例:
①用户发起网络请求,浏览器访问google。
②请求发送到本地代理客户端(shadowsockets客户端)。
③本地代理拿到请求数据,发送到墙外的代理服务器(shadowsockets服务端)。
④代理服务器向google发起请求, 收到响应数据后,再返回给代理客户端。
⑤代理客户端将响应数据交给浏览器,请求完成。

二、准备

一台可访问的墙外服务器(VPN供应商如Vultr、搬瓦工、亚马逊等), 推荐Vultr。

三、安装

1.服务端

centos安装shadowsockets, 使用pip(python install package)

1
2
3
4
5
6
7
8
①first step:
yum -y update
yum -y install python-pip
yum install python-setuptools && easy_install pip
②second step:
pip install shadowsocks

创建配置文件/etc/shadowsockets

1
2
3
4
5
6
{
"server":"0.0.0.0",
"server_port":8388,
"password":"mypassword",
"method":"aes-256-cfb"
}

server值0.0.0.0指当前服务器。
服务端口任选未使用的端口号,之后shadowsockets客户端会通过该端口连接。
起服命令,前台运行

1
ssserver -c /etc/shadowsocks.json

后台运行

1
2
ssserver -c /etc/shadowsocks.json -d start
ssserver -c /etc/shadowsocks.json -d stop

2.客户端

服务端源码以及各平台的客户端下载前往github:传送
客户端下载安装后,通过图形界面配置shadowsocket服务端地址及密码后,即可访问google等墙外资源。
shadowsocks_client_ui
此时可查看客户端json配置包含如下:

1
2
3
4
5
6
7
{
"server": "$server_address",
"server_port": 8388,
"password": "mypassword",
"method": "aes-256-cfb",
"remarks": "myserver"
}

3.移动端

应用

以上安装支持Windows、MacOS、Android。
IOS平台有付费App支持Shadowsockets,如SuperWingy、RocketWingy、ShadowRocket。
应用配置完成后,可随时随地访问墙外资源。

Http代理

前提:局域网的一台电脑已可访问墙外资源,同时在shadowsockets客户端,右键选择允许来自局域网的连接。

移动端配置:手机、平板等移动设备,连接局域网后,点击无线局域网详细信息,找到http代理,选择自动,URL填可翻墙电脑的代理客户端地址,如

1
http://$ip:1080/pac

此时移动端设备已可访问墙外资源。
另外,局域网的其他电脑也可通过设置Http代理访问墙外资源,如chrome浏览器设置->高级->打开代理设置->连接->局域网设置->代理服务器,配置地址(如上述$ip)及端口(1080)后即可。

4.常见问题

1.安装或启动shadowsocks报错如

1
ImportError: No module named pkg_resources

解决如下:

1
2
wget https://svn.apache.org/repos/asf/oodt/tools/oodtsite.publisher/trunk/distribute_setup.py
python distribute_setup.py

以上执行脚本distribute_setup.py报错为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Downloading http://pypi.python.org/packages/source/d/distribute/distribute-0.6.14.tar.gz
Traceback (most recent call last):
File "distribute_setup.py", line 485, in <module>
main(sys.argv[1:])
File "distribute_setup.py", line 480, in main
tarball = download_setuptools()
File "distribute_setup.py", line 193, in download_setuptools
src = urlopen(url)
File "/usr/local/lib/python2.7/urllib2.py", line 154, in urlopen
return opener.open(url, data, timeout)
File "/usr/local/lib/python2.7/urllib2.py", line 435, in open
response = meth(req, response)
File "/usr/local/lib/python2.7/urllib2.py", line 548, in http_response
'http', request, response, code, msg, hdrs)
File "/usr/local/lib/python2.7/urllib2.py", line 473, in error
return self._call_chain(*args)
File "/usr/local/lib/python2.7/urllib2.py", line 407, in _call_chain
result = func(*args)
File "/usr/local/lib/python2.7/urllib2.py", line 556, in http_error_default
raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 403: SSL is required

将文件中的http://pypi.python.org/packages/source/d/distribute/distribute-0.6.14.tar.gz改为https即可
2.前提:shadowsocks服务进程运行正常,查防火墙,端口是放开的。
问题:shadowsocks客户端开启后,仍然不可访问google, 查看客户端日志,报错为

1
2
3
System.InvalidOperationException: 同一个套接字上正在进行另一个异步操作时,不能调用 BeginConnect。
在 System.Net.Sockets.Socket.BeginConnect(EndPoint remoteEP, AsyncCallback callback, Object state)
在 Shadowsocks.Controller.Handler.StartConnect()

telnet端口,报

1
Could not open connection to the host, Connect failed

此时,毫无疑问,端口被墙了!换个端口即可。多次尝试端口不好使,可能ip被墙了!服务器换个ip如vultr重新deploy一台机器。
3.多用户(端口)配置
单端口配置为

1
2
3
4
5
6
{
"server":"0.0.0.0",
"server_port":8388,
"password":"mypassword",
"method":"aes-256-cfb"
}

改为多端口:

1
2
3
4
5
6
7
8
9
{
"server":"0.0.0.0",
"port_password":{
"6066":"mypassword1",
"8389":"mypassword2",
"9099":"mypassword3"
},
"method":"aes-256-cfb"
}

四、应用

完成上述搭建便有了ladder,可用于google日常问题查找。
此外,网站服务(尤其是前端资源)建议部署在境外机器,境内备案流程繁琐且漫长(阿里限制不足三个月的实例机器无法备案)。
但是境外机器ip受限(有时部分运营商网络无法访问),重点是速度慢,所以可考虑域名指向及前端资源为境外机器,服务端部署在境内机器。