├── .github └── issue_template.md ├── auth_aes128.md ├── doc ├── auth_aes128.md └── auth_chain_a.md ├── img └── ssie.png ├── readme.md ├── shadowsocks-win.xml ├── shadowsocksr-win.xml ├── ssr.md └── update └── ssr-win-3.8.xml /.github/issue_template.md: -------------------------------------------------------------------------------- 1 | 之所以写中文,本issue是写给打算写给乱发中文问题的人看的 2 | 3 | 1. 不欢迎小白,不回答诸如软件如何使用,如何搭建,如何配置,使用速度不快,如何提速等等和软件问题无关的问题,或把开发者当成客服的问题 4 | 2. 这里用于反馈软件可能的Bug,软件潜在的问题,和软件功能需求及讨论 5 | 3. 同一个issue不得在不同repo重复发,除非你发现发错地方(这种情况下你自行删除错误的issue),否则直接关闭且不回答问题,严重者拉黑名单 6 | 4. 建议你把问题事先在其它社区或和其它使用者讨论过,以确认不是密码错误,协议或插件错误,或服务器防火墙没关诸如此类本来应该自己解决的问题 7 | 5. 在你确认你需要发问题时,请尽可能提供详细的信息,包括服务端客户端具体版本,及相应log,及相应服务端客户端协议混淆等等的配置。如信息明显过少,则直接close不理踩 8 | 9 | 确认你读完以上内容后,请删除以上所有内容,然后写下你的问题 10 | 11 | Please remove all above then write down your issue -------------------------------------------------------------------------------- /auth_aes128.md: -------------------------------------------------------------------------------- 1 | # auth_aes128_md5 2 | 3 | ### TCP 4 | 5 | #### 1. The structure of a handshake request (before encryption) 6 | ``` 7 | whole request 8 | +--------+--------+----------+ 9 | | part 1 | part 2 | part 3 | 10 | +--------+--------+----------+ 11 | | 7 | 24 | Variable | 12 | +--------+--------+----------+ 13 | part 1 14 | +--------+----------+ 15 | | Random | HMAC-MD5 | 16 | +--------+----------+ 17 | | 1 | 6 | 18 | +--------+----------+ 19 | part 2 20 | +-----+----------------------------+----------+ 21 | | UID | AES-128-CBC encrypted data | HMAC-MD5 | 22 | +-----+----------------------------+----------+ 23 | | 4 | 16 | 4 | 24 | +-----+----------------------------+----------+ 25 | part 3 26 | +--------------+------------------+----------+ 27 | | Random bytes | Origin SS stream | HMAC-MD5 | 28 | +--------------+------------------+----------+ 29 | | Variable | Variable | 4 | 30 | +--------------+------------------+----------+ 31 | AES-128-CBC encrypted data (before encryption) 32 | +-----+-----+---------------+-------------+---------------------+ 33 | | UTC | CID | Connection ID | pack length | Random bytes length | 34 | +-----+---------------------+-------------+---------------------+ 35 | | 4 | 4 | 4 | 2 | 2 | 36 | +-----+-----+---------------+-------------+---------------------+ 37 | The key of AES128 encryption is: 38 | Base64(encrypt_key) + salt 39 | salt is "auth_aes128_md5" 40 | The IV of AES128 encryption is: "\x00" * 16 41 | UTC, Connection ID, pack length, Random bytes length are little-endian 42 | Connection ID is an unsigned 32bit integer, it must +1 after each handshake request sent 43 | CID is randomly generated by SSR client. And Connection ID need to be initialized with a random integer between 0~0xFFFFFF when generate a new CID 44 | Client must keep the CID value until Connection ID exceed 0xFF000000 45 | 46 | The encrypt_key is user definition or stream encryption key 47 | ``` 48 | Notice: The HMAC key in part 1 and part 2 is: 49 | IV + key 50 | 51 | The HMAC key in part 3 is user customized or stream encryption key 52 | 53 | The HMAC input in part 1 is the Random byte in part 1 54 | 55 | The HMAC input in part 2 is whole data in part 2 except HMAC itself 56 | 57 | The HMAC input in part 3 is whole data of the handshake request 58 | 59 | #### 2. The structure of any other packet 60 | ``` 61 | +------+----------+--------------+-------------------------+----------+ 62 | | size | HMAC-MD5 | Random bytes | Payload | HMAC-MD5 | 63 | +------+----------+--------------+-------------------------+----------+ 64 | | 2 | 2 | Variable | size - Random bytes - 8 | 4 | 65 | +------+----------+--------------+-------------------------+----------+ 66 | 67 | The "size" is the whole packet size, little-endian 68 | ``` 69 | Random bytes: 70 | If the first byte is 255 then `bytes[1] | bytes[2] << 8` is the length of the Random bytes, otherwise bytes[0] is the length of the Random bytes 71 | 72 | The HMAC key is user customized key + Chunk ID. Chunk ID is a 32bit unsigned integer counted from 1 and must be converted to little-endian. 73 | 74 | ### UDP 75 | 1.Client to server 76 | ``` 77 | +----------+-----+----------+ 78 | | Payload | UID | HMAC-MD5 | 79 | +----------+-----+----------+ 80 | | Variable | 4 | 4 | 81 | +----------+-----+----------+ 82 | ``` 83 | The HMAC key is user customized or stream encryption key 84 | 85 | 2.Server to client 86 | ``` 87 | +----------+----------+ 88 | | Payload | HMAC-MD5 | 89 | +----------+----------+ 90 | | Variable | 4 | 91 | +----------+----------+ 92 | ``` 93 | The HMAC key is user customized or stream encryption key 94 | 95 | 96 | 97 | # auth_aes128_sha1 98 | 99 | Instead of MD5, the HMAC function for `auth_aes128_sha1` is SHA1, and salt is "`auth_aes128_sha1`", rest are the same. -------------------------------------------------------------------------------- /doc/auth_aes128.md: -------------------------------------------------------------------------------- 1 | # auth_aes128_md5 2 | 3 | ### TCP 4 | 5 | #### 1. The structure of a handshake request (before encryption) 6 | ``` 7 | whole request 8 | +--------+--------+----------+ 9 | | part 1 | part 2 | part 3 | 10 | +--------+--------+----------+ 11 | | 7 | 24 | Variable | 12 | +--------+--------+----------+ 13 | part 1 14 | +--------+----------+ 15 | | Random | HMAC-MD5 | 16 | +--------+----------+ 17 | | 1 | 6 | 18 | +--------+----------+ 19 | part 2 20 | +-----+----------------------------+----------+ 21 | | UID | AES-128-CBC encrypted data | HMAC-MD5 | 22 | +-----+----------------------------+----------+ 23 | | 4 | 16 | 4 | 24 | +-----+----------------------------+----------+ 25 | part 3 26 | +--------------+------------------+----------+ 27 | | Random bytes | Origin SS stream | HMAC-MD5 | 28 | +--------------+------------------+----------+ 29 | | Variable | Variable | 4 | 30 | +--------------+------------------+----------+ 31 | AES-128-CBC encrypted data (before encryption) 32 | +-----+-----+---------------+-------------+---------------------+ 33 | | UTC | CID | Connection ID | pack length | Random bytes length | 34 | +-----+---------------------+-------------+---------------------+ 35 | | 4 | 4 | 4 | 2 | 2 | 36 | +-----+-----+---------------+-------------+---------------------+ 37 | The key of AES128 encryption is: 38 | Base64(encrypt_key) + salt 39 | salt is "auth_aes128_md5" 40 | The IV of AES128 encryption is: "\x00" * 16 41 | UTC, Connection ID, pack length, Random bytes length are little-endian 42 | Connection ID is an unsigned 32bit integer, it must +1 after each handshake request sent 43 | CID is randomly generated by SSR client. And Connection ID need to be initialized with a random integer between 0~0xFFFFFF when generate a new CID 44 | Client must keep the CID value until Connection ID exceed 0xFF000000 45 | 46 | The encrypt_key is user definition or stream encryption key 47 | ``` 48 | Notice: The HMAC key in part 1 and part 2 is: 49 | IV + key 50 | 51 | The HMAC key in part 3 is user customized or stream encryption key 52 | 53 | The HMAC input in part 1 is the Random byte in part 1 54 | 55 | The HMAC input in part 2 is whole data in part 2 except HMAC itself 56 | 57 | The HMAC input in part 3 is whole data of the handshake request 58 | 59 | #### 2. The structure of any other packet 60 | ``` 61 | +------+----------+--------------+-------------------------+----------+ 62 | | size | HMAC-MD5 | Random bytes | Payload | HMAC-MD5 | 63 | +------+----------+--------------+-------------------------+----------+ 64 | | 2 | 2 | Variable | size - Random bytes - 8 | 4 | 65 | +------+----------+--------------+-------------------------+----------+ 66 | 67 | The "size" is the whole packet size, little-endian 68 | ``` 69 | Random bytes: 70 | If the first byte is 255 then `bytes[1] | bytes[2] << 8` is the length of the Random bytes, otherwise bytes[0] is the length of the Random bytes 71 | 72 | The HMAC key is user customized key + Chunk ID. Chunk ID is a 32bit unsigned integer counted from 1 and must be converted to little-endian. 73 | 74 | ### UDP 75 | 1.Client to server 76 | ``` 77 | +----------+-----+----------+ 78 | | Payload | UID | HMAC-MD5 | 79 | +----------+-----+----------+ 80 | | Variable | 4 | 4 | 81 | +----------+-----+----------+ 82 | ``` 83 | The HMAC key is user customized or stream encryption key 84 | 85 | 2.Server to client 86 | ``` 87 | +----------+----------+ 88 | | Payload | HMAC-MD5 | 89 | +----------+----------+ 90 | | Variable | 4 | 91 | +----------+----------+ 92 | ``` 93 | The HMAC key is user customized or stream encryption key 94 | 95 | 96 | 97 | # auth_aes128_sha1 98 | 99 | Instead of MD5, the HMAC function for `auth_aes128_sha1` is SHA1, and salt is "`auth_aes128_sha1`", rest are the same. -------------------------------------------------------------------------------- /doc/auth_chain_a.md: -------------------------------------------------------------------------------- 1 | # auth_chain_a 2 | 3 | ### TCP 4 | 5 | #### 1. The structure of a handshake request (before encryption) 6 | ``` 7 | whole request 8 | +--------+--------+ 9 | | part 1 | part 2 | 10 | +--------+--------+ 11 | | 12 | 24 | 12 | +--------+--------+ 13 | part 1 14 | +--------+----------+ 15 | | Random | HMAC-MD5 | 16 | +--------+----------+ 17 | | 4 | 8 | 18 | +--------+----------+ 19 | part 2 20 | +-----+----------------------------+----------+ 21 | | UID | AES-128-CBC encrypted data | HMAC-MD5 | 22 | +-----+----------------------------+----------+ 23 | | 4 | 16 | 4 | 24 | +-----+----------------------------+----------+ 25 | AES-128-CBC encrypted data (before encryption) 26 | +-----+-----+---------------+----------+---------+ 27 | | UTC | CID | Connection ID | overhead | reserve | 28 | +-----+---------------------+----------+---------+ 29 | | 4 | 4 | 4 | 2 | 2 | 30 | +-----+-----+---------------+----------+---------+ 31 | part 1 HMAC is client_hash 32 | part 2 HMAC is server_hash 33 | UID is xor with client_hash from 9th byte to 12nd byte 34 | All length or size or timer are little-endian 35 | The key of AES128 encryption is: 36 | Base64(user_key) + salt 37 | salt is "auth_chain_a" 38 | The IV of AES128 encryption is: "\x00" * 16 39 | Connection ID is an unsigned 32bit integer, it must +1 after each handshake request sent 40 | CID is randomly generated by SSR client. And Connection ID need to be initialized with a random integer between 0~0xFFFFFF when generate a new CID 41 | Client must keep the CID value until Connection ID exceed 0xFF000000 42 | overhead is protocol overhead size + obfs overhead size 43 | 44 | The user_key is user definition or stream encryption key 45 | ``` 46 | Notice: The HMAC key in part 1: 47 | IV + key 48 | 49 | The HMAC key in part 2: 50 | user\_key 51 | 52 | The HMAC input in part 1 is the Random byte in part 1 53 | 54 | The HMAC input in part 2 is whole data in part 2 except HMAC itself 55 | 56 | #### 2. The structure of any other packet 57 | ``` 58 | +------+--------------+---------+--------------+----------+ 59 | | size | Random bytes | Payload | Random bytes | HMAC-MD5 | 60 | +------+--------------+---------+--------------+----------+ 61 | | 2 | Variable | size | Variable | 2 | 62 | +------+--------------+---------+--------------+----------+ 63 | 64 | The "size" is the Payload size, little-endian 65 | ``` 66 | size is xor with client\_hash or server\_hash last 2 bytes 67 | Random bytes length is genarated by xorshift128plus which init with client\_hash & size if send to server or with server\_hash & size if send to client 68 | 69 | Payload encrypted by RC4 method with key Base64(user\_key)+Base64(client\_hash) 70 | 71 | The HMAC key is user\_key + Chunk ID. Chunk ID is a 32bit unsigned integer counted from 1 and must be converted to little-endian. The HMAC result become new client\_hash or server_hash for next chunk. 72 | 73 | Notice: 74 | first 2 bytes of the Payload of the first packet which server sent is TCP_MSS 75 | 76 | ### UDP 77 | 1.Client to server 78 | ``` 79 | +---------+--------------+--------+-----+----------+ 80 | | Payload | Random bytes | Random | UID | HMAC-MD5 | 81 | +---------+--------------+--------+-----+----------+ 82 | |Variable | Variable | 3 | 4 | 1 | 83 | +---------+--------------+--------+-----+----------+ 84 | ``` 85 | let mac\_code is HMAC(Random, stream\_encryption\_key) 86 | UID is xor with mac\_code from 1st byte to 4th byte 87 | Random bytes length is genarated by xorshift128plus which init with mac_code 88 | Payload encrypted by RC4 method with key Base64(user\_key)+Base64(mac\_code) 89 | The final HMAC key is user\_key 90 | 91 | 2.Server to client 92 | ``` 93 | +---------+--------------+--------+----------+ 94 | | Payload | Random bytes | Random | HMAC-MD5 | 95 | +---------+--------------+--------+----------+ 96 | |Variable | Variable | 7 | 1 | 97 | +---------+--------------+--------+----------+ 98 | ``` 99 | let mac\_code is HMAC(Random, stream\_encryption\_key) 100 | Random bytes length is genarated by xorshift128plus which init with mac_code 101 | Payload encrypted by RC4 method with key Base64(user\_key)+Base64(mac\_code) 102 | The final HMAC key is user\_key 103 | 104 | -------------------------------------------------------------------------------- /img/ssie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shadowsocksr-backup/shadowsocks-rss/ce26799c384ca46fa9dfc2103445fee2666cab93/img/ssie.png -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # ShadowsocksR C# 版本4.7.0 # 2 | 3 | BitTorrent Sync:BHS55LP54SO7A434QBB5Z2O6B7A45B2BX 4 | 主页:[https://breakwa11.github.io/](https://breakwa11.github.io/) 5 | Wiki:[https://github.com/breakwa11/shadowsocks-rss/wiki](https://github.com/breakwa11/shadowsocks-rss/wiki) 6 | ZeroNet主页:[shadowsocksr.bit](http://127.0.0.1:43110/shadowsocksr.bit) 7 | ShadowsocksR主要分支:[SSR C#](https://github.com/shadowsocksr/shadowsocksr-csharp), [SSR python manyuser](https://github.com/shadowsocksr/shadowsocksr/tree/manyuser), [SSR-libev](https://github.com/shadowsocksr/shadowsocksr-libev) 8 | Android APP: [SSR-android](https://github.com/shadowsocksr/shadowsocksr-android/releases) 9 | iOS APP: [Shadowrocket](https://itunes.apple.com/us/app/shadowrocket/id932747118), [Potatso2](https://download.potatso.com), [Cross](https://itunes.apple.com/cn/app/cross-shadowsocks-proxy-client/id1194595243) 10 | MAC APP:[ShadowsocksX-NG](https://github.com/qinyuhang/ShadowsocksX-NG/releases), [ShadowsocksX-R](https://github.com/yichengchen/ShadowsocksX-R/releases) 11 | 其它跨平台分支:[avege](https://github.com/avege/avege), [electron-ssr](https://github.com/erguotou520/electron-ssr) 12 | Docker: [https://hub.docker.com/r/breakwa11/shadowsocksr/](https://hub.docker.com/r/breakwa11/shadowsocksr/) 13 | 14 | 推荐使用ZeroNet地址,或BitTorrent Sync免翻自动更新,最及时自动获取最新版本 15 | 注意发布压缩包内有一个以sig后缀的签名文件(如果没有签名文件,即文件已经被修改过),**您应该使用GPG进行校验** 16 | 公钥地址 [https://github.com/breakwa11/pubkey](https://github.com/breakwa11/pubkey) 17 | Key ID: 175F58E4 18 | Fingerping: A39E EB81 2880 75A8 A383 7D2E 211B 66B7 175F 58E4 19 | Key ID: F82FA47C 20 | Fingerping: DD98 A7DF DDCD B5AD D6F6 A17B 602A 81C9 F82F A47C 21 | 尽量在此处下载,以避免使用被篡改的版本。如果为了图方便在其它公开网络或下载站下载的,记得要做签名校验,签名是唯一凭证。 22 | 23 | ### 版本特点 ### 24 | 1. 全能代理,同一端口支持socks4/socks4a/socks5/http 25 | 2. 节点统计,包括延迟、连接数、当前下载速度、最高速度、出错率等等 26 | 3. 连接管理,随时断开指定节点的连接,或修改节点后自动断开 27 | 4. 协议转换,把UDP包封装于TCP里发送 28 | 5. 多重代理,通过设置前置socks5/http代理,可达到任意重代理 29 | 6. 协议插件,支持自定义协议和协议混淆,详见[ShadowsocksR插件文档 <<== 要了解插件的点这里看](https://github.com/breakwa11/shadowsocks-rss/blob/master/ssr.md) 30 | 31 | 你要是有兴趣和我联系的话,特别是编程技术上的支持,那就到 32 | Twitter: [@breakwa11](https://twitter.com/breakwa11) 33 | 聊天室: [https://gitter.im/breakwa11/shadowsocksr](https://gitter.im/breakwa11/shadowsocksr) 34 | Riot: `#ssr:matrix.org` 35 | 社区: [ShadowsocksR](https://plus.google.com/communities/117390969460066916686) 36 | Blogger: [https://breakwa11.blogspot.com](https://breakwa11.blogspot.com) 37 | Google Group: [ShadowsocksR](https://groups.google.com/forum/#!forum/shadowsocksr) 38 | TOX: D211FF64C848E03161700E74714A2100D363757AED4982F35486CC0713577C2F356B7DD84CAB 39 | 40 | ### 更新记录: ### 41 | 版本4.7.0 *2017-07-27* 42 | 1.增加协议`auth_chain_b`,具体特性参见协议文档 43 | 2.修正部分内存泄露 44 | 3.修正系统代理设置错误 45 | 46 | 版本4.6.1 *2017-06-29* 47 | 1.删除默认订阅 48 | 2.编辑服务器的一些小BUG修正 49 | 50 | 版本4.6.0 *2017-06-27* 51 | 1.host功能添加针对IP段的规则并规范化格式,文件名改为user.rule 52 | 2.DNS查询节点在IPv6下的BUG修正 53 | 使用自定义规则需要设置代理规则为“用户自定义”,其它模式无效。代理规则仅对进入SSR客户端的流量生效,对于因PAC规则使浏览器直连的,这属于不经过SSR客户端的流量。 54 | 55 | 版本4.5.5 *2017-06-24* 56 | 1.服务器订阅BUG修正 57 | 58 | 版本4.5.2 *2017-06-21* 59 | 1.SSR链接识别严格执行标准 60 | 2.host功能的一些BUG修正 61 | 3.支持多个服务器订阅 62 | 63 | 版本4.5.0 *2017-06-14* 64 | 1.DNS解析细节调整 65 | 2.识别被污染为本地地址的域名 66 | 3.订阅更新时合并节点数据,不清0也不断开现有连接(删除的节点除外) 67 | 4.试验性host文件支持 68 | 此host支持需要代理规则设置为“绕过局域网和大陆”或“绕过局域网和非大陆”时启用,文件格式见host.txt。另外此文件格式未固定,将来会考虑与chn_ip.txt合并以形成独立的配置文件。 69 | 70 | 版本4.4.6 *2017-06-09* 71 | 1.订阅功能的各种BUG修正 72 | 2.服务器统计界面只刷新显示区域 73 | 3.服务器统计窗口开启时选中节点居中 74 | 4.重复节点的开关修正 75 | 76 | 版本4.4.5 *2017-06-06* 77 | 1.订阅功能的各种BUG修正 78 | 79 | 版本4.4.4 *2017-06-05* 80 | 1.SSR服务器订阅去掉加密,保持当前选中服务器 81 | 2.延迟计算改用移动平均值 82 | 3.订阅功能的各种BUG修正 83 | 84 | 版本4.4.0 *2017-06-03* 85 | 1.UDP over TCP实现细节调整 86 | 2.服务器编辑窗口细节BUG修正 87 | 3.低版本操作系统设置系统代理方式用老代码 88 | 4.移除http白名单 89 | 5.测试混淆tls1.2\_ticket\_fastauth(必须更新服务端) 90 | 6.SSR服务器订阅 91 | 默认的服务器订阅只提供三个服务器节点(不保证一定可用),而通常每个节点最多只能让64个客户端同时连接,且每连接限速30KB/s,且对外只能访问53/80/443端口,仅作为临时或应急使用,基本上能用已经不错了,不能用于大流量下载或视频观看,请尽量使用自己购买或自己搭建的节点,或使用服务商提供的订阅地址以达到自动更新节点的效果。 92 | 93 | 版本4.3.1 *2017-05-14* 94 | 1.连接错误检测修正 95 | 2.允许通过非本地地址获取PAC时不使用AUTH 96 | 3.服务器编辑可多选删除 97 | 4.修正部分系统上的系统代理设置 98 | 5.服务器选择策略修正BUG 99 | 6.错误统计及超时判断调整 100 | 7.调整最高速度计算细节 101 | 8.privoxy运行模块一处错误处理 102 | 9.显示及管理直连连接 103 | 10.修正auth\_chain\_a的UDP处理 104 | 105 | 版本4.2.3 *2017-05-05* 106 | 1.修正流量显示错误 107 | 2.调整最高速度计算细节 108 | 3.过时协议彻底删除 109 | 110 | 版本4.2.2 *2017-05-04* 111 | 1.修正断开连接时偶然的程序异常 112 | 2.动态最高速度计算(试验功能) 113 | 3.添加复制选中组链接 114 | 115 | 版本4.2.1 *2017-04-29* 116 | 1.协议auth\_chain\_a修正UDP部分 117 | 2.内存泄露修正 118 | 119 | 版本4.2.0 *2017-04-27* 120 | 1.新增协议auth\_chain\_a 121 | 2.连接管理优化,确保能立即断开连接 122 | 3.数据包发送优化 123 | 4.支持delegated-apnic-extended-latest文件名 124 | 5.负载均衡策略为定时切换时的BUG修正 125 | 6.其它一大堆细节和BUG什么的就不说了,反正你们不看的 126 | 127 | 版本4.1.5 *2017-03-26* 128 | 1.delegated-apnic.txt换为chn_ip.txt,方便自行编辑和更新 129 | 2.修正负载均衡在多端口下的分配错误 130 | 3.优化直连时下载的CPU占用 131 | 4.tls1.2\_ticket\_auth补充校验,及使用更随机化的ticket 132 | 5.优化auth\_aes128\_*的随机分布 133 | 6.修正负载均衡“按次序”的细节错误 134 | 通过自己下载delegated-apnic-latest(不包含.txt)放在同目录下并删除chn_ip.txt,会自动生成新的chn_ip.txt 135 | 136 | 版本4.1.4 *2017-03-11* 137 | 1.配置BUG修正 138 | 2.修复auth\_aes128\_*在二级代理下工作不正常 139 | 140 | 版本4.1.3 *2017-03-07* 141 | 1.服务器编辑窗口可多选并整体移动,各种细节调整 142 | 2.提升auth\_aes128\_*的数据包混淆能力 143 | 144 | 版本4.1.2 *2017-02-26* 145 | 1.启动时Privoxy的监听端口选择方式调整 146 | 2.修正socks5代理请求 147 | 3.修正auth\_aes128\_*的UDP问题 148 | 149 | 版本4.1.1 *2017-02-14* 150 | 1.界面使用系统默认字体 151 | 2.修正ss链接的批量导入,移除-auth的支持 152 | 3.移除OTA(verify\_sha1)支持,移除auth\_sha1以及auth\_sha1\_v2 153 | 4.服务器编辑窗口默认打码 154 | 155 | 版本4.1.0 *2017-01-24* 156 | 1.修正自启动显示 157 | 2.修正socks5认证处理 158 | 3.DNS设置支持使用冒号分隔端口号,IPv6地址需要使用中括号,如[::1]:53 159 | 160 | 版本4.0.9 *2017-01-21* 161 | 1.修正自启动设置(需要管理员权限) 162 | 2.优化下载时CPU占用 163 | 3.端口设置窗口中文界面 164 | 165 | 版本4.0.8 *2017-01-19* 166 | 1.修正DNS查询 167 | 168 | 版本4.0.7 *2017-01-18* 169 | 1.修正负载均衡策略 170 | 2.修正代理规则 171 | 172 | 版本4.0.6 *2017-01-17* 173 | 1.负载均衡在组内切换单独选项,可应用到任何其它策略 174 | 2.端口设置内可指定使用节点或指定组,或留空不指定(选择所有) 175 | 3.界面调整,使用数字控件 176 | 4.系统代理模式区分“直连”及“不修改”,“不修改”时可避免与其它代理软件冲突 177 | 5.隐藏弱加密(但可输入使用) 178 | 6.DNS缓存优化,查询不到时可使用旧的结果 179 | 180 | 版本4.0.5 *2017-01-08* 181 | 1.添加协议参数 182 | 2.代码整理(嗯,从外观是看不出来的) 183 | 184 | 版本4.0.4 *2017-01-03* 185 | 1.修正Bug 186 | 2.添加log显示窗口 187 | 3.修正64位系统下的内存占用 188 | 189 | 版本4.0.3 *2016-12-25* 190 | 1.修正Bug 191 | 192 | 版本4.0.2 *2016-12-24* 193 | 1.修正64位配置 194 | 2.修正无法更新PAC 195 | 3.调整消息提示和更新提示 196 | 4.连接Bug修正及剪贴板导入修正 197 | 5.设置系统代理修正 198 | 6.加密性能优化 199 | 7.调socks5及http connect握手响应时机 200 | 201 | 版本4.0.1 *2016-12-12* 202 | 1.修正自效验在部分环境下的效验错误 203 | 2.从剪贴板导入多个节点时按次序导入 204 | 3.修正端口设置在无设置项时会挂的BUG 205 | 4.在x64上运行为64位应用程序 206 | 5.修正在部分系统下不能正常使用`auth_aes128_md5`的问题 207 | 6.找了个台湾妹子和帅哥校对正体部分 208 | 209 | 版本4.0 *2016-12-03* 210 | 1.自动修正重复节点ID 211 | 2.端口配置面板,可配置为端口映射或指定节点代理 212 | 3.增加加密方式none(不加密),aes-128-cfb8等 213 | 4.privoxy模板清空使得仅返回错误码,由浏览器决定显示内容 214 | 5.优化DNS查询 215 | 6.支持清空历史流量(在服务器统计窗口菜单内) 216 | 7.通过本地及网络做简单的exe自效验 217 | 8.修正上传时的超时处理及程序错误,及上传速度统计修正 218 | 9.支持超长备注和组名 219 | 10.支持自定义任务栏图标及服务器统计窗口图标(在exe同目录下放icon.png文件) 220 | 11.支持配置文件加密(含transfer_log) 221 | 12.国内IP列表更新 222 | 223 | 注意事项: 224 | 225 | - 端口配置面板可以菜单的服务器那找到,或alt+鼠标左键 226 | - aes-128-cfb8需要libeay32.dll的支持,但如无特殊需要并不建议使用 227 | - 右键菜单的顶部将会实时显示自效验结果,仅启动时做效验,**若效验失败程序将自行退出,所以exe和签名文件务必放在一起**。效验通过的会同时在那里显示短小的公告之类的,更新提示也同时将这样进行,也即其它修改版(甚至即使只是重新编译,不同环境编译的二进制文件不一样)都不会收到更新提示及公告。如果那个菜单变得可点击,记得点击看看。 228 | - 如果设置了配置密码,那么转移或复制配置时需要同时把gui_config.json和transfer_log.json一起复制,否则如果后者不复制,则会因为解密失败导致历史流量清空 229 | - 如果设置了配置密码,建议退出后手动把整个temp目录删除,否则log里面会泄露节点地址 230 | 231 | 版本3.9.6 *2016-10-17* 232 | 1.本地API认证码(含PAC部分),抵抗部分XSS(此攻击可探测是否在运行SS-C#) 233 | 2.增加代理规则,可绕过局域网及大陆IP(或非大陆IP),在选项里设置无污染DNS可获得最佳效果 234 | 3.再弄DPI问题 235 | 4.UDP细节问题修正 236 | 5.修正`tls1.2_ticket_auth`上传数据错误 237 | 238 | - 注意,在使用二级代理时,使用绕过局域网及大陆IP的代理规则,效果是局域网直连,大陆IP通过二级代理连接目标网站,其它的通过二级代理连接SSR服务端再连接到目标网站。启用代理规则为绕过局域网及大陆IP时,所有通过此客户端代理的都有绕过的效果,不需要设置PAC,系统代理可直接设置为全局 239 | - 关于XSS攻击,此问题从C#支持PAC第一天起,已经有这个漏洞,任何网站均可通过恶意的代码探测出你是否在运行C#版客户端(特别是数字或百毒的站),类似方式百毒曾经用于获取用户手机信息(在手机上监听特定端口,然后网页上通过JS访问127.0.0.1:xxxx以获得用户手机号、IMEI、通讯录、地理位置等等信息),所以我想这可能是win10早期默认阻止连接127.0.0.1地址的原因,特别建议你不要使用默认的1080端口做代理 240 | - 压缩包内有一个delegated-apnic.txt文件,是APNIC上记录分配到CN的IP地址段,可自行在APNIC上下载更新。当然如果你把这个文件删除了,或者没带上,那么使用绕过局域网及大陆IP的代理规则时除了局域网外任何IP都将不会绕过 241 | 242 | 243 | 版本3.9.5 *2016-10-12* 244 | 1.重新支持rc4 245 | 2.协议列表移除auth\_aes128,添加auth\_aes128\_md5和auth\_aes128\_sha1 246 | 3.协议内填充字节全部随机化 247 | 服务端需要更新到2.9.5才能使用新增协议 248 | 249 | 250 | 版本3.9.4 *2016-10-09* 251 | 1.自定义生成二维码 252 | 2.细节Bug修正,编辑服务器界面调整 253 | 3.服务器统计列表右键菜单改为窗口菜单且添加断开所有连接 254 | 4.选项设置窗口添加默认值设置 255 | 5.修正关闭软件时没有还原系统代理设置 256 | 6.修正重连逻辑(部分情况下导致发送了错误的数据) 257 | 7.按新版服务端逻辑优化(服务端须为2016年10月3日以后更新的版本) 258 | 8.增加代理规则,设置为socks5下亦可设置绕过局域网(不需要PAC支持) 259 | 简单来说,代理规则是所有连接到SSR客户端都会走的规则(不局限于浏览器),将部分替代PAC的功能 260 | 261 | 262 | 版本3.9.3 *2016-10-04* 263 | 1.协议列表移除auth\_sha1和auth\_sha1\_v3 264 | 2.优化负载均衡策略 265 | 3.优化及修正超时断开逻辑 266 | 4.除鼠标中键添加ctrl+左键打开服务器统计窗口 267 | 注:服务端需配合更新以使优化效果更明显,配合auth协议食用风味更佳。 268 | 269 | 270 | 版本3.9.2 *2016-09-28* 271 | 1.添加auth\_aes128 272 | 2.优化负载均衡策略,自动识别不可用节点 273 | 3.优化本地代理连接握手效率 274 | 275 | 276 | 版本3.9.1 *2016-09-27* 277 | 1.修正verify\_sha1的UDP接收错误 278 | 2.修正DNS错误 279 | 3.添加服务器加在当前位置的后面 280 | 4.细调连接方式保持握手包和数据包一起发送 281 | 282 | 283 | 版本3.9.0 *2016-09-20* 284 | 1.增加auth\_sha1\_v4协议 285 | 2.增加gfw_list备用地址 286 | 3.配置窗口不隐藏协议混淆 287 | 4.连接性能优化 288 | 289 | 290 | 版本3.8.9 *2016-09-18* 291 | 1.服务器菜单分组显示,右键菜单整理(非常苗条了喵) 292 | 2.从配置文件导入服务器 293 | 3.DPI模式调整 294 | 4.修正特殊情况下的连接异常,导致非正常中断 295 | 296 | 297 | 版本3.8.8 *2016-09-13* 298 | 1.修正UDP连接及通过二级代理的UDP连接 299 | 2.SS节点自动隐藏SSR配置项,为SS用户有原版相似的配置体验 300 | 3.界面各种字体和大小的调整 301 | 302 | 303 | 版本3.8.7 *2016-09-10* 304 | 1.添加连接超时选项 305 | 2.图标颜色细调(避免黄色时与白色太相近) 306 | 3.连接参数修正 307 | 4.真·DPI修正 308 | 5.服务器统计窗口优化,不再闪烁 309 | 310 | 311 | 版本3.8.6 *2016-09-04* 312 | 1.支持扫任意二维码,非SS/SSR的码显示扫描结果 313 | 2.添加auth\_sha1\_v3协议 314 | 3.修正UDP over TCP 315 | 4.高DPI下界面的全面修正 316 | 5.系统代理模式菜单项调整 317 | 6.服务器编辑界面细调,显示过二维码后下次可隐藏图片 318 | 7.服务器统计界面打开时焦点自动切换到选择的节点上 319 | 8.Pofile网络模块,效率优化 320 | 9.修正google doc编辑时掉线问题 321 | 322 | 323 | 版本3.8.5.2 *2016-08-26* 324 | 1.扫码增强,提升扫码识别能力 325 | 2.网络连接逻辑调整 326 | 3.服务器统计界面右键可导出当前或所有开启节点的链接 327 | 4.编辑界面手动添加时复制当前节点配置 328 | 5.服务器统计界面DPI适配 329 | 6.扫码的DPI适配(C#下不同DPI远程桌面会位置错误,C#的BUG) 330 | 331 | 332 | 版本3.8.5.0 Release *2016-08-23* 333 | 1.支持正体中文 334 | 2.增强auth\_sha1的混淆力度 335 | 336 | 337 | 版本3.8.5.0 *2016-08-19* 338 | 1.网络部分重构 339 | 2.注册表读写调整(针对win10) 340 | 3.测速再调整,更实时准确 341 | 342 | 343 | 版本3.8.4.4 *2016-08-17* 344 | 1.连接keepalive方式调整 345 | 2.privoxy开启连接共享 346 | 347 | 348 | 版本3.8.4.3 *2016-08-15* 349 | 1.删除auth\_simple,tls\_simple 350 | 2.服务器统计列表浮点精度调整 351 | 3.仅点击链接时显示二维码 352 | 4.速度统计调整 353 | 354 | 355 | 版本3.8.4.2 *2016-08-08* 356 | 1.连接占用BUG修正 357 | 2.调整图标 358 | 3.打开日志使用系统默认程序 359 | 4.连接错误统计BUG修正 360 | 361 | 362 | 版本3.8.4 *2016-08-05* 363 | 1.支持二级代理的http connect自定义useragent 364 | 2.自定义DNS 365 | 3.base64生成去掉填充符 366 | 4.上传速度 367 | 5.调整图标 368 | 369 | 370 | 版本3.8.3 *2016-07-08* 371 | 1.tunnel模式下转发SSH连接修正 372 | 2.优化服务器统计的更新 373 | 3.在auth\_sha1\_v2下支持心跳包(需更新服务端,且开启超时时间) 374 | 4.新ssr链接格式,简化解析,且防特殊字符 375 | 5.新增控制台版本(仅支持socks5代理,需要自己编译) 376 | 6.新增动态加载libeay32.dll及其部分加密 377 | 7.修正杀掉Privoxy进程的名字 378 | 379 | 380 | 版本3.8.2 *2016-06-14* 381 | 1.连接管理优化,解决偶尔的资源泄露及偶尔的死锁 382 | 2.支持tunnel模式,即端口映射(但未实现图形界面配置的部分) 383 | 3.优化pac参数设置,可免ip地址设置项,默认127.0.0.1 384 | 4.API支持修改除token外的所有配置(可用于实现自动更新节点功能) 385 | 5.彻底移除TCP over UDP功能(如有此需求请使用kcptun) 386 | 6.支持简易伪装privoxy进程名(例如把主程序改为qq.exe),以躲避国产流氓软件获取进程列表被关键字检测 387 | 388 | 版本3.8.1.2 *2016-05-28* 389 | 1.优化并修正UDP加解密 390 | 2.缺少注册表代理设置项时加上 391 | 392 | 版本3.8.1.1 *2016-05-24* 393 | 1.解密遇到错误UDP包时忽略 394 | 2.扫码细节调整,兼容带冒号的密码 395 | 3.增加同一目标地址保持同一节点的时间(3分钟),可通过配置文件修改 396 | 4.新增http_post混淆 397 | 398 | 版本3.8.1 *2016-05-19* 399 | 1.二级代理socks5修正 400 | 2.优化历史流量记录(与以前版本不兼容) 401 | 3.解密首包长度小于IV时出错的BUG修正 402 | 4.统计窗口拉伸优化,自动填充 403 | 5.实验性功能:支持基本的API,可获取当前所有节点的配置信息和统计信息 404 | 此API目前可直接使用浏览器访问 http://127.0.0.1:1080/api?token=&action=config 获得结果 405 | 端口号1080修改为你的本地端口,如需统计信息,那么使用action=statistics 406 | 以下隐藏一大堆TODO列表 407 | 408 | 版本3.8.0.7 *2016-05-17* 409 | 1.PAC支持返回二级代理地址 410 | 这功能用于在特殊局域网(如某些公司)内必须通过指定代理才能上外网的情况, 411 | 在判断不需要经过SS节点时,也使用指定的二级代理地址连接, 412 | 避免只能全局通过SS节点。此功能必须与二级代理功能一起开启。 413 | 414 | 版本3.8.0.6 *2016-05-13* 415 | 1.服务器编辑列表分组名显示的各种Bug修正 416 | 2.DPI配置修正 417 | 3.添加自动调整服务器统计表格宽度的菜单项 418 | 4.服务器统计窗口各种自适应 419 | 420 | 版本3.8.0.5 *2016-05-10* 421 | 1.服务器编辑列表显示分组名 422 | 2.负载均衡策略添加在所选组中切换 423 | 3.不同DPI下的显示调整 424 | 4.实验性功能:支持长期记录节点已通过的流量(按服务器名,不管端口) 425 | 数据保存于transfer_log.json,如要清空数据,关掉软件删除此文件即可。此功能需要大家反馈改进意见。 426 | 427 | 版本3.8.0.4 *2016-05-06* 428 | 1.优先相同节点连接同一地址菜单项初始化修正 429 | 2.移除在线PAC残留功能 430 | 3.代码瘦身 431 | 4.添加指定UDP端口功能 432 | 5.隐藏高级选项 433 | 其它说明:指定UDP端口功能主要用于希望TCP端口走80或443之类,而UDP可以走原端口,以完整支持服务端单端口多用户支持。 434 | 或者用于去除特征之用(TCP与UDP总走同一个端口这就是个特征) 435 | 436 | 版本3.8.0.3 *2016-05-04* 437 | 1.privoxy只监听本地地址 438 | 2.添加仅通过大陆常见域名列表(翻回国内用) 439 | 3.优化历史统计 440 | 4.移除在线PAC功能 441 | 442 | 版本3.8.0.2 *2016-04-26* 443 | 1.重命名ssr_privoxy,避免被原版SS强制杀掉进程,和谐共处╮( ̄▽ ̄)╭ 444 | 2.添加ZeroNet域名 445 | 3.支持服务器记录窗口置顶,在窗口的右键菜单中切换 446 | 447 | 版本3.8.0.1 *2016-04-19* 448 | 1.服务器统计窗口拖放优化,弹出优化 449 | 2.支持相同地址优先选择相同节点连接,可解决开启负载均衡时google搜索验证码及各种登陆验证(1分钟内有效) 450 | 451 | 版本3.8.0 *2016-04-17* 452 | 1.移除tls_simple 453 | 2.增加tls1.2\_ticket\_auth 454 | 455 | 版本3.7.6.2 *2016-04-15* 456 | 1.privoxy模板萌化尝试 457 | 2.添加ZeroNet 458 | 459 | 版本3.7.6.1 *2016-04-12* 460 | 1.修正部分情况下程序随机异常退出 461 | 2.支持pac参数实现本地动态代理地址,可指定目标"ip","port","type" 462 | 3.设置privoxy的超时参数 463 | PAC配置示例:`http://127.0.0.1:1080/pac?ip=127.0.0.1&port=9050&type=socks5&t=123` 464 | type参数指定为s5或socks5使用socks5代理,s4同理,不指定时使用http代理 465 | 其中参数t的值随意,目的是防浏览器对其缓存(出现缓存的情况就修改一下t的值使得URL变化了即可) 466 | 467 | 版本3.7.6 alpha *2016-04-01* 468 | 1.服务器分组,支持按组开启/关闭/排序 469 | 2.增加http代理域名白名单,允许自定义(在bypass.action) 470 | 3.http代理自动跳过本地局域网 471 | 4.采用实际发包响应时间计算延迟值(二级代理下亦能得到正确延迟) 472 | 5.彩色图标显示当前代理配置模式(绿色表示开了系统代理且使用PAC模式,如果不开PAC就是青色(绿+蓝),如果不开系统代理就是蓝色,如果开了负载均衡就在前面的颜色里混合进红色) 473 | 6.添加privoxy模板文件(压缩包里的templates目录和主程序要放在一起) 474 | 7.修正超时处理,多连接优化 475 | 8.缓冲区长度Bug修正 476 | 9.privoxy被杀后的重启修正 477 | 10.privoxy更新到最新版本 478 | 11.修正较大UDP包接收不完整的错误 479 | 注意:指定使用socks5协议时则为强制代理,不管目标地址,通常用于作为其它软件的二级代理(如tor) 480 | http代理域名白名单功能,默认会在gfw_whitelist项目里下载一个常见国内域名列表。 481 | 但对于一些直接使用IP地址连接的国内视频网站建议配合**绕过大陆常见域名PAC**或**绕过大陆IP的PAC**,此PAC会对IP地址判断是否为国内 482 | 此测试版本暂不支持TCP over UDP,有此需求的话请暂时使用旧版本 483 | privoxy的模板文件萌化期待 484 | 485 | 版本3.7.4.1 *2016-02-01* 486 | 1.修正超时统计 487 | 2.优化统计流程 488 | 3.发现协议非标准不断开连接 489 | 490 | 版本3.7.4 *2016-01-22* 491 | 1.增加插件auth\_sha1\_v2 492 | 2.服务器统计增加“实际下载”列 493 | 3.log文件按月份分离保存 494 | 495 | 版本3.7.3.1 *2016-01-11* 496 | 1.修正部分http(s)连接错误 497 | ---- (3.7.2 beta *2016-01-09*) 498 | 2.重写http代理实现 499 | 3.支持自定义abp.txt以替代gfwlist 500 | ---- (3.7.1 alpha *2016-01-05*) 501 | 4.支持设置验证密码,设置验证密码后允许任何IP连接,带验证时不支持socks4 502 | 5.本地代理免验证 503 | 6.空连统计清零规则调整 504 | 505 | 版本3.7.0 *2015-12-29* 506 | 1.支持chacha20-ietf加密 507 | 2.兼容FIPS设置 508 | 3.支持UDP协议定制 509 | 4.完整支持verify\_sha1 510 | 511 | 版本3.6.9 *2015-12-21* 512 | 1.http\_simple插件支持自定义完整header 513 | 2.错误统计方式调整,只记录最近100次连接的情况 514 | 3.常见协议的正确性测试,可检测出密码错误或协议错误等 515 | 4.仅当解密错误或协议错误或网络错误时,才自动禁用节点 516 | 5.tls1.0插件协议修正(需要同时更新服务端) 517 | 518 | 版本3.6.8 *2015-12-18* 519 | 1.连接超时处理优化,避免长时间连接等待(重连次数大于0时启用,建议设置5) 520 | 2.重连机制增强,客户端未发送有效数据前均能重连 521 | 3.无数据超时仅断开远端,满足上一条的情况下能重连 522 | 4.更新PAC时防止缓冲 523 | 5.tls1.0插件协议修正(需要同时更新服务端) 524 | 525 | 版本3.6.7.1 *2015-12-15* 526 | 1.修正随机数发生方式 527 | 2.配置界面次序调整 528 | 529 | 版本3.6.7 *2015-12-14* 530 | 1.调整流量计算方式,以客户端到ss服务端的TCP/UDP数据包大小为准(py服务端也已调整) 531 | 2.verify\_deflate的BUG修正 532 | 3.增加混淆插件tls1.0\_session\_auth 533 | 4.负载均衡的“选中优先”bug修正 534 | 5.服务端`auth_simple`和`auth_sha1`支持配置客户端上限 535 | 536 | 版本3.6.6 *2015-12-03* 537 | 1.增加插件auth\_sha1 538 | 2.过滤非局域网连接请求 539 | 540 | 版本3.6.5 *2015-11-24* 541 | 1.移除内置http代理功能 542 | 2.支持切换前置代理类型(Socks5/http tunnel) 543 | 其它说明:http tunnel是指支持代理https连接的http代理,可以通过UDP over TCP方式使用UDP,不能使用原生UDP。特别注意某些代理软件某些功能上有BUG,会导致代理失败(如CCProxy开启二级代理时,不开启二级代理是正常的) 544 | 前置代理类型中的“TCP端口转发”的混淆插件还没写 545 | 546 | 版本3.6.4.1 *2015-11-19* 547 | 1.关闭内置http代理时privoxy的转发BUG修正 548 | 2.不重复保存配置 549 | 550 | 版本3.6.4 *2015-11-18* 551 | 1.支持verify\_sha1(即libev的OTA) 552 | 2.UDP over TCP 实现调整,避免与verify\_sha1冲突 553 | 3.UDP over TCP 细节bug修正 554 | 4.显示超时次数列 555 | 5.内置http代理部分bug修正 556 | 6.特殊情况下缓冲区溢出修正 557 | 558 | 版本3.6.3.4 *2015-11-16* 559 | 1.移除部分影响速度的调试代码 560 | 2.修正扫码时混淆参数未解码 561 | 3.增加插件字段 562 | 563 | 版本3.6.3 *2015-11-10* 564 | 1.实现CONNECT方法的http代理,减少访问https站的连接数 565 | 2.实现基本的http代理支持,更少资源占用(但存在BUG,试用阶段) 566 | 3.内置http代理启用开关(开启后privoxy不会运行) 567 | 4.修改生成链接格式,与SSR android兼容 568 | 5.在服务器配置的“备注”前打钩则把备注加在链接(二维码)内 569 | 6.支持前置socks5代理地址填写域名 570 | 7.增加一个常见域名列表(即白名单),foxyproxy可使用此列表替代, 571 |     因foxyproxy使用绕过大陆IP列表访问facebook等站会很卡 572 | 其它说明:对于https站点,不管启不启用内置http代理,均无影响, 573 | 启用内置http代理会影响http站点,目前发现的问题是页面元素较多时有部分请求不正常,用chrome打开时有一定概率变成空白页。 574 | 575 | 版本3.6.2 *2015-11-02* 576 | 1.插件分类,独立出TCP协议字段(旧配置部分节点需要修改配置) 577 | 2.稳定性增强 578 | 3.更详细的log输出 579 | 580 | 版本3.6.1 *2015-10-27* 581 | 1.多开时允许分别开机自动启动(更换前要把以前的自启动去掉) 582 | 2.检测协议错误 583 | 3.调整自动禁用节点的计算方式 584 | 4.修正自动重连时没有更换混淆插件 585 | 5.编辑节点后保持当前选择的节点 586 | 6.添加auth\_simple混淆插件 587 | 7.DNS缓存修正 588 | 8.FIPS设置检查 589 | **附python部分**: 590 | 版本2.6.12 591 | 1.稳定性修正(目前最为稳定版本) 592 | 2.添加auth\_simple混淆插件 593 | 3.TCP分包处理修正 594 | 4.IPv6优先 595 | 5.混淆插件客户端部分完成支持 596 | 597 | 版本3.5.9 *2015-10-16* 598 | 1.增强XP下的兼容性 599 | 2.gfwlist模板不本地保存,精简exe大小 600 | 3.gfwlist以及默认pac跳过局域网地址 601 | 602 | 版本3.5.8 *2015-10-15* 603 | 1.增加插件参数字段 604 | 2.PAC兼容性调整 605 | 3.privoxy服务运行前先停止 606 | 4.缓冲区优化 607 | 608 | 版本3.5.7 *2015-10-12* 609 | 1.修正退出时有一定机率没退出完全的问题 610 | 2.解决两个verify插件在部分情况下会越界错误 611 | 3.添加绕过局域网的PAC,以替代全局模式 612 | 4.修正系统代理在部分环境下手动取消失败的问题 613 | 5.保证在使用PAC模式下即使强行结束客户端IE也能正常使用 614 | 615 | 版本3.5.6 *2015-10-09* 616 | 1.增加混淆协议插件`verify_deflate` 617 | 2.修正`tls_simple`, `random_head`的BUG 618 | 619 | 版本3.5.5 *2015-10-08* 620 | 1.配置中remarks字段改回原文 621 | 622 | 版本3.5.4 *2015-10-08* 623 | 1.调整插件接口,减少计算量和Bug修正 624 | 2.网络缓冲的bug修正 625 | 3.备注采用urlsafe-base64编码 626 | 4.链接字段增加obfs-plugin 627 | 5.其它编码错误修正 628 | 629 | 版本3.5.3 *2015-10-07* 630 | 1.简化操作,**单击** 或 **shift+单击** 任务栏图标弹出配置窗口 631 | 2.增加插件接口 632 | 3.增加混淆协议插件`verify_simple` 633 | 4.调整“连错”归零逻辑,避免插件的混淆返回干扰 634 | 5.细调负载均衡,避免某个节点同时连接数大多 635 | 6.修正端口重新监听时的异常 636 | 637 | 版本3.5.2 *2015-09-30* 638 | 1.软件更新提示方式调整,点击气泡不弹窗 639 | 2.注册表键值更名,避免与原版冲突 640 | 3.Privoxy监听端口随机,不再默认为8123,避免与原版冲突 641 | 4.移除“空连”错误统计 642 | 5.修改图标 643 | 6.移除table和rc4加密 644 | 7.整理和简化右键菜单,配置移入选项设置 645 | 646 | 版本3.5.1 *2015-09-27* 647 | 1.增加混淆协议插件`tls_simple`, `random_head` 648 | 2.`http_simple`混淆增加随机路径和随机useragent 649 | 3.更新配置不断开现有连接 650 | 4.不开启系统代理时,系统代理菜单不置灰(PAC有效) 651 | 652 | 版本3.5.0 *2015-09-22* 653 | 1.混淆协议插件`http_simple` 654 | 655 | 版本3.4.4 *2015-09-19* 656 | 1.设置界面拆分,区分编辑服务器和全局设置 657 | 2.TCP连接协议改用下拉列表选择,字段名调整,相应节点要重新配置 658 | 3.切换节点开关状态后立即保存设置 659 | 4.调整随机数发生器,避免产生相同IV 660 | 661 | 版本3.4.3 *2015-09-16* 662 | 1.服务器统计列的下载或上传刷新状态修正 663 | 2.保存节点禁用状态 664 | 3.增加按时间段切换服务器规则(每10分钟切换,或遇到连续出错时切换) 665 | 666 | 版本3.4.2 *2015-09-09* 667 | 1.节点修改或删除后无引用的连接自动断开 668 | 2.隐藏混淆UDP协议选项 669 | 3.更新记录加入具体日期 670 | 4.首包发送方式调整 671 | 672 | 版本3.4.1 *2015-08-28* 673 | 1.增加新TCP连接协议 674 | 675 | 版本3.4.0 *2015-08-24* 676 | 1.使用新的GFWList地址 677 | 2.增加一个实验性功能TCP over UDP(目前有BUG,轻度使用还可,需要使用相应的服务端) 678 | 679 | 版本3.3.6 *2015-08-19* 680 | 1.修正“自动禁用出错服务器”选项保存的问题 681 | 2.所有临时文件全部放到./temp/下 682 | 3.连接方式不同也视为不同服务器分别统计 683 | 4.删除升级提示检查 684 | 5.删除实验性功能代码并开源https://github.com/breakwa11/shadowsocks-csharp 685 | 686 | 版本3.3.5 *2015-08-17* 687 | 1.合并部分主干代码,改用privoxy替代polipo(主程序增大140Kb) 688 | 2.增加“低错误优先”的随机方式 689 | 3.细调“低延迟优先”的算法 690 | 4.增加“自动禁用出错服务器”选项 691 | 5.连接超过超时秒数后断开算作“超时” 692 | 693 | 版本3.3.4 *2015-08-13* 694 | 1.修正打开统计列表后,程序退出不正常的错误 695 | 2.修正UDP over UDP的连接错误 696 | 3.修正二重代理时UDP连接错误 697 | 698 | 版本3.3.2 *2015-08-12* 699 | 1.合并部分主干代码 700 | 2.断开当前所有连接功能 701 | 3.优化统计窗口资源占用 702 | 703 | 版本3.3.1 *2015-08-06* 704 | 1.修正连接数统计和管理错误 705 | 2.修正多重代理时UDP代理错误 706 | 3.重新实现UDP over TCP(与之前版本不兼容,以前的实现不正确,服务端需更新) 707 | 708 | 版本3.2.2 *2015-07-31* 709 | 1.修正UDP下chacha20加密错误以及内存泄露 710 | 2.提升UDP下加解密速度 711 | 3.优化统计计算速度 712 | 4.随机选择服务器改名负载均衡 713 | 5.统计列表简化显示效果,减少卡顿 714 | 6.自动更新方式调整 715 | 716 | 版本3.2.0 *2015-07-26* 717 | 1.修正部分TCP连接失败的问题 718 | 2.增加Socks5代理设置 719 | 720 | 版本3.1.4 *2015-07-23* 721 | 1.调整TCP发包方式,把首协议包与第一个数据包连接发送 722 | 2.移除混淆TCP选项 723 | 3.服务端统计三列错误统计列改用“连错”列代替 724 | 4.不要把版本号看成圆周率(明明差一个小数点) 725 | 726 | 版本3.1.3 *2015-07-16* 727 | 1.本地连接的TTL支持,默认TTL=0(0表示不启用) 728 | 2.重连次数的保存修正 729 | 730 | 版本3.1.2 *2015-07-14* 731 | 1.连接统计窗口排序修正 732 | 2.重连次数配置(默认值3) 733 | 3.UDP over UDP选项更换为UDP over TCP,即高级选项全不打钩为通用设置,通用于所有服务端 734 | 4.log文件和polipo放于temp子目录 735 | 5.统计窗口数值格式化调整 736 | 6.解决config问题,移除config文件 737 | 7.允许密码显示 738 | 739 | 版本3.1.1 *2015-07-13* 740 | 1.合并主干部分代码 741 | 2.增加混淆UDP选项 742 | 3.支持接收混淆UDP包 743 | 4.连接数统计修正 744 | 5.鼠标中键点击任务栏图标弹出服务器连接统计窗口 745 | 6.修正配置界面部分环境下按钮不显示 746 | 7.附加config文件避免部分系统运行异常 747 | 8.改用7zip压缩,减少一半体积 748 | 749 | 版本3.0.1 *2015-07-09* 750 | 1.配置保存bug修正 751 | 2.右键菜单整理 752 | 3.配置界面调整 753 | 4.修正UDP握手协议实现与ProxyCap兼容 754 | 5.加入源md格式说明文档 755 | 756 | 版本3.0 *2015-07-05* 757 | 1.软件更名 758 | 2.修正 UDP over UDP 的加解密错误 759 | 760 | 版本2.3.2 *2015-06-29* 761 | 1.修正ipv4连接的问题 762 | 其它:目前已知使用pc版微信发图发文件会导致polipo崩溃,建议改用Provixy,具体使用方法可以参考网上教程 763 | 764 | 版本2.3.1.9 *2015-06-28* 765 | 1.修正http连接会出现连接失败的问题(同时修正了自动更新和pac更新) 766 | 2.增加连接管理,双击连接数即可断开该节点现有连接 767 | 3.增强UDP连接兼容性 768 | 4.更新地址可以配置窗口点击 769 | 770 | 版本2.3.1.8 *2015-06-26* 771 | 1.支持TCP协议头混淆(需服务端更新支持) 772 | 2.UDP包混淆(需服务端更新支持) 773 | 3.支持UDP包通过 UDP Relay 转发(需服务端更新支持) 774 | 4.支持Socks4/Socks4a协议 775 | 5.局域网共享时支持同时监听IPv4/IPv6 776 | 6.配置添加UDP包通过方式 777 | 7.配置添加TCP协议头混淆 778 | 779 | 版本2.3.1.7 *2015-06-19* 780 | 1.IPv6连接修正 781 | 2.随机时“按次序”方式的bug修正 782 | 3.IPv6地址显示方式调整 783 | 4.空连统计包含连接重置等错误 784 | 5.服务器连接统计列排序功能 785 | 6.取消自动关闭无效服务器,防误判 786 | 7.手工检查更新 787 | 788 | 版本2.3.1.6 *2015-06-11* 789 | 1.增加随机选择服务器的方式 790 | 2.连接数统计修正 791 | 3.支持代理UDP(以TCP转发),需要服务端更新 792 | 793 | 版本2.3.1.5 *2015-06-04* 794 | 1.调整配置窗口的设置体验 795 | 2.软件自动更新支持 796 | 797 | 版本2.3.1.4R2 *2015-06-03* 798 | 1.修正polipo某些情况下运行异常 799 | 2.修正连接统计窗口一些错误 800 | 3.修正部分dns错误未处理的问题 801 | 4.三次错误后自动关闭无效服务器 802 | 5.增加ChnIPList的pac,国内不代理,国外全走代理 803 | 6.调整连接统计窗口列顺序 804 | 7.节点自动重连尝试(开启随机选择服务器时,第一次重连相同节点,第二次、第三次选择其它节点) 805 | 8.从剪贴板复制多行文本地址功能修正 806 | 9.服务器配置显示二维码,增加列表高度 807 | 808 | 版本2.3.1.4 *2015-06-01* 809 | 1.polipo配置修正 810 | 2.使用当前目录运行polipo,完美支持多开(端口同时支持socks5和http协议) 811 | 3.增加当前下载速度统计,以及最大下载速度记录 812 | 4.连接统计窗口优化显示效率 813 | 5.服务器配置显示ss链接,以便快速复制 814 | 6.连接统计窗口支持手工调整列宽 815 | 816 | 版本2.3.1.3 *2015-05-18* 817 | 1.服务器的DNS缓冲(TTL=600),让直接填写域名与写IP一样稳定 818 | 2.服务器连接状态记录,含上传下载流量,连接延迟统计,连接错误统计 819 | 3.服务器独立开关,在连接状态的“开”一列,鼠标点击之,红色为关闭 820 | 4.连接记录清除,在连接状态的错误记录三列,双击则重置错误数,双击百分比列则重置本服务器的所有信息 821 | 5.统计列表标题显示监听方式及端口(方便多开的时候对应上) 822 | 6.从剪贴板复制地址,方便从ss://xxxx这种格式快速输入 823 | 824 | 版本2.3.1.2 *2015-05-11* 825 | 1.允许程序多开 826 | 2.延迟统计,自动在低延迟服务器之中选择(高延迟的也会有低概率选取到) 827 | 3.二维码菜单位置变动 828 | 4.偶然会程序崩溃的问题不确定解决了没有,如还有发生请联系作者 829 | 830 | 版本2.3.1.1 *2015-05-03* 831 | 1.随机选择服务器 832 | 833 | ### License ### 834 | GPLv3 835 | 836 | ### Contact ### 837 | [GPG pubkey](https://github.com/breakwa11/pubkey) 838 | -------------------------------------------------------------------------------- /shadowsocks-win.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /shadowsocksr-win.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /ssr.md: -------------------------------------------------------------------------------- 1 | # ShadowsocksR 协议插件文档 # 2 | ---- 3 | 4 | ## 概要 ## 5 | 6 | 用于方便地产生各种协议接口。实现为在原来的协议外套一层编码和解码接口,不但可以伪装成其它协议流量,还可以把原协议转换为其它协议进行兼容或完善(但目前接口功能还没有写完,目前还在测试完善中),需要服务端与客户端配置相同的协议插件。插件共分为两类,包括混淆插件和协议定义插件。 7 | 8 | ## 现有插件介绍 ## 9 | 10 | #### 1.混淆插件 #### 11 | 此类型的插件用于定义加密后的通信协议,通常用于协议伪装,部分插件能兼容原协议。 12 | 13 | `plain`:表示不混淆,直接使用协议加密后的结果发送数据包 14 | 15 | `http_simple`:并非完全按照http1.1标准实现,仅仅做了一个头部的GET请求和一个简单的回应,之后依然为原协议流。使用这个混淆后,已在部分地区观察到似乎欺骗了QoS的结果。对于这种混淆,它并非为了减少特征,相反的是提供一种强特征,试图欺骗GFW的协议检测。要注意的是应用范围变大以后因特征明显有可能会被封锁。此插件可以兼容原协议(需要在服务端配置为`http_simple_compatible`),延迟与原协议几乎无异(在存在QoS的地区甚至可能更快),除了头部数据包外没有冗余数据包,客户端支持自定义参数,参数为http请求的host,例如设置为`cloudfront.com`伪装为云服务器请求,可以使用逗号分割多个host如`a.com,b.net,c.org`,这时会随机使用。注意,错误设置此参数可能导致连接被断开甚至IP被封锁,如不清楚如何设置那么请留空。服务端也支持自定义参数,意义为客户端仅能填写的参数列表,以逗号分割。 16 | 本插件的高级设置(C#版、python版及ssr-libev版均支持):本插件可以自定义几乎完整的http header,其中前两行的GET和host不能修改,可自定义从第三行开始的内容。例子: 17 | `baidu.com#User-Agent: abc\nAccept: text/html\nConnection: keep-alive` 18 | 这是填于混淆参数的内容,在#号前面的是上文所说的host,后面即为自定义header,所有的换行使用\n表示(写于配置文件时也可直接使用\n而不必写成\\n,换行符亦会转换),如遇到需要使用单独的\号,可写为`\\`,最末尾不需要写\n,程序会自动加入连续的两个换行。 19 | 20 | `http_post`:与`http_simple`绝大部分相同,区别是使用POST方式发送数据,符合http规范,欺骗性更好,但只有POST请求这种行为容易被统计分析出异常。此插件可以兼容`http_simple`,同时也可兼容原协议(需要在服务端配置为`http_post_compatible`),参数设置等内容参见`http_simple`,密切注意如果使用自定义http header,请务必填写boundary。 21 | 22 | `random_head`(不建议使用):开始通讯前发送一个几乎为随机的数据包(目前末尾4字节为CRC32,会成为特征,以后会有改进版本),之后为原协议流。目标是让首个数据包根本不存在任何有效信息,让统计学习机制见鬼去吧。此插件可以兼容原协议(需要在服务端配置为`random_head_compatible`),比原协议多一次握手导致连接时间会长一些,除了握手过程之后没有冗余数据包,不支持自定义参数。 23 | 24 | `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`。服务端暂不支持自定义参数。 25 | 26 | #### 2.协议定义插件 #### 27 | 此类型的插件用于定义加密前的协议,通常用于长度混淆及增强安全性和隐蔽性,部分插件能兼容原协议。 28 | 29 | `origin`:表示使用原始SS协议,此配置速度最快效率最高,适用于限制少或审查宽松的环境。否则不建议使用。 30 | 31 | `verify_deflate`(不建议):对每一个包都进行deflate压缩,数据格式为:包长度(2字节)|压缩数据流|原数据流Adler-32,此格式省略了0x78,0x9C两字节的头部。另外,对于已经压缩过或加密过的数据将难以压缩(可能增加1~20字节),而对于未加密的html文本会有不错的压缩效果。因为压缩及解压缩较占CPU,不建议较多用户同时使用此混淆插件。此插件**不能兼容原协议**,千万不要添加`_compatible`的后缀。 32 | 33 | `verify_sha1`(即原版OTA协议,已废弃):对每一个包都进行SHA-1校验,具体协议描述参阅[One Time Auth](https://shadowsocks.org/en/spec/one-time-auth.html),握手数据包增加10字节,其它数据包增加12字节。此插件能兼容原协议(需要在服务端配置为`verify_sha1_compatible`)。 34 | 35 | `auth_sha1`(已废弃):对首个包进行SHA-1校验,同时会发送由客户端生成的随机客户端id(4byte)、连接id(4byte)、unix时间戳(4byte),之后的通讯使用Adler-32作为效验码。此插件提供了能抵抗一般的重放攻击的认证,默认同一端口最多支持64个客户端同时使用,可通过修改此值限制客户端数量,使用此插件的服务器与客户机的UTC时间差不能超过1小时,通常只需要客户机校对本地时间并正确设置时区就可以了。此插件与原协议握手延迟相同,能兼容原协议(需要在服务端配置为`auth_sha1_compatible`),支持服务端自定义参数,参数为10进制整数,表示最大客户端同时使用数。 36 | 37 | `auth_sha1_v2`(已废弃):与`auth_sha1`相似,去除时间验证,以避免部分设备由于时间导致无法连接的问题,增长客户端ID为8字节,使用较大的长度混淆。能兼容原协议(需要在服务端配置为`auth_sha1_v2_compatible`),支持服务端自定义参数,参数为10进制整数,表示最大客户端同时使用数。 38 | 39 | `auth_sha1_v4`(不建议):与`auth_sha1`对首个包进行SHA-1校验,同时会发送由客户端生成的随机客户端id(4byte)、连接id(4byte)、unix时间戳(4byte),之后的通讯使用Adler-32作为效验码,对包长度单独校验,以抵抗抓包重放检测,使用较大的长度混淆,使用此插件的服务器与客户机的UTC时间差不能超过24小时,即只需要年份日期正确即可。能兼容原协议(需要在服务端配置为`auth_sha1_v4_compatible`),支持服务端自定义参数,参数为10进制整数,表示最大客户端同时使用数。 40 | 41 | `auth_aes128_md5`或`auth_aes128_sha1`(均推荐):对首个包的认证部分进行使用Encrypt-then-MAC模式以真正免疫认证包的CCA攻击,预防各种探测和重防攻击,同时此协议支持单端口多用户,具体设置方法参见breakwa11的博客。使用此插件的服务器与客户机的UTC时间差不能超过24小时,即只需要年份日期正确即可,针对UDP部分也有做简单的校验。此插件**不能兼容原协议**,支持服务端自定义参数,参数为10进制整数,表示最大客户端同时使用数。 42 | 43 | `auth_chain_a`(强烈推荐):对首个包的认证部分进行使用Encrypt-then-MAC模式以真正免疫认证包的CCA攻击,预防各种探测和重防攻击,数据流自带RC4加密,同时此协议支持单端口多用户,不同用户之间无法解密数据,每次加密密钥均不相同,具体设置方法参见breakwa11的博客。使用此插件的服务器与客户机的UTC时间差不能超过24小时,即只需要年份日期正确即可,针对UDP部分也有加密及长度混淆。使用此插件建议加密使用none。此插件**不能兼容原协议**,支持服务端自定义参数,参数为10进制整数,表示最大客户端同时使用数,最小值支持直接设置为1,此插件能实时响应实际的客户端数量(你的客户端至少有一个连接没有断开才能保证你占用了一个客户端数,否则设置为1时其它客户端一连接别的就一定连不上)。 44 | 45 | `auth_chain_b`(强烈推荐):与`auth_chain_a`几乎一样,但TCP部分采用特定模式的数据包分布(模式由密码决定),使得看起来像一个实实在在的协议,使数据包分布分析和熵分析难以发挥作用。如果你感觉当前的模式可能被识别,那么你只要简单的更换密码就解决问题了。此协议为测试版本协议,**不能兼容原协议**。 46 | 47 | 推荐使用`auth_chain_*`系列插件,在以上插件里混淆能力较高,而抗检测能力最高,即使多人使用也难以识别封锁。同时如果要发布公开代理,以上auth插件均可严格限制使用客户端数(要注意的是若为`auth_sha1_v4_compatible`,那么用户只要使用原协议就没有限制效果),而`auth_chain_*`协议的限制最为精确。 48 | 49 | ## 混淆特性 ## 50 | | name | RTT | encode speed | bandwidth | anti replay attack | cheat QoS | anti analysis | 51 | | ------------------- | :-: | -----------: | :-------: | :---------------: | :---: | -----------------: | 52 | | plain | 0 | 100% | 100% | No | 0 | / | 53 | | http_simple | 0 | 20%/100% | 20%/100% | No | 90 | 70 | 54 | | http_post | 0 | 20%/100% | 20%/100% | No | 100 | 70 | 55 | | random_head (X) | 1 | 100% | 85%/100% | No | 0 | 10 | 56 | | tls1.2_ticket_auth | 1 | 98% | 75%/ 95% | Yes | 100 | 90 | 57 | 58 | 说明: 59 | 60 | - 20%/100%表示首包为20%,其余为100%速度(或带宽),其它的 RTT 大于0的混淆,前面的表示在浏览普通网页的情况下平均有效利用带宽的估计值,后一个表示去除握手响应以后的值,适用于大文件下载时。 61 | - RTT 表示此混淆是否会产生附加的延迟,1个RTT表示通讯数据一次来回所需要的时间。 62 | - RTT 不为0且没有 anti replay attack 能力的混淆,不论协议是什么,都存在**被主动探测的风险**,即不建议使用`random_head`。 RTT 为0的,只要协议不是 origin,就没有被主动探测的风险。当然由于原协议本身也存在被主动探测的风险,在目前没有观察到主动探测行为的情况下,暂时不需要太担心。 63 | - cheat QoS 表示欺骗路由器 QoS 的能力,100表示能完美欺骗,0表示没有任何作用,50分左右表示较为严格的路由能识别出来。 64 | - anti analysis 表示抗协议分析能力,plain 的时候依赖于协议,其它的基于网友反馈而给出的分值。值为100表示完美伪装。 65 | 66 | ## 协议特性 ## 67 | 68 | 假设 method = "aes-256-cfb" 69 | 以下所有协议与均 anti CPA 70 | 71 | | name | RTT | encode speed | bandwidth | anti CCA | anti replay attack | anti MITM detect | anti packet length analysis | 72 | | -------------- | :-: | ----: | :-------: | :------: | :------: | :-------: | :--------: | 73 | | origin | 0 | 100% | 99% | No | No | No | 0 | 74 | | verify_deflate | 0 | 30% | 97%~110% | No | No | No | 6 | 75 | | verify_sha1 (X) | 0 | 85% | 98%/99% | No | No | No | 0 | 76 | | auth_sha1 (X) | 0 | 95% | 97% | No | Yes | No | 4 | 77 | | auth_sha1_v2 (X) | 0 | 94% | 80%/97% | No | Yes | No | 10 | 78 | | auth_sha1_v4 | 0 | 90% | 85%/98% | No | Yes | No | 10 | 79 | | auth_aes128_md5 | 0 | 80% | 70%/98% | Yes | Yes | Yes | 10 | 80 | | auth_aes128_sha1 | 0 | 70% | 70%/98% | Yes | Yes | Yes | 10 | 81 | | auth_chain_a | 0 | 70% | 75%/98% | Yes | Yes | Yes | 15 | 82 | | auth_chain_b | 0 | 70% | 70%/98% | Yes | Yes | Yes | 20 | 83 | 84 | 说明: 85 | 86 | - 以上为浏览普通网页(非下载非看视频)的平均测试结果,浏览不同的网页会有不同的偏差 87 | - encode speed仅用于提供相对速度的参考,不同环境下代码执行速度不同 88 | - verify_deflate的bandwidth(有效带宽)上限110%仅为估值,若数据经过压缩或加密,那么压缩效果会很差 89 | - verify_sha1的bandwidth意为上传平均有效带宽98%,下载99% 90 | - auth\_aes128\_md5的bandwidth在浏览普通网页时较低(为了较强的长度混淆,但单个数据包尺寸会保持在 TCP MSS 以内,所以其实对网速影响很小),而看视频或下载时有效数据比率比auth_sha1要高,可达97%,所以不用担心下载时的速度。auth\_chain\_a及auth\_aes128\_md5类似 91 | - 如果同时使用了其它的混淆插件,会令bandwidth的值降低,具体由所使用的混淆插件及所浏览的网页共同决定 92 | - 对于抗包长度分析一列,满分为100,即0为完全无效果,5以下为效果轻微,具体分析方法可参阅方校长等人论文 93 | - 对于抗包时序分析一列,方校长的论文表示虽然可利用,但利用难度大(也即他们还没能达到实用级),目前对此也不做处理 94 | 95 | ## 混淆与协议配置建议 ## 96 | 97 | - 协议推荐:协议用`auth_chain_*`最佳,此时推荐不使用加密(设置为none),混淆随意 98 | - 加密选择:若协议用`auth_chain_*`,那加密用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。 99 | - 混淆推荐:如果QoS在你的地区明显,混淆建议在`http_simple`与`tls1.2_ticket_auth`中选择,具体选择可以通过自己的试验得出。如果选择混淆后反而变慢,那么混淆请选择`plain`。如果你不在乎QoS,但担心你的个人vps能不能持久使用,那么混淆选择`plain`或`tls1.2_ticket_auth`,协议选择`auth_chain_*`或`auth_aes128_*` 100 | - 如果你用于玩游戏,或对连接延迟有要求的情况下,建议不要使用`tls1.2_ticket_auth`混淆,用其它混淆或`plain` 101 | - 服务端里,`http_simple`与`http_post`是相互兼容的,没有使用上的区别 102 | - 如果你在公司,或学校,或某些环境下,发现原版SS协议不可用,建议你启用`http_simple`、`http_post`或`tls1.2_ticket_auth`混淆,同时端口相应使用80或443,通常能解决问题。同时能躲避你所在环境下的网络封锁(如禁止访问网盘禁止上传等等) 103 | - 如果使用`tls1.2_ticket_auth`混淆或不开启混淆,那么协议最好不要使用`origin`或`verify_sha1` 104 | - 如果使用二重代理,一般你只需要考虑越过防火墙的那一段使用混淆或加强协议,除非为了匿名 105 | - 如果你发现你的代理突然不能用了,但换一个端口又能用了,或者等15分钟到半小时后又能用了,这种情况下请联系我 106 | 107 | ## 配置方法 ## 108 | 服务端配置:使用最新[SSR的manyuser](https://github.com/breakwa11/shadowsocks/tree/manyuser)分支 109 | user-config.json或config.json里有一个protocol的字段,目前的可能取值为: 110 | `origin` 111 | `verify_deflate` (不建议) 112 | `verify_sha1` (已过时) 113 | `verify_sha1_compatible` (已过时) 114 | `auth_sha1` (已过时) 115 | `auth_sha1_compatible` (已过时) 116 | `auth_sha1_v2` (已过时) 117 | `auth_sha1_v2_compatible` (已过时) 118 | `auth_sha1_v4` (不建议) 119 | `auth_sha1_v4_compatible` (不建议) 120 | `auth_aes128_md5` 121 | `auth_aes128_sha1` 122 | `auth_chain_a` 123 | `auth_chain_b` 124 | 125 | user-config.json或config.json里有一个obfs的字段,目前的可能取值为: 126 | `plain` 127 | `http_simple` 128 | `http_simple_compatible` 129 | `http_post` 130 | `http_post_compatible` 131 | `random_head` (已过时) 132 | `random_head_compatible` (已过时) 133 | `tls1.2_ticket_auth` 134 | `tls1.2_ticket_auth_compatible` 135 | 136 | 默认为 137 | `"protocol":"auth_aes128_md5",` 138 | `"obfs":"tls1.2_ticket_auth_compatible",` 139 | 相应的 140 | 协议插件参数默认为`"protocol_param":""` 141 | 混淆插件参数默认为`"obfs_param":""` 142 | 对于protocol,必须服务端与客户端严格匹配 143 | 服务端配置为`xxabc_compatible`时(以compatible为后缀的),即服务端**支持使用原版客户端**,或使用配置插件为`xxabc`或`plain`的ssr客户端。 144 | 145 | 客户端配置:使用本ssr版本,在编辑服务器配置里找到相应节点,最后在protocol选项和obfs选项的列表里选择需要使用的插件,然后填写相应的参数即可 146 | 147 | #### 兼容性 #### 148 | 149 | 目前ssr-libev客户端、ssr-python及ssr-csharp支持全部没有标注为过时或不推荐的协议和混淆。 150 | 151 | ## 实现接口 ## 152 | 以下以C#语言为例做说明 153 | 154 | interface IObfs 155 | 156 | 成员函数 157 | 158 | `InitData()` 159 | 参数:无 160 | 返回:一个自定义类型变量,通常用于保存此接口的全局信息,不应返回null,c语言中返回void* 161 | 说明:第一次创建实例前调用,同一服务端配置不会重复调用,服务端在建立监听时调用,客户端在第一次连接时调用。 162 | 163 | `SetServerInfo(ServerInfo serverInfo)` 164 | 参数:ServerInfo结构,包含成员变量: 165 | 166 | - host: 字符串类型,服务端ip,客户端需要把域名转换为ip,如有前置代理,则直接使用配置时所用的域名也可,服务端需要获取监听ip 167 | - port: 整数类型,服务端监听端口 168 | - param: 用户设置的参数,字符串类型 169 | - data: 由InitData返回的结果,为object类型(c语言中使用void*) 170 | - iv: 客户端或服务端加密时使用的iv数组(c语言中需要添加额外字段以记录其长度,下同) 171 | - recv_iv: 客户端或服务端接收到的iv数组 172 | - key: 加密时使用的key(不是原key,是通过BytesToKey生成的指定长度数组) 173 | - tcp_mss: 整数类型,TCP分包大小,设置为1460 174 | - overhead: 整数类型,协议头部大小,需要由调用方设置 175 | 176 | 返回:无 177 | 说明:实例构造的时候(每个连接建立时)调用,调用前iv和key必须已经初始化;而接收到数据后先初始化recv_iv再调用插件。 178 | 179 | `int GetOverhead()` 180 | 参数:无 181 | 返回:此插件在通信时的附加头部大小 182 | 183 | `Dispose()` 184 | 参数:无 185 | 返回:无 186 | 说明:实例析构时(每个连接关闭时)调用 187 | 188 | `byte[] ClientPreEncrypt(byte[] plaindata, int datalength, out int outlength)` 189 | 参数:需要处理的字节数组及其长度 190 | 返回:处理后的字节数组及其长度 191 | 说明:客户端发送到服务端数据**加密前**调用此接口 192 | 193 | `byte[] ClientEncode(byte[] encryptdata, int datalength, out int outlength)` 194 | 参数:需要编码的字节数组及其长度 195 | 返回:编码后的字节数组及其长度 196 | 说明:客户端发送到服务端数据**加密后**调用此接口 197 | 198 | `byte[] ClientDecode(byte[] encryptdata, int datalength, out int outlength, out bool needsendback)` 199 | 参数:需要解码的字节数组及其长度 200 | 返回:解码后的字节数组及其长度,以及needsendback标记是否立即回发服务端数据。如needsendback为true,则会立即调用ClientEncode,调用时参数是一个长度为0的字节数组 201 | 说明:客户端收到服务端数据在**解密前**调用此接口 202 | 203 | `byte[] ClientPostDecrypt(byte[] plaindata, int datalength, out int outlength)` 204 | 参数:需要处理的字节数组及其长度 205 | 返回:处理后的字节数组及其长度 206 | 说明:客户端收到服务端数据在**解密后**调用此接口 207 | 208 | `byte[] ServerPreEncrypt(byte[] plaindata, int datalength, out int outlength)` 209 | 参数:需要处理的字节数组及其长度 210 | 返回:处理后的字节数组及其长度 211 | 说明:服务端发送到客户端数据**加密前**调用此接口 212 | 213 | `byte[] ServerEncode(byte[] encryptdata, int datalength, out int outlength)` 214 | 参数:需要编码的字节数组及其长度 215 | 返回:编码后的字节数组及其长度 216 | 说明:服务端发送到客户端数据**加密后**调用此接口 217 | 218 | `byte[] ServerDecode(byte[] encryptdata, int datalength, out int outlength, out bool needdecrypt, out bool needsendback)` 219 | 参数:需要解码的字节数组及其长度 220 | 返回:解码后的字节数组及其长度,以及needdecrypt标记数据是否需要解密(一般都应该为true),以及needsendback标记是否立即回发客户端数据。如needsendback为true,则会立即调用ServerEncode并发送其返回结果,调用时参数是一个长度为0的字节数组 221 | 说明:服务端收到客户端数据在**解密前**调用此接口 222 | 223 | `byte[] ServerPostDecrypt(byte[] plaindata, int datalength, out int outlength)` 224 | 参数:需要处理的字节数组及其长度 225 | 返回:处理后的字节数组及其长度 226 | 说明:服务端收到客户端数据在**解密后**调用此接口 227 | 228 | `byte[] ClientUdpPreEncrypt(byte[] plaindata, int datalength, out int outlength)` 229 | 参数:需要处理的字节数组及其长度 230 | 返回:处理后的字节数组及其长度 231 | 说明:客户端发送到服务端UDP数据**加密前**调用此接口 232 | 233 | `byte[] ClientUdpPostDecrypt(byte[] plaindata, int datalength, out int outlength)` 234 | 参数:需要处理的字节数组及其长度 235 | 返回:处理后的字节数组及其长度 236 | 说明:客户端收到服务端UDP数据在**解密后**调用此接口 237 | 238 | `byte[] ServerUdpPreEncrypt(byte[] plaindata, int datalength, out int outlength)` 239 | 参数:需要处理的字节数组及其长度 240 | 返回:处理后的字节数组及其长度 241 | 说明:服务端发送到客户端UDP数据**加密前**调用此接口 242 | 243 | `byte[] ServerUdpPostDecrypt(byte[] plaindata, int datalength, out int outlength)` 244 | 参数:需要处理的字节数组及其长度 245 | 返回:处理后的字节数组及其长度 246 | 说明:服务端收到客户端UDP数据在**解密后**调用此接口 247 | 248 | ### 插件编写 ### 249 | 250 | 有两类插件,一类是协议插件,一类是混淆插件 251 | 252 | 其中接口InitData, SetServerInfo, Dispose接口必须实现,其它的接口为通讯接口 253 | 254 | 编写协议插件的话,需要重写ClientPreEncrypt, ClientPostDecrypt, ServerPreEncrypt, ServerPostDecrypt,其它的按原样返回,needdecrypt必须为true,needsendback必须为false 255 | 256 | 编写混淆插件的话,需要重写ClientEncode, ClientDecode, ServerEncode, ServerDecode,其它的按原样返回。 257 | 258 | 如果编写的部分仅含客户端部分,那么只需要编写Client为前缀的两个接口,服务端同理。 259 | 260 | 目前支持此插件接口的,有 [ShadowsocksR C#](https://github.com/shadowsocksr/shadowsocksr-csharp/releases) 和 [ShadowsocksR Python](https://github.com/shadowsocksr/shadowsocks/tree/manyuser) -------------------------------------------------------------------------------- /update/ssr-win-3.8.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | --------------------------------------------------------------------------------