Know Why

Shadowsocks代理简介和配置

Shadowsocks简介

Shadowsocks,中文翻译为影梭,是一个开源的轻量级的代理工具,可提供安全稳定的Socks5代理。该项目由国人clowwindy开源。至于当时和breakwa11的争议以及喝茶事件,各位可自行google。

Shadowsocks分为服务端和客户端。服务端安装在提供网络流量出口的服务器上,客户端安装在本地或代理用户所在网络环境中的机器上,提供Socks5代理服务。目前客户端已经支持多种平台,既包括Windows,Linux,Mac OS X等PC系统,也包括iOS,Android等移动平台,也就是说配置一个代理,可以非常方便地为多种终端设备使用,有一种毕其功于一役的痛快感觉。服务端和客户端之间通过类似于Socks5但更简单且加密的协议进行通讯,同时支持TCP和UDP连接。

Shadowsocks VS SSH Tunnel

Shadowsocks相对于SSH Tunnel在穿越Firewall的优势在于:

  1. SSH Tunnel创建隧道使用的是长连接,一旦受到墙的干扰,连接会被中断需要重连。而Shadowsocks连接是实时模式,只有在有数据访问的时候才会创建隧道,并且不需要保持连接,其抗干扰和丢包容错的能力都更强,更适合国情。

  2. SSH Tunnel的连接特征相对明显,容易被Firewall通过特征分析进行定向干扰;相对而言Shadowsocks没有明显特征码,被干扰的可能性更小。

Shadowsocks安装和配置

服务端安装和配置

由于Shadowsocks基于python实现,可以方便地使用pip安装。至于如何安装python环境和pip包管理工具,可自行google。

1
pip install shadowsocks

服务端的运行也非常简单,可以直接一句命令行启动,具体见文档。也可以通过配置文件的方式来设置运行参数。配置文件可放在任意目录,这里保存为~/shadowsocks/config.json

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

配置内容非常直观,注册修改serverpassword,属性含义可参考官方文档。接着以后台运行的方式启动:

1
ssserver -c ~/shadowsocks/config.json -d start

停止服务:

1
ssserver -c ~/shadowsocks/config.json -d stop

客户端安装和配置

Shadowsocks针对不同平台有不同的图形界面客户端。PC端客户端支持基于PAC的自动代理模式,有MAC版Windows版等。移动端ios/android可以在各自应用市场下载,支持分应用的代理设置。各种配置都非常直观,这里就不多说了。

除了图形界面客户端,本人更喜欢直接在命令行里启动sslocal来启动本机的socks5代理。这里以Mac OS为例。

同样使用pip安装。客户端命令为sslocal。可以直接使用与服务端相同的配置文件运行,也可以用nohup后台运行。

1
2
3
pip install shadowsocks
sslocal -c ~/shadowsocks/config.json
nohup sslocal -c ~/shadowsocks/config.json &

此时一切就绪,其他应用就可以使用Socks5代理127.0.0.1:1080,最终通过服务端出口来访问网络了。对于Chrome,我们可以使用扩展SwitchyOmega来自动直连或使用代理。

不过对于Mac更方便的是使用Launchd实现开机自启动。Launchd分为Launch Daemons和Agents,前者为系统级,在系统启动时自动运行,后者为用户级,在用户登录时自动运行。只要在系统特定目录创建Property List文件,系统就会自动加载运行。

这里我们使用Launch Agent,创建plist文件/Library/LaunchAgents/local.shadowsocks.proxy.plist,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>local.shadowsocks.proxy</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/sslocal</string>
<string>-c</string>
<string>config.json</string>
</array>
<key>StandardOutPath</key>
<string>info.log</string>
<key>StandardErrorPath</key>
<string>error.log</string>
<key>WorkingDirectory</key>
<string>/Users/Jinde/shadowsocks</string>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
</dict>
</plist>

注意正确配置ProgramArgumentsWorkingDirectoryWorkingDirectory为Shadowsocks配置文件所在目录。之后每次重启,sslocal都会自动运行。

命令行终端使用代理

如果需要在命令行终端中使用shadowsocks的代理,可以使用proxychains,使用方法可参考Using Shadowsocks with Command Line Tools

Mac OSX下可以直接用homebrew安装:

1
brew install proxychains-ng

安装成功后可修改配置文件/usr/local/etc/proxychains.conf,在该文件末尾输入正确的socks代理地址,比如这里是socks5 127.0.0.1 1080。配置文件中的其他选项可以保留默认值,也可以参考官方文档进行配置。

之后就可以按下面方式显示使用代理,非常灵活:

1
2
proxychains4 curl https://www.facebook.com/
proxychains4 -q git push origin master

另外,也可以先把sock5代理转为http代理后给命令行使用。代理转换可以使用privoxy实现。另外,stunnel可以实现数据传输的加密。转成http代理之后,通过设置http_proxyhttps_proxy环境变量实现,如:

1
2
export http_proxy="http://username:password@proxy.domain.com:9999"
export https_proxy="http://username:password@proxy.domain.com:9999"

但这种方式是命令行下的全局代理,开关代理较为麻烦。

完毕。

热评文章