s-h-a-d-o-w-s-o-c-k-s本文全部全部简写为ss。

前言

对于一个程序员来说,经常要去的网站包括github,stackoverflow,google等等,可是有一点让人非常不方便的就是,大陆的长城防火墙(GFW),导致有时候这些网站上不去或者就算上去了,也特别卡。以前在市面上还能买到一些工具,现在是越来越少而且网速也不是很稳定而且还要花钱,所以,如果你和我一样不满足上述那些服务,又不怕麻烦的话,这里有一份详细而对小白友好的折腾指南。

ss简介

ss是由Clowwindy 开发的一款软件,其作用本来是加密传输资料。当然,也正因为它加密传输资料的特性,使得 GFW 没法将由它传输的资料和其他普通资料区分开来,也就不能干扰我们访问那些「不能访问」的网站了。
SS 的初始版本是使用 Python 语言开发的,而后通过开源社区的贡献,又有了很多不同语言、环境、平台下的实现:有 C#、Java、JavaScript、Go 等语言实现的,还适配了 Windows、OS X、Linux、Android、iOS、OpenWRT(主流路由器固件之一)等主流平台……所以 SS 完全是一个多语言、多环境、跨平台的开源项目。
更多详细资料可以参考维基百科,在这里不方便一一赘述。
由于github上的源码已经不再维护,不过还有一些fork,比如ssr-backup
还有一个ssr,SSR是breakwa11发起的ss分支,在ss的基础上增加了一些数据混淆方式,称修复了部分安全问题并可以提高QoS优先级。后来贡献者Librehat也为ss补上了一些此类特性,甚至增加了类似Tor的可插拔传输层功能。不过后来也已经不再维护。

运行原理

一般来说,我们上网都是简单而直接的,用户的请求通过互联网发送到服务提供方,服务提供方直接将信息反馈给用户
enter image description here
但是如果被墙了之后,每当用户需要获取信息,都经过了 GFW,GFW将它不喜欢的内容统统过滤掉,于是客户当触发 GFW 的过滤规则的时候,就会收到 Connection Reset 这样的响应内容,而无法接收到正常的内容
enter image description here
聪明的人们想到了利用境外服务器代理的方法来绕过 GFW 的过滤,其中包含了各种HTTP代理服务、Socks服务、VPN服务… 其中以 ssh tunnel 的方法比较有代表性

  1. 首先用户和境外服务器基于 ssh 建立起一条加密的通道 2-3) 用户通过建立起的隧道进行代理,通过 ssh server 向真实的服务发起请求 4-5) 服务通过 ssh server,再通过创建好的隧道返回给用户enter image description here
    由于 ssh 本身就是基于 RSA 加密技术,所以 GFW 无法从数据传输的过程中的加密数据内容进行关键词分析,避免了被重置链接的问题,但由于创建隧道和数据传输的过程中,ssh 本身的特征是明显的,所以 GFW 一度通过分析连接的特征进行干扰,导致 ssh 存在被定向进行干扰的问题

于是 clowwindy 同学分享并开源了他的解决方案

简单理解的话,ss 是将原来 ssh 创建的 Socks5 协议拆开成 server 端和 client 端,所以下面这个原理图基本上和利用 ssh tunnel 大致类似

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

服务端安装

如果服务端安装的是ss,没有混淆插件和协议插件,如果是ssr则有,如果不设置为origin和plain的话,则只有ssr客户端才能连接成功,ss客户端连接不成功,所以为了兼容,最好设置为origin和plain

如果服务端安装的是ss,没有混淆插件和协议插件,如果是ssr则有,如果不设置为origin和plain的话,则只有ssr客户端才能连接成功,ss客户端连接不成功,所以为了兼容,最好设置为origin和plain

如果服务端安装的是ss,没有混淆插件和协议插件,如果是ssr则有,如果不设置为origin和plain的话,则只有ssr客户端才能连接成功,ss客户端连接不成功,所以为了兼容,最好设置为origin和plain

更多安装方法可以参考下面两篇,里面说的比较详细。

ss_install_1

ss_install_2

  • 手动安装ss版

Debian / Ubuntu:

apt-get install python-pip
pip install shadowsocks

CentOS:

yum install python-setuptools && easy_install pip
pip install shadowsocks

windows安装请参考
ss windows

安装好了,可以直接使用

ssserver -p 443 -k password -m aes-256-cfb
# 后台运行
sudo ssserver -p 443 -k password -m aes-256-cfb --user nobody -d start
# 停止
sudo ssserver -d stop
#检查日志
sudo less /var/log/shadowsocks.log

也可以直接写好配置/etc/shadowsocks.json

{
    "server":"my_server_ip",
    "server_port":8388,
    "local_address": "127.0.0.1",
    "local_port":1080,
    "password":"mypassword",
    "timeout":300,
    "method":"aes-256-cfb",
    "fast_open": false
}
# 开始运行
ssserver -c /etc/shadowsocks.json
# 后台运行
ssserver -c /etc/shadowsocks.json -d start
ssserver -c /etc/shadowsocks.json -d stop

如何配置更多可以参考shadowsocks.json

  • 手动安装 SSR服务端

ssR

  • 一键部署ssr代码版本一

yum -y install wget
wget --no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocksR.sh
chmod +x shadowsocksR.sh
./shadowsocksR.sh 2>&1 | tee shadowsocksR.log

演示:
输入密码
演示
输入设置的端口:
演示
选择想设置的加密方式,括号里面是默认的加密方式,想设置默认的话直接按回车键。这里选择数字2(和默认一样)的aes-256-cfb的加密方式
演示
选择想设置的协议插件,默然的是origin(支持SS客户端),我们选择SSR客户端的协议插件:3
演示
选择想设置的混淆插件,默然的是plain(支持SS客户端)
演示
按照如下提示,按任意键进行自动部署
演示
演示
上图表示部署成功。从上往下依次为SSR帐号的IP、端口、密码、协议插件、混淆插件和加密方式。
最后可以重启服务器确保部署生效。重启需要在命令栏里输入reboot ,输入命令后稍微等待一会服务器就会自动重启,一般重启过程需要2~5分钟,重启过程中Xshell会自动断开连接,等VPS重启好后才可以用Xshell软件进行连接。如果部署过程中卡在某个位置超过10分钟,可以用xshell软件断开,然后重新连接你的ip,再复制代码进行部署。
这个脚本的图文演示就结束了,图中的IP仅作演示用,教程发布后会失效。有人想了,我以后有想修改密码或者端口的需求怎么办?这个脚本修改密码和端口不是很方便,需要把最初的部署代码重新输入一遍,即从头到尾部署一遍即可。

  • 一键部署ssr代码版本二(推荐使用,这个脚本方便以后想修改密码、端口什么的,而且功能更多。)

# CentOS/Debian/Ubuntu SsR单/多端口一键管理脚本:
yum -y install wget
wget -N --no-check-certificate https://softs.fun/Bash/ssr.sh && chmod +x ssr.sh && bash ssr.sh
# 备用下载地址:
yum -y install wget
wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/ssr.sh && chmod +x ssr.sh && bash ssr.sh

复制上面的代码到VPS服务器里,安装脚本后,以后只需要运行这个快捷命令就可以出现下图的界面进行设置,快捷管理命令为:bash ssr.sh
演示
如上图出现管理界面后,输入数字1来安装SSR服务端。如果输入1后不能进入下一步,那么请退出xshell,重新连接vps服务器,然后输入快捷管理命令bash ssr.sh 再尝试。
演示
根据上图提示,依次输入自己想设置的端口和密码 (密码建议用复杂点的字母组合,图中的密码只是作为演示用),回车键用于确认
演示
如上图,选择想设置的加密方式,比如10,按回车键确认
接下来是选择协议插件,如下图:
演示
选择并确认后,会出现上图的界面,提示你是否选择兼容原版,这里的原版指的是SS客户端,可以根据需求进行选择,演示选择n
之后进行混淆插件的设置。 注意:有的地区需要把混淆设置成plain才好用。因为混淆不总是有效果,要看各地区的策略的,有时候不混淆(plain)让其看起来像随机数据更好。(2017.12.1最新补充:图中演示的tls 1.2_ticket_auth已失效,会出现断流的情况,可以换用其它的混淆方式,或者不混淆,设置成plain)
演示
进行混淆插件的设置后,会依次提示你对设备数、单线程限速和端口总限速进行设置,默认值是不进行限制,个人使用的话,选择默认即可,即直接敲回车键。
演示
演示
演示
演示
之后代码就正式自动部署了,到下图所示的位置,提示你下载文件,输入:y
演示
耐心等待一会,出现下面的界面即部署完成:
演示

客户端安装

 sslocal -s 服务器地址 -p 服务器端口 -l 本地端端口 -k 密码 -m 加密方法
 # 或者写好配置文件
 sslocal -c /etc/shadowsocks/config.json
 # 配置文件的写法
{
	"server":"remote-shadowsocks-server-ip-addr",
	"server_port":443,
	"local_address":"127.0.0.1",
	"local_port":1080,
	"password":"your-passwd",
	"timeout":300,
	"method":"chacha20-ietf",
	"fast_open":false,
	"workers":1
}

浏览器安装switchyOmega

switchyOmega是Chrome & Firefox 浏览器上的一个代理扩展程序,可以轻松快捷地管理和切换多个代理设置。这样你就可以直接在浏览器上直接切换代理或者不使用代理了。
演示
下载地址1:
官网

下载地址2:
github

具体使用方法请自行百度。

ss优化

可以参考这篇文章
ss优化

谷歌bbr加速方法

相关资料

官网

维基百科

ss各种安装方法

ss优化

参考教程1

参考教程2

Ss原理解析

SS免费帐号