导语

ssr全名shadowsocksR,是一款代理工具,是shadowsocks的高级版,较之不带r的,带r的增加了一些数据混淆方式,甚至增加了类似Tor的可插拔传输层功能。ss和ssr基于socks5。和其他代理工具基本相同,他们使用特定的中转服务器完成数据传输。客户端在本地会构建一个socks5代理,在访问一些网站的时候,网络流量需要先通过本地代理传到客户端,然后客户端发送到服务端,反之亦然。
今天就搁着腆着脸讲一下搭建方法吧。

服务器

购买服务器在此不需要赘述了。华东华中也可以,多少也能有一点匿名性,不过记得改对应的DNS服务器哦~
有一个很帅气的网站,搭完了可以看看自己是不是搞好了
WHOER

服务端部署

首先连接上自己的服务器,顺便推销一下其他文章putty-ssh
ssr的服务端有很多语言写的版本。使用python的话可以参考他的github项目
总结我遇到的问题
在这一步

apt-get install python-pip
pip install shadowsocks

或许会出现 unable to locate package pythn-pip(大概是这个,我忘了)
只需要更新一下apt-get

apt-get update

之后在启动时,或许会遇到
AttributeError: /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1: undefined symbol: EVP_CIPHER_CTX_cleanup

这是由于openssl版本太高,在openssl1.1.0版本中,废弃了EVP_CIPHER_CTX_cleanup函数。
openssl 1.1.1版本手册 中的HISTORY部分有说明

EVP_CIPHER_CTX was made opaque in OpenSSL 1.1.0. As a result, EVP_CIPHER_CTX_reset() appeared and EVP_CIPHER_CTX_cleanup() disappeared. EVP_CIPHER_CTX_init() remains as an alias for EVP_CIPHER_CTX_reset().

所以有俩办法:回退openssl的版本或者直接改代码。我就改了代码
找到自己的python包存放的地方,如果你是直接装的应该在
/usr/local/lib/python2.7/dist-packages/shadowsocks/crypto/openssl.py
把里面的cleanup换成reset就行了。
然后设置好参数就可以啦~
(不过这是ss来着,我当时拿ssr客户端练了半天没连上,我还在纳闷为啥设置的时候没有混淆方式,然后一拍脑门,拿ss一连就成,大家千万不要像我一样,要注意小飞机的颜色哦~)

如果你觉得麻烦可以直接偷 大佬写好的ss一键安装脚本

然后我的ssr就是偷的 大佬写的ssr一键安装脚本

让我感到震惊然后释然的是,我们去 teddysun的github 会惊讶的发现并没有这个项目,然而这个项目逇usercontent还在,我们可以看到、得到他的raw文件,也许这就是自由精神吧。

当然你的客户端肯定得用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

ss同理,把链接换了就行了

客户端

可以在shadowsocks找到ss的客户端。
shadowsocksR 的github项目里找对应的版本下。

SSR协议和混淆插件

抄一下王超大佬的,感觉讲的非常清晰,很好理解。
工作原理

C->S方向

浏览器请求(socks5协议) -> ssr客户端 -> 协议插件(转为指定协议) -> 加密 -> 混淆插件(转为表面上看起来像http/tls) -> ssr服务端 -> 混淆插件(分离出加密数据) -> 解密 -> 协议插件(转为原协议) -> 转发目标服务器

其中,协议插件主要用于增加数据完整性校验,增强安全性,包长度混淆等,协议插件主要用于伪装为其它协议

客户端

客户端的协议插件暂无配置参数,混淆插件有配置参数,混淆插件列表如下:

plain:不混淆,无参数

http_simple:简易伪装为http get请求,参数为要伪装的域名,如cloudfront.com。仅在C#版客户端上支持用逗号分隔多个域名如a.com,b.net,c.org,连接时会随机使用其中之一。不填写参数时,会使用此节点配置的服务器地址作为参数。

http_post:与http_simple绝大部分相同,区别是使用POST方式发送数据,符合http规范,欺骗性更好,但只有POST请求这种行为容易被统计分析出异常。参数配置与http_simple一样

tls1.2_ticket_auth:伪装为tls请求。参数配置与http_simple一样

其它插件不推荐使用,在这里忽略

客户端的协议插件,仅建议使用origin,verify_sha1,auth_sha1_v2,auth_sha1_v4,auth_aes128_md5,auth_aes128_sha1,解释如下:

origin:原版协议,为了兼容

verify_sha1:原版OTA协议,为了兼容

auth_sha1_v2:中等安全性,无时间校对的要求,适合路由器或树莓派,混淆强度大

auth_sha1_v4:较高安全性,有宽松的时间校对要求,混淆强度大

auth_aes128_md5或auth_aes128_sha1:最高安全性,有宽松的时间校对要求,计算量相对高一些,混淆强度较大

如不考虑兼容,可无视前两个

服务端

大部分插件都可以通过添加_compatible后缀以表示兼容原版,例如默认的http_simple_compatible或auth_sha1_v4_compatible这样;

服务端的协议插件,仅auth_*系列有协议参数,其值为整数。表示允许的同时在线客户端数量,建议最小值为2。默认值64;

服务端的混淆插件,http_simple或http_post有混淆参数,用逗号分开若干个host,表示客户端仅能使用以上任一个host连接,而留空表示客户端可以使用任意host。tls1.2_ticket_auth有混淆参数,其值为整数,表示与客户端之间允许的UTC时间差,单位为秒,为0或不填写(默认)表示无视时间差。

总结

如不考虑原版的情况下,推荐使用的协议,只有auth_sha1_v4和auth_aes128_md5和auth_aes128_sha1,推荐使用的混淆只有plain,http_simple,http_post,tls1.2_ticket_auth不要奇怪为什么推荐plain,因为混淆不总是有效果,要看各地区的策略的,有时候不混淆让其看起来像随机数据更好。