发布日期:2024-10-06 04:08 点击次数:89
用于便捷地产生各式公约接口。达成为在底本的公约外衣一层编码息争码接口,不但可以伪装成其它公约流量,还可以把原公约转折为其它公约进行兼应允完善(但现在接口功能还莫得写完,现在还在测试完善中),需要做事端与客户端建树调换的公约插件。插件共分为两类奇米影视首页,包括玷污插件和公约界说插件。
现存插件先容 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,步调会自动加入一语气的两个换行。
http_post:与http_simple绝大部分调换,分辩是使用POST方式发送数据,适合http表率,糊弄性更好,但唯有POST苦求这种行为容易被统计分析出荒谬。此插件可以兼容http_simple,同期也可兼容原公约(需要在做事端建树为http_post_compatible),参数缔造等内容参见http_simple,密切稳当若是使用自界说http header,请务必填写boundary。
random_head(不提出使用):最先通讯前发送一个险些为当场的数据包(现在末尾4字节为CRC32,会成为特征,以后会有校正版块),之后为原公约流。推测打算是让首个数据包根蒂不存在职何灵验信息,让统计学习机制见鬼去吧。此插件可以兼容原公约(需要在做事端建树为random_head_compatible),比原公约多一次抓手导致聚拢时期会长一些,除了抓手历程之后莫得冗尾数据包,不补助自界说参数。
tls1.2_ticket_auth(犀利推选):模拟TLS1.2在客户端有session ticket的情况下的抓手聚拢。现在为完整模拟达成,经抓包软件测试好意思满伪装为TLS1.2。因为有ticket是以莫得发送文凭等复杂要领,因而防火墙无法凭据文凭作念判断。同期自带一定的抗重放挫折的智商,以及包长度玷污智商。如遭受重放挫折则会在做事端log里搜索到,可以通过grep "replay attack"搜索,可以用此插件发现你场所地区涌现有莫得针对TLS的纷扰。防火墙对TLS相比窝囊为力,抗紧闭智商应该会较其它插件强,但遭受的纷扰也可能不少,不外公约本人会查验出任何关扰,遭受纷扰便断开聚拢,幸免长时期恭候,让客户端或浏览器自行重连。此插件可以兼容原公约(需要在做事端建树为tls1.2_ticket_auth_compatible),比原公约多一次抓手导致聚拢时期会长一些,使用C#客户端开启自动重连时比其它插件解析更好。客户端补助自界说参数,参数为SNI,即发送host称号的字段,此功能与TOR的meek插件零散同样,举例缔造为cloudfront.net伪装为云做事器苦求,可以使用逗号分割多个host如a.com,b.net,c.org,这时会当场使用。稳当,古怪缔造此参数可能导致聚拢被断开致使IP被紧闭,如不明晰何如缔造那么请留空。推选自界说参数缔造为cloudflare.com或cloudfront.net。做事端暂不补助自界说参数。
2.公约界说插件此类型的插件用于界说加密前的公约,频繁用于长度玷污及增强安全性和心事性,部分插件能兼容原公约。
origin:默示使用原始SS公约,此建树速率最快遵循最高,适用于限度少或审查宽松的环境。不然不提出使用。
verify_deflate(不提出):对每一个包王人进行deflate压缩,数据阵势为:包长度(2字节)|压缩数据流|原数据流Adler-32,此阵势不详了0x78,0x9C两字节的头部。另外,关于仍是压缩过或加密过的数据将难以压缩(可能增多1~20字节),而关于未加密的html文本会有可以的压缩成果。因为压缩及解压缩较占CPU,不提出较多用户同期使用此玷污插件。此插件不成兼容原公约,千万不要添加_compatible的后缀。
verify_sha1(即原版OTA公约,已毁灭):对每一个包王人进行SHA-1校验,具体公约描绘参阅One Time Auth,抓手数据包增多10字节,其它数据包增多12字节。此插件能兼容原公约(需要在做事端建树为verify_sha1_compatible)。
auth_sha1(已毁灭):对首个包进行SHA-1校验,同期会发送由客户端生成的当场客户端id(4byte)、聚拢id(4byte)、unix时期戳(4byte),之后的通讯使用Adler-32行为效验码。此插件提供了能起义一般的重放挫折的认证,默许并吞端口最多补助64个客户端同期使用,可通过修改此值限度客户端数目,使用此插件的做事器与客户机的UTC时期差不成卓绝1小时,频繁只需要客户机校对土产货时期并正确缔造时区就可以了。此插件与原公约抓手延长调换,能兼容原公约(需要在做事端建树为auth_sha1_compatible),补助做事端自界说参数,参数为10进制整数,默示最大客户端同期使用数。
auth_sha1_v2(已毁灭):与auth_sha1同样,去除时期考据,以幸免部分开荒由于时期导致无法聚拢的问题,增长客户端ID为8字节,使用较大的长度玷污。能兼容原公约(需要在做事端建树为auth_sha1_v2_compatible),补助做事端自界说参数,参数为10进制整数,默示最大客户端同期使用数。
auth_sha1_v4(不提出):与auth_sha1对首个包进行SHA-1校验,同期会发送由客户端生成的当场客户端id(4byte)、聚拢id(4byte)、unix时期戳(4byte),之后的通讯使用Adler-32行为效验码,对包长度单独校验,以起义抓包重放检测,使用较大的长度玷污,使用此插件的做事器与客户机的UTC时期差不成卓绝24小时,即只需要年份日历正确即可。能兼容原公约(需要在做事端建树为auth_sha1_v4_compatible),补助做事端自界说参数,参数为10进制整数,默示最大客户端同期使用数。
auth_aes128_md5或auth_aes128_sha1(均推选):对首个包的认证部分进诈欺用Encrypt-then-MAC模式以实在免疫认证包的CCA挫折,小心各式探伤和重防挫折,同期此公约补助单端口多用户,具体缔造方法参见breakwa11的博客。使用此插件的做事器与客户机的UTC时期差不成卓绝24小时,即只需要年份日历正确即可,针对UDP部分也有作念简陋的校验。此插件不成兼容原公约,补助做事端自界说参数,参数为10进制整数,默示最大客户端同期使用数。
auth_chain_a(犀利推选):对首个包的认证部分进诈欺用Encrypt-then-MAC模式以实在免疫认证包的CCA挫折,小心各式探伤和重防挫折,数据流自带RC4加密,同期此公约补助单端口多用户,不同用户之间无法解密数据,每次加密密钥均不调换,具体缔造方法参见breakwa11的博客。使用此插件的做事器与客户机的UTC时期差不成卓绝24小时,即只需要年份日历正确即可,针对UDP部分也有加密及长度玷污。使用此插件提出加密使用none。此插件不成兼容原公约,补助做事端自界说参数,参数为10进制整数,默示最大客户端同期使用数,最小值补助奏凯缔造为1,此插件能及时反映实质的客户端数目(你的客户端至少有一个聚拢莫得断开才智保证你占用了一个客户端数,不然缔造为1时其它客户端一聚拢别的就一定连不上)。
推选使用auth_chain_a插件,在以上插件里玷污智商较高,而抗检测智商最高,即使多东说念主使用也难以识别紧闭。同期若是要发布公开代理,以上auth插件均可严格限度使用客户端数(要稳当的是若为auth_sha1_v4_compatible,那么用户只须使用原公约就莫得限度成果),而auth_chain_a公约的限度最为精准。
玷污特质 name RTT encode speed bandwidth anti replay attack cheat QoS anti analysis plain 0 100% 100% No 0 / http_simple 0 20%/100% 20%/100% No 90 70 http_post 0 20%/100% 20%/100% No 100 70 random_head (X) 1 100% 85%/100% No 0 10 tls1.2_ticket_auth 1 98% 75%/ 95% Yes 100 90阐发:
20%/100%默示首包为20%,其余为100%速率(或带宽),其它的 RTT 大于0的玷污,前边的默示在浏览平凡网页的情况下平均灵验利用带宽的推测值,后一个默示去除抓手反映以后的值,适用于大文献下载时。 RTT 默示此玷污是否会产生附加的延长,1个RTT默示通讯数据一次往复所需要的时期。 RTT 不为0且莫得 anti replay attack 智商的玷污,岂论公约是什么,王人存在被主动探伤的风险,即不提出使用random_head。 RTT 为0的,只须公约不是 origin,就莫得被主动探伤的风险。天然由于原公约本人也存在被主动探伤的风险,在现在莫得不雅察到主动探伤行为的情况下,暂时不需要太操心。 cheat QoS 默示糊弄路由器 QoS 的智商,100默示能好意思满糊弄,0默示莫得任何作用,50分傍边默示较为严格的路由能识别出来。 anti analysis 默示抗公约分析智商,plain 的时期依赖于公约,其它的基于网友反馈而给出的分值。值为100默示好意思满伪装。 公约特质假定 method = “aes-256-cfb” 以下所有公约与均 anti CPA
name RTT encode speed bandwidth anti CCA anti replay attack anti MITM detect anti packet length analysis origin 0 100% 99% No No No 0 verify_deflate 0 30% 97%~110% No No No 6 verify_sha1 (X) 0 85% 98%/99% No No No 0 auth_sha1 (X) 0 95% 97% No Yes No 4 auth_sha1_v2 (X) 0 94% 80%/97% No Yes No 10 auth_sha1_v4 0 90% 85%/98% No Yes No 10 auth_aes128_md5 0 80% 70%/98% Yes Yes Yes 10 auth_aes128_sha1 0 70% 70%/98% Yes Yes Yes 10 auth_chain_a 0 70% 75%/98% Yes Yes Yes 15阐发:
以上为浏览平凡网页(非下载非看视频)的平均测试结果,浏览不同的网页会有不同的偏差 encode speed仅用于提供相对速率的参考,不同环境下代码实际速率不同 verify_deflate的bandwidth(灵验带宽)上限110%仅为估值,若数据经过压缩或加密,那么压缩成果会很差 verify_sha1的bandwidth意为上传平均灵验带宽98%,下载99% auth_aes128_md5的bandwidth在浏览平凡网页时较低(为了较强的长度玷污,但单个数据包尺寸会保持在 TCP MSS 以内,是以其实对网速影响很小),而看视频或下载时灵验数据比率比auth_sha1要高,可达97%,是以无谓操心下载时的速率。auth_chain_a及auth_aes128_md5类似 若是同期使用了其它的玷污插件,会令bandwidth的值镌汰,具体由所使用的玷污插件及所浏览的网页共同决定 关于抗包长度分析一列,满分为100,即0为十足无成果,5以下为成果幽微,具体分析方法可参阅方校长等东说念主论文 关于抗包时序分析一列,方校长的论文默示天然可利用,但利用难度大(也即他们还没能达到实用级),现在对此也不作念处理 玷污与公约建树提出 公约推选:公约用auth_chain_a最好,此时推选不使用加密(缔造为none),玷污简陋 加密选用:若公约用auth_chain_a,那加密用none(但不代表密码可以不写或双方不匹配),若公约不是auth_aes128_md5或auth_aes128_sha1,那么不成使用rc4加密(可用rc4-md5)。这时加密可以在rc4-md5、salsa20、chacha20-ietf三个内部选用(rc4-md5可换为aes系列,salsa20可换为chacha20或bf-cfb),若是使用SSR还可特别选用rc4-md5-6。 玷污推选:若是QoS在你的地区领略,玷污提出在http_simple与tls1.2_ticket_auth中选用,具体选用可以通过我方的涵养得出。若是选用玷污后反而变慢,那么玷污请选用plain。若是你不在乎QoS,但操心你的个东说念主vps能不成历久使用,那么玷污选用plain或tls1.2_ticket_auth,公约选用auth_chain_a或auth_aes128_md5或auth_aes128_sha1 若是你用于玩游戏,或对聚拢延长有条件的情况下,提出不要使用tls1.2_ticket_auth玷污,用其它玷污或plain 做事端里,http_simple与http_post是相互兼容的,莫得使用上的分辩 若是你在公司,或学校,或某些环境下,发现原版SS公约不可用,提出你启用http_simple、http_post或tls1.2_ticket_auth玷污,同期端口相应使用80或443,频繁能管束问题。同期能回避你场所环境下的收罗紧闭(如阻挠拜谒网盘阻挠上传等等) 若是使用tls1.2_ticket_auth玷污或不开启玷污,那么公约最好不要使用origin或verify_sha1 若是使用二重代理,一般你只需要探究越过防火墙的那一段使用玷污或加强公约,除非为了匿名 若是你发现你的代理倏得不成用了,但换一个端口又能用了,好像等15分钟到半小时后又能用了,这种情况下请关系我 建树方法做事端建树:使用最新SSR的manyuser分支 user-config.json或config.json里有一个protocol的字段,现在的可能取值为: origin verify_deflate (不提出) verify_sha1 (已逾期) verify_sha1_compatible (已逾期) auth_sha1 (已逾期) auth_sha1_compatible (已逾期) auth_sha1_v2 (已逾期) auth_sha1_v2_compatible (已逾期) auth_sha1_v4 (不提出) auth_sha1_v4_compatible (不提出) auth_aes128_md5 auth_aes128_sha1 auth_chain_a
user-config.json或config.json里有一个obfs的字段,现在的可能取值为: plain http_simple http_simple_compatible http_post http_post_compatible random_head (已逾期) random_head_compatible (已逾期) tls1.2_ticket_auth tls1.2_ticket_auth_compatible
默许为 "protocol":"auth_aes128_md5", "obfs":"tls1.2_ticket_auth_compatible", 相应的 公约插件参数默许为"protocol_param":"" 玷污插件参数默许为"obfs_param":"" 关于protocol,必须做事端与客户端严格匹配 做事端建树为xxabc_compatible时(以compatible为后缀的),即做事端补助使用原版客户端,或使用建树插件为xxabc或plain的ssr客户端。
客户端建树:使用本ssr版块,在剪辑做事器建树里找到相应节点,终末在protocol选项和obfs选项的列内外选用需要使用的插件,然后填写相应的参数即可
兼容性现在ssr-libev客户端、ssr-python及ssr-csharp补助一说念莫得标注为逾期或不推选的公约和玷污。
吻玉足 达成接口以下以C#话语为例作念阐发
interface IObfs
成员函数
InitData() 参数:无 复返:一个自界说类型变量,频繁用于保存此接口的全局信息,不应复返null,c话语中复返void* 阐发:第一次创建实例前调用,并吞做事端建树不会访佛调用,做事端在建筑监听时调用,客户端在第一次聚拢时调用。
SetServerInfo(ServerInfo serverInfo) 参数:ServerInfo结构,包含成员变量:
host: 字符串类型,做事端ip,客户端需要把域名转折为ip,如有前置代理,则奏凯使用建树时所用的域名也可,做事端需要取得监听ip port: 整数类型,做事端监听端口 param: 用户缔造的参数,字符串类型 data: 由InitData复返的结果,为object类型(c话语中使用void*) iv: 客户端或做事端加密时使用的iv数组(c话语中需要添加额外字段以记载其长度,下同) recv_iv: 客户端或做事端经受到的iv数组 key: 加密时使用的key(不是原key,是通过BytesToKey生成的指定长度数组) tcp_mss: 整数类型,TCP分包大小,缔造为1460 overhead: 整数类型,公约头部大小,需要由调用方缔造复返:无 阐发:实例构造的时期(每个聚拢建筑时)调用,调用前iv和key必须仍是运动荡;而经受到数据后先运动荡recv_iv再调用插件。
int GetOverhead() 参数:无 复返:此插件在通讯时的附加头部大小
Dispose() 参数:无 复返:无 阐发:实例析构时(每个聚拢关闭时)调用
byte[] ClientPreEncrypt(byte[] plaindata, int datalength, out int outlength) 参数:需要处理的字节数组偏执长度 复返:处理后的字节数组偏执长度 阐发:客户端发送到做事端数据加密前调用此接口
byte[] ClientEncode(byte[] encryptdata, int datalength, out int outlength) 参数:需要编码的字节数组偏执长度 复返:编码后的字节数组偏执长度 阐发:客户端发送到做事端数据加密后调用此接口
byte[] ClientDecode(byte[] encryptdata, int datalength, out int outlength, out bool needsendback) 参数:需要解码的字节数组偏执长度 复返:解码后的字节数组偏执长度,以及needsendback象征是否立即回发做事端数据。如needsendback为true,则会立即调用ClientEncode,调用时参数是一个长度为0的字节数组 阐发:客户端收到做事端数据在解密前调用此接口
byte[] ClientPostDecrypt(byte[] plaindata, int datalength, out int outlength) 参数:需要处理的字节数组偏执长度 复返:处理后的字节数组偏执长度 阐发:客户端收到做事端数据在解密后调用此接口
byte[] ServerPreEncrypt(byte[] plaindata, int datalength, out int outlength) 参数:需要处理的字节数组偏执长度 复返:处理后的字节数组偏执长度 阐发:做事端发送到客户端数据加密前调用此接口
byte[] ServerEncode(byte[] encryptdata, int datalength, out int outlength) 参数:需要编码的字节数组偏执长度 复返:编码后的字节数组偏执长度 阐发:做事端发送到客户端数据加密后调用此接口
byte[] ServerDecode(byte[] encryptdata, int datalength, out int outlength, out bool needdecrypt, out bool needsendback) 参数:需要解码的字节数组偏执长度 复返:解码后的字节数组偏执长度,以及needdecrypt象征数据是否需要解密(一般王人应该为true),以及needsendback象征是否立即回发客户端数据。如needsendback为true,则会立即调用ServerEncode并发送其复返结果,调用时参数是一个长度为0的字节数组 阐发:做事端收到客户端数据在解密前调用此接口
byte[] ServerPostDecrypt(byte[] plaindata, int datalength, out int outlength) 参数:需要处理的字节数组偏执长度 复返:处理后的字节数组偏执长度 阐发:做事端收到客户端数据在解密后调用此接口
byte[] ClientUdpPreEncrypt(byte[] plaindata, int datalength, out int outlength) 参数:需要处理的字节数组偏执长度 复返:处理后的字节数组偏执长度 阐发:客户端发送到做事端UDP数据加密前调用此接口
byte[] ClientUdpPostDecrypt(byte[] plaindata, int datalength, out int outlength) 参数:需要处理的字节数组偏执长度 复返:处理后的字节数组偏执长度 阐发:客户端收到做事端UDP数据在解密后调用此接口
byte[] ServerUdpPreEncrypt(byte[] plaindata, int datalength, out int outlength) 参数:需要处理的字节数组偏执长度 复返:处理后的字节数组偏执长度 阐发:做事端发送到客户端UDP数据加密前调用此接口
byte[] ServerUdpPostDecrypt(byte[] plaindata, int datalength, out int outlength) 参数:需要处理的字节数组偏执长度 复返:处理后的字节数组偏执长度 阐发:做事端收到客户端UDP数据在解密后调用此接口
插件编写有两类插件,一类是公约插件,一类是玷污插件
其中接口InitData, SetServerInfo, Dispose接口必须达成,其它的接口为通讯接口
编写公约插件的话,需要重写ClientPreEncrypt, ClientPostDecrypt, ServerPreEncrypt, ServerPostDecrypt,其它的按原样复返,needdecrypt必须为true,needsendback必须为false
编写玷污插件的话,需要重写ClientEncode, ClientDecode, ServerEncode, ServerDecode,其它的按原样复返。
若是编写的部分仅含客户端部分,那么只需要编写Client为前缀的两个接口,做事端同理。
现在补助此插件接口的奇米影视首页,有 ShadowsocksR C# 和 ShadowsocksR Python