Category: ShadowsocksR

SSR QRcode scheme

由于日益恶劣的网络环境,本文章复制至 Github 原文,已备不时之需。

基本定义

定义base64为URL safe base64,且不带padding(没有末尾的等于号),具体格式如下:

ssr://base64(host:port:protocol:method:obfs:base64pass/?obfsparam=base64param&protoparam=base64param&remarks=base64remarks&group=base64group&udpport=0&uot=0)

其中,base64pass及之前以’:’分隔的,不可省略,而’/?’及其后面的内容,可按需要写上。
字符串使用UTF8编码,编码后必须以urlsafebase64编码,包括密码、混淆参数、协议参数、备注、group

udpport参数及uot目前仅C#客户端支持

示例:

服务器IP: 127.0.0.1
端口: 1234
密码: aaabbb
加密: aes-128-cfb
协议: auth_aes128_md5
协议参数: (空)
混淆: tls1.2_ticket_auth
混淆参数: breakwa11.moe
备注: 测试中文

生成的带备注结果:
ssr://MTI3LjAuMC4xOjEyMzQ6YXV0aF9hZXMxMjhfbWQ1OmFlcy0xMjgtY2ZiOnRsczEuMl90aWNrZXRfYXV0aDpZV0ZoWW1KaS8_b2Jmc3BhcmFtPVluSmxZV3QzWVRFeExtMXZaUSZyZW1hcmtzPTVyV0w2Sy1WNUxpdDVwYUg

生成的不带备注的标准结果(结果唯一):
ssr://MTI3LjAuMC4xOjEyMzQ6YXV0aF9hZXMxMjhfbWQ1OmFlcy0xMjgtY2ZiOnRsczEuMl90aWNrZXRfYXV0aDpZV0ZoWW1KaS8_b2Jmc3BhcmFtPVluSmxZV3QzWVRFeExtMXZaUQ

如果你生成的不带备注的结果结果与上面的不一致,那么请检查实现代码,否则可能导致部分环境下识别错误。

多链接组合

用于同时导入或导出多个链接使用

标准导出格式形如:

ssr://aaa
ssr://bbb
ssr://ccc

或者

ssr://aaa ssr://bbb ssr://ccc

即使用换行分隔或空格分隔,注意换行可能因平台不同而产生三种不同的换行格式

其它格式例如使用”|”作为分隔符,尽管多数客户端仍然能识别,但也不建议使用此格式,请不要以客户端能识别作为判断标准。

obfs 协议和混淆插件说明

由于日益恶劣的网络环境,本文章复制至 Github 原文,已备不时之需。

具体说明参阅https://github.com/breakwa11/shadowsocks-rss/blob/master/ssr.md,这里提供一个给新人简易的指导(如文档有变动以以上这个链接的文档为准)

工作原理

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

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

客户端

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

plain:不混淆,无参数

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

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

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

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

客户端的协议插件,仅建议使用origin,auth_sha1_v4,auth_aes128_md5,auth_aes128_sha1,auth_chain_a,解释如下:
origin:原版协议,为了兼容
auth_sha1_v4:较高安全性,有宽松的时间校对要求,混淆强度大
auth_aes128_md5auth_aes128_sha1:高安全性,有宽松的时间校对要求,计算量相对高一些,混淆强度较大
auth_chain_a:高安全性,有宽松的时间校对要求,计算量相对高一些,混淆强度较大

如不考虑兼容,可无视第一个,其它基本均已否决。

服务端

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

服务端的协议插件,仅auth_*系列有协议参数,其值为整数。表示允许的同时在线客户端数量,建议最小值为2。默认值64。但auth_chain_a协议例外,此协议的在线数量是实时的,精确的,参数可以最小设置为1。

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

其它说明参见客户端部分

总结

如不考虑原版的情况下,推荐使用的协议,只有auth_sha1_v4auth_aes128_md5auth_aes128_sha1auth_chain_a,推荐使用的混淆只有plain,http_simple,http_post,tls1.2_ticket_auth

不要奇怪为什么推荐plain,因为混淆不总是有效果,要看各地区的策略的,有时候不混淆让其看起来像随机数据更好

ShadowsocksR 协议插件文档

由于网络环境愈加恶劣,文章复制至 Github 原文,已备不时之需。

概要

用于方便地产生各种协议接口。实现为在原来的协议外套一层编码和解码接口,不但可以伪装成其它协议流量,还可以把原协议转换为其它协议进行兼容或完善(但目前接口功能还没有写完,目前还在测试完善中),需要服务端与客户端配置相同的协议插件。插件共分为两类,包括混淆插件和协议定义插件。

现有插件介绍

1.混淆插件

此类型的插件用于定义加密后的通信协议,通常用于协议伪装,部分插件能兼容原协议。

plain:表示不混淆,直接使用协议加密后的结果发送数据包

http_simple:并非完全按照http1.1标准实现,仅仅做了一个头部的GET请求和一个简单的回应,之后依然为原协议流。使用这个混淆后,已在部分地区观察到似乎欺骗了QoS的结果。对于这种混淆,它并非为了减少特征,相反的是提供一种强特征,试图欺骗GFW的协议检测。要注意的是应用范围变大以后因特征明显有可能会被封锁。此插件可以兼容原协议(需要在服务端配置为http_simple_compatible),延迟与原协议几乎无异(在存在QoS的地区甚至可能更快),除了头部数据包外没有冗余数据包,客户端支持自定义参数,参数为http请求的host,例如设置为cloudfront.com伪装为云服务器请求,可以使用逗号分割多个host如a.com,b.net,c.org,这时会随机使用。注意,错误设置此参数可能导致连接被断开甚至IP被封锁,如不清楚如何设置那么请留空。服务端也支持自定义参数,意义为客户端仅能填写的参数列表,以逗号分割。
本插件的高级设置(C#版、python版及ssr-libev版均支持):本插件可以自定义几乎完整的http header,其中前两行的GET和host不能修改,可自定义从第三行开始的内容。例子:
baidu.com#User-Agent: abc\nAccept: text/html\nConnection: keep-alive
这是填于混淆参数的内容,在#号前面的是上文所说的host,后面即为自定义header,所有的换行使用\n表示(写于配置文件时也可直接使用\n而不必写成\n,换行符亦会转换),如遇到需要使用单独的\号,可写为\\,最末尾不需要写\n,程序会自动加入连续的两个换行。

Read more