imtoken网站地址|ss协议
互联网安全知识扫盲(第二十三期):详解5种翻墙代理协议:Shadowsocks,ShadowsocksR,Vmess,Vless,Trojan - 知乎
互联网安全知识扫盲(第二十三期):详解5种翻墙代理协议:Shadowsocks,ShadowsocksR,Vmess,Vless,Trojan - 知乎首发于网络安全切换模式写文章登录/注册互联网安全知识扫盲(第二十三期):详解5种翻墙代理协议:Shadowsocks,ShadowsocksR,Vmess,Vless,Trojan乏微之无知是福翻墙的原理其实很简单,几乎所有翻墙的原理都是基于“加密代理中转”来实现的为了连接不被GFW阻断,你并不直接和国外的目标服务器(比如Google的服务器)建立连接,而是先将请求发送到一个位于国外的服务器(这个服务器叫做代理服务器)上,再经由该服务器进行中转,从而将你的请求送达目标服务器,目标服务器对你的回复也是如此过程。这其中的关键之处就在于,你和代理服务器之间的连接并不会被GFW阻断。也就是说,GFW认为这个连接属于正常连接,因此予以放行而要想让GFW无法知道你最终要访问哪个网站,就要依靠加密技术。今天来讲的这些协议就是实现加密这种最主要的功能的,只要你和代理服务器之间的通信流量是加密的。这样一来,GFW就无法识别流量的具体内容,只能默认放行下面来讲五种常见的翻墙代理协议(Shadowsocks,ShadowsocksR,Vmess,Vless,Trojan,它们各自有着不同的特点和工作原理:SS Shadowsocks特点:Shadowsocks(简称SS)是一种流行的加密代理服务,旨在帮助用户绕过互联网内容的地理限制或审查,如中国的防火长城(GFW)它使用socks5代理方式,Socks5是一种网络协议,它允许客户端通过代理服务器在客户端和目标服务器之间传递网络包。Socks5支持全面的网络协议(如TCP和UDP),能够处理各种类型的网络请求,并且支持身份验证和加密,Shadowsocks利用这一点来保护数据传输与其他翻墙工具相比,Shadowsocks配置简单,占用资源少,运行效率高。它可以在几乎所有类型的设备上运行,包括Windows、MacOS、Linux、Android、iOS等Shadowsocks使用各种加密算法(如AES-256-CFB、ChaCha20等)来保护数据传输的安全。加密确保了用户数据的隐私和安全性,使得监控者难以窥探数据内容工作原理:客户端与服务器之间的加密连接:用户首先在自己的设备上安装Shadowsocks客户端,并配置要连接的Shadowsocks服务器信息(包括服务器地址、端口和加密方法)。当用户通过客户端访问互联网时,Shadowsocks客户端会将请求加密后发送给服务器数据中转:位于海外的Shadowsocks服务器接收来自客户端的加密请求,解密这些请求,然后以服务器自身的身份向目标网站发送请求。这个过程隐藏了用户的真实IP地址,使得请求看起来像是从Shadowsocks服务器所在地发出的返回数据的加密传输:目标服务器将响应发送回Shadowsocks服务器,服务器再次加密这些数据,然后发送回用户的设备。客户端接收到加密数据后进行解密,最终用户就能看到请求的内容SSR(ShadowsocksR)ShadowsocksR(简称SSR)是基于Shadowsocks(SS)的改进版本,由于SS的一些缺陷被防火长城(GFW)检测到后,SSR被开发出来以增强原有协议的隐蔽性和安全性特点协议层面的改进:SSR在SS的基础上增加了新的协议选项。这些协议用于包装数据,使得数据流更难以被识别和分析,从而增加了通过审查的概率混淆技术:SSR引入了混淆技术,它可以将数据流伪装成正常的互联网流量,如常见的HTTPS流量。这样做可以让SSR的流量在网络上更难以被区分和识别,降低了被防火长城等审查工具检测到的风险安全性提升:通过改进的加密方法和混淆技术,SSR提供了比SS更强的安全性。用户的数据传输更难被第三方监控或审查用户自定义:SSR允许用户在很大程度上自定义混淆方法和协议,这意味着用户可以根据自己的需求和网络环境调整SSR的设置,以达到最佳的翻墙效果工作原理:客户端与服务器之间的加密连接:用户在设备上配置SSR客户端,包括服务器地址、端口、密码、加密方式、协议和混淆设置。当用户尝试连接互联网时,SSR客户端会先对请求数据进行加密数据包装与混淆:加密后的数据会根据用户设置的协议和混淆方法被进一步处理。这一步骤的目的是让数据包看起来像是正常的互联网数据,例如让其看起来像是在访问常见的网站数据中转:加密和混淆后的数据被发送到位于境外的SSR服务器。服务器解密并识别出真实的请求,然后代表用户向目标网站发送请求返回数据的加密传输:目标网站的回应数据被SSR服务器接收,然后该服务器将数据加密并进行混淆处理,最后发送回用户的设备客户端解密数据:SSR客户端在用户的设备上接收到来自服务器的数据后,将其解密和去除混淆,恢复成原始的数据格式,并呈现给用户总的来说,SSR提供了一种更为隐蔽和安全的方式来帮助用户绕过GFW,通过对数据包进行加密和混淆处理,使得审查系统难以识别真实的网络请求,从而让用户能够访问在某些地区受到限制或屏蔽的内容。由于SSR可以高度定制化,它在不断变化的网络审查环境中仍然是一个有效的工具VmessVmess是一个专为V2Ray项目设计的通信协议,它非常适合用于翻墙,即绕过互联网审查。这个协议的设计注重灵活性和安全性,以下是对Vmess特点和工作原理的详细解释:特点复杂的加密和混淆机制:Vmess协议使用了多层加密技术,这些技术可以有效地隐藏用户的数据流,使其不容易被审查系统(如GFW)检测到。混淆机制进一步伪装数据流,使其看起来像正常的互联网流量,例如访问普通网站时的流量支持多种传输协议:Vmess不仅支持基本的TCP和UDP协议,还支持如WebSocket、HTTP/2、mKCP等多种传输方式。这使得Vmess可以根据网络环境的不同选择最适合的传输方式,以实现最佳的性能动态变化的连接:Vmess协议的设计允许连接参数动态变化,每次连接时都使用不同的参数,这样即使有人在监控你的网络连接,也很难从数据包特征上追踪到你工作原理客户端与服务器之间的通信:用户首先需要在自己的设备上配置Vmess客户端,包括服务器的地址和密钥。当用户尝试通过Vmess访问互联网时,客户端将根据预设的信息对数据进行加密处理动态加密:Vmess协议的核心特性之一是它的动态加密能力。客户端和服务器之间会预先分享一些信息,如加密算法和密钥。每次连接时,这些信息都会以某种方式进行更新,确保每一次的连接看起来都是全新的服务器作为中转站:客户端发送的加密数据包到达Vmess服务器后,服务器会解密这些数据,然后以服务器的身份将请求发送到目标网站。这个过程隐藏了用户的真实IP地址,使得请求看起来像是从服务器所在地发出的返回数据的处理:目标网站回应的数据发送到Vmess服务器,服务器再次对这些数据进行加密,然后发送回客户端。客户端收到数据后,进行解密并显示给用户Vmess协议的设计使得用户在互联网上的活动更难以被追踪,通过动态的加密和混淆技术,以及支持多种传输协议,Vmess成为了一个强大且灵活的工具,用于保护用户的隐私并绕过网络审查VlessVless是一个较新的通信协议,它出现的目的是为了解决Vmess协议的一些性能和延迟问题。让我们来详细解释一下Vless的特点和工作原理:特点简化的设计:Vless减少了Vmess协议中的一些复杂功能,这样做的好处是让Vless运行得更快,配置起来也更简单。这对于不是很懂技术的用户来说,是一个很大的优点更高效的性能:由于Vless更加简化,它处理数据的速度更快,对于那些需要快速访问互联网资源的用户来说,Vless能提供更好的体验。更低的延迟:延迟是指数据从一个地方传到另一个地方所需的时间。Vless由于设计上的优化,可以减少这个时间,这对于玩游戏或者进行视频通话等需要实时互动的活动特别重要。核心功能的专注:Vless去除了Vmess中的一些非必要功能,它只专注于提供最关键的服务——加密和数据传输。这种专注使得Vless在这些核心功能上做得更好工作原理强大的加密:尽管Vless设计上更简单了,但它并没有牺牲安全性。它依然使用先进的加密技术来保护用户数据,防止数据在传输过程中被别人窥视或篡改混淆能力:Vless虽然在设计上简化,但仍然具有混淆数据的能力。混淆可以将数据包装成看起来像正常流量,这样就更难被防火墙等审查系统检测到数据传输:当用户通过Vless发送请求时,请求首先会被加密。然后加密后的数据被发送到服务器。服务器接收到数据后,会解密并将请求发送到目标网站。当服务器接收到目标网站的回应后,它会再次加密这些数据,并发送回用户。用户的设备收到数据后,会解密并将信息显示给用户简而言之,Vless通过去除一些非核心功能,专注于加密和快速传输,从而为用户提供了一个更轻量级、更高效、延迟更低的网络协议。这使得Vless成为一个非常适合需要快速和安全网络连接的用户的协议TrojanTrojan是一个较新的代理协议,它的设计理念在于模拟正常的HTTPS网站流量,以此来欺骗并绕过中国的防火长城(GFW)特点模仿HTTPS流量:Trojan协议设计成使其流量外表看上去与普通的HTTPS加密流量没有区别。HTTPS是互联网上常见的加密协议,用于保护用户数据不被第三方轻易读取,Trojan就是利用这种常见性来隐藏其真实目的高隐蔽性:由于Trojan流量在外观上无法与普通HTTPS流量区分,它能够有效地隐蔽其代理流量,使之不易被GFW等审查工具识别和封锁工作原理服务器设置:在使用Trojan协议的过程中,服务器端会模拟一个正常的HTTPS网站。这意味着服务器会有一个有效的SSL/TLS证书,就像一个真实的网站一样,用于加密数据和建立安全连接客户端连接:用户在自己的设备上安装了Trojan客户端,并配置好连接到服务器的相关信息。当用户尝试访问互联网时,客户端会像访问普通HTTPS网站一样与服务器建立连接数据转发:服务器收到来自Trojan客户端的请求后,会识别这些请求并将它们转发到真正的目标服务器。对外界来说,这些请求看起来仅仅是用户在浏览使用HTTPS协议的正常网站数据接收和回应:当目标服务器回应请求时,回应的数据首先发送到Trojan服务器。服务器收到数据后,再将其转发回Trojan客户端。这个过程中,数据的传输保持加密,从而保持了传输的安全性和隐私通过这样的方式,Trojan帮助用户在不引起注意的情况下穿越网络审查,访问那些在某些地区可能被封锁的网站和服务。由于其伪装能力强,使得Trojan成为了一个在翻墙工具中相对难以检测的选择结语网传 GFW 已经通过机器学习、随机预测算法精准识别SS流量,所以才有那么多的翻车事故。SS/SSR使用的标准协议已经落后,流量特征较明显,所以正在被越来越多的人抛弃,不过其市场基础依旧稳固,而根据上面的总结,我们会发现当下的科学上网方式主要就是加密流量、伪装流量。未来翻墙技术的发展方向应该是越接近“正常流量"越可靠发布于 2024-02-26 07:11・IP 属地四川代理合作协议赞同 141 条评论分享喜欢收藏申请转载文章被以下专栏收录网络安全了解网络安全,保护自
shadowsocks 原理详解 | Overtalk
shadowsocks 原理详解 | Overtalk
QinHan
Game Developer & Designer
Shanghai, China
×
Toggle navigation
首页
归档
分类
标签
项目
友链
关于
公告
欢迎交流与分享经验!邮箱:qinhan_shu@163.com
分类
fragment3interview4jewellery4linux1minio1mongo1rtc3book1freeswitch1编程141游戏1随笔2
标签
CI/CD1Docker1Golang35Nagle1Network1Redis6Redis备份1Shadowsocks1Socks51algorithm8clion1cpp50docker3dw1endian1epoll1freeswitch1git1gpg1interview4io3ip2iptables1k8s1kernal1linux8loadbalance2lock-free1lua9mac2mongo1mysql3network1python3recastnavigation1regex1rtc3service mesh1shadowsocks1shell2ssh3systemcall2systemd1tcp6个人网盘1并发1游戏1随笔2
标签云
CI/CD Docker Golang Nagle Network Redis Redis备份 Shadowsocks Socks5 algorithm clion cpp docker dw endian epoll freeswitch git gpg interview io ip iptables k8s kernal linux loadbalance lock-free lua mac mongo mysql network python recastnavigation regex rtc service mesh shadowsocks shell ssh systemcall systemd tcp 个人网盘 并发 游戏 随笔
归档
七月 20221二月 20211一月 20211十一月 20201十月 20201八月 20202七月 202015六月 20203五月 20206四月 202014三月 202016二月 202015一月 202013十二月 201920十一月 20196十月 201925九月 20191八月 20192七月 20199四月 20192三月 20191十一月 20189
最新文章
bitmap
2022-07-19
编程
导航网格-基础概念&数据结构
2021-02-02
mongo
mongo 杂记
2021-01-19
编程
Python 如何查找属性
2020-11-08
编程
Linux TCP/IP 性能调优
2020-10-10
shadowsocks 原理详解
2020-02-25
编程
shadowsocks
0
评论
shadowsocks 原理详解
详解
这个东西用的人不少,知道原理的人却不多,本文主要分析Shadowsocks实现的技术原理。
Shadowsocks的架构
Shadowsocks(后文缩写为SS)由两部分组成,客户端和服务器端。常用的客户端有shadowsocks-win、ShadowsocksX-NG、shadowsocks-Qt5、shadowsocks-android…;常用的服务器端有Python版本,Go语言版本,C、C++……。客户端启动后会开启一个本地代理(SOCKS5 / HTTP Proxy),通过修改操作系统配置或者浏览器配置把访问请求转发给本地代理。当我们通过浏览器访问某个地址的时候,数据会被转发到本地代理,由本地代理加密后转发到服务器端,服务器端处理完请求后把数据加密后返回给客户端的本地代理,本地代理再次返回给浏览器。
要澄清两点:1. SS协议和Http Proxy、Socks5没有半毛钱关系,这两个协议是浏览器或者操作系统所支持的标准代理协议,SS的架构中只是用这两种协议作为“获取用户请求”的手段而已。2. SS协议中没有任何控制流,本地代理获取用户原始TCP/UDP数据包获取之后会直接取出Data部分,重新构造一个IP数据包(可能是TCP或者UDP,和用户原始请求是TCP还是UDP有关系。),目标地址和端口是服务器地址,数据包的Data部分是加密后的用户原始Data。
协议详解socks5 协议
请见 socks5 详解
该协议主要用于客户端流量代理到 ss-local
shadowsocks 协议
官方文档
用户实际请求的数据包。通过 ss-local 发送到 ss-server 的格式十分简陋,由两部分组成:
1[target address][payload]
ss-server 接收加密的数据流,解密并解析前导目标地址(target address)。然后,将有效载荷数据转发给目标。ss-server 接收来自目标的回复,进行加密并将其转发回 ss-local。
其中地址部分(target address)格式如下所示:
1[1-byte type][variable-length host][2-byte port]
定义了以下地址类型:
0x01:主机是一个4字节的IPv4地址。
0x03:host是一个可变长度的字符串,从1字节长度开始,后跟最多255字节域名。
0x04:host是一个16字节的IPv6地址。
端口号是2字节的big-endian无符号整数。
数据传输
本部分将从本地流量产生出发,详细介绍整个流量转发的过程,可以根据转发流量的协议分成两种:tcp/udp
在shadowsocks的golang版本源码中,ss-server 在同一个端口监听tcp/udp
TCP 流量
本地 tcp包 首先通过 socks5 协议发送到 ss-local
ss-local 将本地的tcp包数据加上 target addr,封装成 shadowsocks 协议包,发给 ss-server 的tcp端口
ss-server 解包,与target addr建立tcp连接,将数据包发送给 target addr
ss-server 将 target addr 回的数据包通过原tcp连接返回给 ss-local
ss-local 通过 socks5 返回数据包
UDP
udp 的整个流程和 tcp 类似,但是不同的是 udp 不是面对连接的,需要维持一个 nat map
当 ss-server 收到udp包时,回记录发送者的addr,为此创建一个 udp socket,并记录到 nat map 中
通过上述 udp socket 发送/接受数据,收到数据时,根据nat map将数据发送给对应的 ss-local
本文链接:
https://overtalk.site/2020/02/25/network-shadowsocks/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY 4.0 CN协议 许可协议。转载请注明出处!
QinHanGame Developer & Designer
当你发现自己的才华撑不起野心时,就请安静下来学习吧!
上一篇
下一篇
赏
×
感谢您的支持,我会继续努力的!
喜欢就收藏,疼爱就打赏!
支付宝扫一扫
喜欢就收藏,疼爱就打赏!
微信扫一扫
支付宝
微信支付
Powered by Hexo base on pure.
Shadowsocks协议解析 | 不一
Shadowsocks协议解析 | 不一
首页
目录
关于
Shadowsocks协议解析
2020-06-19
Shadowsocks过程Shadowsocks是一个代理协议,以下简称SS。当然基于SS协议催生出了许多的代理软件,例如Shadowsocks-NG(MacOS平台)、Shadowrocket(iOS平台)等。不过总归来说SS的流程是一致的:上图简述了SS在整个数据传输中的位置,包含了SS客户端和SS服务端两个部分,一般来说SS客户端是安装在本地的软件,而SS服务端则是运行在VPS上的软件。如果没有SS的话,上图就成了没有代理的用户与目标服务器(例如Google.com)的直接通信。下面一SS代理下的HTTP请求介绍上述过程:
浏览器要访问Google.com,便生成HTTP请求。由于设置了代理,所以不会直接发送到Google服务器,而是发送到SS客户端(例如127.0.0.1:1086)。
SS客户端把HTTP请求封装成SS请求(后面详细介绍),包含协议封装和加密过程,发送给SS服务器。
SS服务器收到SS请求并解析,包含解密和协议解析过程,获得原始HTTP请求。
SS服务器连接Google服务器,发送用户的原始HTTP请求,并获取Google返回的HTTP响应。
SS服务器对HTTP请求进行加密,并发送到SS客户端。此处没有协议封装。
SS客户端收到SS服务器的响应,进行数据解密得到HTTP响应,发送到浏览器以完成HTTP请求。
Shadowsocks协议接下来会在字节层面对上述过程进行详细介绍。由于SS在处理TCP连接和UDP报文所使用的协议有所差异,因此也会分开介绍。
TCP连接TCP连接模式主要包括HTTP、HTTPS和Socket等应用层协议,这些协议有所差异比如说有的协议有握手,有的协议却只有一来一回的数据交互,有的协议可能会保持长时间的连接和数据传输。。但这些对于SS来说都是一样的,因为它们都不过是数据(payload),而SS要做的无非是创建两个通道,一个用于把客户端数据传输到服务端,一个用于把服务端的数据传输到客户端。
SS请求TCP握手很熟悉了,握手的目的是建立数据链路。SS也有握手过程,目的就是建立上述的数据链路,不过这个过程只有半次握手,即SS请求。SS请求的主要功能是建立代理链路,因此需要告诉SS服务器要代理访问的远程服务器地址(如果不知道IP地址的话,给域名也可以),然后可以顺便携带一部分传输数据。根据地址类型的不同,SS请求会有3种形式:
通过SS请求传输目标服务器的IPv4地址:
通过SS请求传输目标服务器的IPv6地址:
在不知道目标服务器IP地址的时候(比如DNS被劫持),直接传输目标服务器的域名:
客户端加密SS客户端把SS请求组装好了,在向SS服务器传输之前还需要进行加密,否则用户的数据就在网络上明文传输了,这个是很不安全的。下面举例使用SS中最常用的加密方案AES-256-cfb方式进行数据加密,大致步骤如下:
密钥生成:AES-256意味着其密钥长度是256bit,但用户密码有长有短,而且都是可见的ASCII,把密码作为密钥来用显然安全性是不够的,所以需要根据密码生成安全性达标的256bit长度密钥。SS中使用MD5对密码生成16byte长度的消息摘要,即可作为密钥使用。
IV生成:原始AES加密下,对于相同的明文会生成相同的密文,这也是安全性的一种缺陷。AES-cfb通过引入随机数IV的方式解决该问题,即在随机数IV的加持之下可以实现相同的明文生成不同的密文。在AES-256-cfb中,IV是一个16bit的随机数。
加密:有了密钥、加密算法、IV,就可以生成加密器,并对数据进行加密了。在此数据就是上述所组装的SS请求,得到密文cypher。为了让SS服务端可以解密,还需要把IV也一同发送,所以最终生成的数据如下:
服务端解析SS服务器和SS客户端所共享的信息有密码和加密方式,这是配置过SS服务器的人都知道的,在收到SS客户端发送的SS请求后,SS客户端进行解析的过程如下:
密钥生成:根据密码生成密钥,由于和客户端拥有相同的密码和密钥生成算法,所以生成的AES-256-cfb密钥也是一样的。
获取IV:从SS客户端接收到的数据前16bit提取出来就得到了AES-256-cfb的IV。
解密:根据密钥、加密算法和IV生成解密器,对收到的数据进行解密,就得到了SS请求明文。
地址解析:根据SS请求的第1个Byte得知目标服务器地址的类型(IPv4,IPv6或域名),并根据相应的规则进行解析得到其地址与端口。
代理请求:说到底SS就是一个代理协议,代理的意思就是代替客户端对目标服务器发起请求。通过地址与端口连接目标服务器,并发送解密后的数据,完成请求。
服务端响应SS服务器收到目标服务器的数据,把数据传输给SS客户端,也需要进行加密,不同的是不需要组装协议了。所以该过程就比较简单:
生成IV:虽然也是随机数,但该IV与SS客户端发送请求时生成的IV不相等,需要再生成一个。
加密:根据新生成的IV、密钥和加密算法生成加密器,对目标服务器响应的数据进行加密。同样为了SS客户端可以解密,也需要把IV连同密文一起发送给客户端,最终发送的数据如下:
客户端解析SS客户端收到服务端的数据,通过提取IV就可以生成响应的解密器,对数据进行解密,从而完成用户与目标服务器的通信。上述的加密器和解密器都是和连接绑定的,即一次TCP连接代理通信只需要互相发送一次IV用于双方创建解密器,而后续的通信内容都只有包括密文部分,使用解密器进行解密即可。所以其实SS协议的过程是非常简单的,以至于在画下图的时候都不知道有什么可以加上的东西。
UDP连接UDP模式在SS中通过UDP转发选项开启,用于代理UDP流量如DNS查询、即时语音通信等。
UDP模式和TCP模式差异SS中TCP和UDP大同小异,但由于UDP之于TCP是无连接协议,因此简单探讨一下UDP模式无连接下的一些区别:
TCP连接作为基本单位:在TCP模式中,从握手到挥手的过程就是一次连接,因此一次连接是SS中的基本单位,所以一次连接对应上下行的2个加密通道、2个IV。所以一次TCP连接中无论有多少次数据交互,只需要一次握手。
UDP数据分组作为基本单位:在UDP模式中没有连接的概念,其基本单位是每个数据包,所以每个数据包对应1个IV和加密解密器。可以说在UDP模式下有多少个数据包,就会发生多少次SS握手。
连接方式差异:因为UDP是无连接,所以在socket编程时通常不会像UDP连接一样,先connect然后才数据读写,而是直接进行数据包的收发。
方向性:TCP模式种中总是SS客户端向SS服务器发起握手,但在UDP模式中由于没有连接的概念,所以每个数据包都是平等的自带握手信息,即使SS服务器向SS客户端发送的数据也是。
UDP下的握手协议UDP模式中每一个数据包都具有相同格式,无论是从SS客户端发往SS服务器,还是从SS服务器发往SS客户端,其格式与上述SS请求相同:所以不仅SS客户端会把需要代理访问的目标服务器的地址信息告诉SS服务器,SS服务器也会把目标服务器返回的数据连同其地址信息一同返回SS客户端。这主要是因为UDP模式下是没有连接的概念,所以每条数据需要自带一些额外信息,就像每次进商场都要戴口罩测体温一样。
后记学术交流而已。
Site by
喂草。
using
hexo blog framework
with theme
Noone.
Shadowsocks - 维基百科,自由的百科全书
Shadowsocks - 维基百科,自由的百科全书
斑点象
注册
登录
+ 发布
我发布的
我的标签
发现
+ 我要发布
我发布的
我的标签
发现
浏览器扩展
斑点象@Edge
Shadowsocks - 维基百科,自由的百科全书
Shadowsocks(简称SS)是一种基于Socks5代理方式的加密传输协议,也可以指实现这个协议的各种开发包。目前包使用Python、C、C++、C#、Go语言、Rust等编程语言开发,大部分主要实现(iOS平台的除外)采用Apache许可证、GPL、MIT许可证等多种自由软件许可协议开放源代码。Shadowsocks分为服务器端和客户端,在使用之前,需要先将服务器端程序部署到服务器上面,然后通过客户端连接并创建本地代理。
在中国大陆,本工具广泛用于突破防火长城(GFW),以浏览被封锁、遮蔽或干扰的内容。2015年8月22日,Shadowsocks原作者Clowwindy称受到了中国警方的压力,宣布停止维护此计划(项目)并移除其个人页面所存储的源代码。
为了避免关键词过滤,网民会根据谐音将ShadowsocksR称为“酸酸乳”[注 1](SSR),将Shadowsocks称为“酸酸”(SS)。另外,因为Shadowsocks(R)的图标均为纸飞机,所以专门提供Shadowsocks(R)或类似服务(如V2Ray和TROJAN)的网站则就被称为了“机场”。
历史
Shadowsocks最早由V2EX用户“clowwindy”2012年4月发布在该论坛。
项目转手
2015年8月22日,其作者Clowwindy在GitHub上称,警察在两日前要求他停止开发Shadowsocks项目并删除其所有代码。之后,作者停止维护Shadowsocks,其GitHub项目页面已被清空。消息传出后,许多中国大陆和外国开发商,以及Shadowsocks用户,在GitHub中对作者表示了致谢,对已清空源代码的项目页面加星标,因此在当时Shadowsocks反而成为了GitHub上的“热门项目(Trending)”。本以为是当局主动出击,但另有消息据称,原作者曾作出的“透露中国社会现状”的发言可能遭到某些中华人民共和国政府支持者的检举,从而为后来被要求撤下项目源代码的事件埋下伏笔,而类似的因个人网络发言而被检举的事件在中国大陆也“时有发生”。
8月25日,另一个用于突破网络审查的GoAgent项目也被作者自行删除。删除后几小时之内,GitHub遭到了来自中国大陆的DDoS攻击。据报这次攻击与中华人民共和国政府有关,因为中国政府此前曾要求GitHub移除两个对抗网络审查的项目但没有被接受。
2015年8月28日,电子前哨基金会针对Shadowsocks和GoAgent被删除一事发表评论,对中华人民共和国政府针对翻墙软件作者的打击表示“强烈谴责”。
Git仓库的日志显示该项目被移除以前就有大量的复刻副本,不少副本仍然有用户维护。所以尽管Shadowsocks项目页经过此次打击,也陆续恢复了内容,甚至本身并转交由多人维护成不同版本,各大Linux包的软件仓库均有各式Shadowsocks的实现的包仍持续更新可用,目前的Shadowsocks更新基本上来自这些作者执行。
运行原理
Android版本Shadowsocks应用程序
Shadowsocks的运行原理与其他代理工具基本相同,使用特定的中转服务器完成数据传输。例如,用户无法直接访问Google,但代理服务器可以访问,且用户可以直接连接代理服务器,那么用户就可以通过特定软件连接代理服务器,然后由代理服务器获取网站内容并回传给用户,从而实现代理上网的效果。服务器和客户端软件会要求提供密码和加密方式,双方一致后才能成功连接。连接到服务器后,客户端会在本机构建一个本地Socks5代理(或VPN、透明代理等)。浏览网络时,客户端通过这个Socks5(或其他形式)代理收集网络流量,然后再经混淆加密发送到服务器端,以防网络流量被识别和拦截,反之亦然。
特点
Shadowsocks使用自行设计的协议进行加密通信。加密算法有AES-GCM、ChaCha20-Poly1305、2022-BLAKE3-AES-GCM等,除创建TCP连接外无需握手,每次请求只转发一个连接,无需保持“一直连线”的状态,因此在移动设备上相对较为省电。
所有的流量都经过算法加密,允许自行选择算法。
Shadowsocks通过异步I/O和事件驱动程序运行,响应速度快。
客户端覆盖多个主流操作系统和平台,包括Windows、macOS、Android、Linux和iOS系统和路由器(OpenWrt)等。
安全性
Clowwindy称Shadowsocks的最初只是“自用”,用来“翻墙”,而不是提供密码学意义的安全,所以Shadowsocks自行设计的加密协议对双方的身份验证仅限于预共享密钥,亦无完全前向保密,也未曾有安全专家公开分析或评估协议及其实现。
一个用 Python 写的 socks 加密代理。加密方法很简单,不过欺骗 GFW 足够了。
——clowwindy
Shadowsocks的目标不在于提供完整的通信安全机制,主要是为了协助上网用户在严苛的网络环境中突破封锁,不能替代TLS或者VPN。
AEAD加密方式(AES-GCM、Chacha20-poly1305)在SIP004提案提出并在SIP007提案实现,这些加密方式被认为可以提供密码学意义的安全(“保密性,完整性,可用性”),之前AES CFB、AES CTR、RC4、Chacha20等没有认证的加密方式仍在一部分实现中被允许存在。Shadowsocks-windows已经移除了非AEAD加密方式的支持。
Shadowsocks多次被提到协议设计问题,有被主动探测的风险:
2015年,ShadowsocksR的原开发者breakwa11提到原协议设计导致没有验证数据包完整性而被主动探测的风险,之后Shadowsocks的后继开发者madeye引入One Time Auth(OTA)方案试图解决,但breakwa11指出还是不能避免主动探测风险,最终引入AEAD加密方式并放弃OTA方案。
2021年2月28日,GitHub用户RPRX提出Shadowsocks AEAD加密方式设计存在严重漏洞,无法保证通信内容的可靠性,随后开发者验证了本地echo自交思路的可行性。3月1日,RPRX又提出可利用服务端防重放机制使Shadowsocks、Vmess等未知流量代理实质性失效,随后gfw-report(讨论串下的一个用户)验证了这一思路的可行性。
插件及流量混淆
2017年9月21日,一篇名为《The Random Forest based Detection of Shadowsock's Traffic》的论文在IEEE发表,该论文介绍了通过随机森林算法检测Shadowsocks流量的方法,并自称可达到85%的检测精度,虽然该论文的有效性遭到网友质疑。但是使用机器学习来识别网络流量特征的做法被认为是可行的,而且还适用于任何网络代理协议而不仅仅局限于Shadowsocks。
Shadowsocks在SIP003提案中支持了插件,插件让Shadowsocks的流量可以通过不同的插件进行混淆加密或其他处理。目前使用较多的插件有v2ray-plugin、simple-obfs等。
实现
目前Shadowsocks有多个实现支持,以自由软件形式发布的主要有
原始Shadowsocks(以Python语言编写)
Shadowsocks-libev
openwrt-Shadowsocks
Shadowsocks-rust
go-shadowsocks2
gost
libQtShadowsocks
Shadowsocks-qt5(客户端)
Shadowsocks-android(客户端)
Shadowsocks-windows(客户端)
ShadowsocksX-NG (客户端)
ShadowsocksR
Outline
V2Ray
Brook
Trojan
Clash
等等,还有为数甚多的免费软件及商业软件。
ShadowsocksR
ShadowsocksR的标志
Android版本ShadowsocksR应用程序
ShadowsocksR(简称SSR)是网名为breakwa11的用户发起的Shadowsocks分支,在Shadowsocks的基础上增加了一些资料混淆方式,称修复了部分安全问题并可以提高QoS优先级。后来贡献者Librehat也为Shadowsocks补上了一些此类特性,甚至增加了类似Tor的可插拔传输层功能。
ShadowsocksR开始时曾有过违反GPL、发放二进制时不发放源码的争议,使得原开发作者不满。不过后来ShadowsocksR项目由breakwa11转为了与Shadowsocks相同的GPL、Apache许可证、MIT许可证等多重自由软件许可协议。
2017年7月19日,ShadowsocksR作者breakwa11在Telegram频道ShadowsocksR news里转发了深圳市启用SS协议检测的消息并被大量用户转发,引发恐慌。7月24日,breakwa11发布了闭源的SS被动检测程序,引发争议。7月27日,breakwa11遭到自称“ESU.TV”(恶俗TV)的不明身份人士人身攻击,对方宣称如果不停止开发并阻止用户讨论此事件将发布更多包含个人隐私的资料,随后breakwa11表示遭到对方人肉搜索并公开个人资料的是无关人士,为了防止对方继续伤害无关人士,breakwa11将删除GitHub上的所有代码、解散相关交流群组,停止ShadowsocksR项目。但项目已被多人fork,并有人在其基础上继续发布新的版本,例如较为知名的SSRR(ShadowsocksRR)。
参考资料
clowwindy. 发一个自用了一年多的翻墙工具 shadowsocks. 2012-04-20. (原始内容存档于2014-07-19).
Release 1.9.4. 2019年11月13日 [2020年12月3日].
Release 3.3.5.
Bug fix.
Release 5.2.6.
Release 4.4.1.0.
Release v1.15.3.
开源翻墙软件Shadowsocks作者宣布停止项目更新. 2015-08-20 [2016-02-03]. (原始内容存档于2016-02-03).
O'Brien, Danny. Speech that Enables Speech: China Takes Aim at Its Coders. 电子前哨基金会. [2016-05-28]. (原始内容存档于2016-06-24) (英语).(中文翻译)
clowwindy. Adopting iOS 9 network extension points · Issue #124 · shadowsocks/shadowsocks-iOS. GitHub. [2015-08-22]. (原始内容存档于2015-08-22) (英语). Two days ago the police came to me and wanted me to stop working on this. Today they asked me to delete all the code from GitHub. I have no choice but to obey.
clowwindy. remove · shadowsocks/shadowsocks@938bba3. GitHub. 2015-08-22 [2015-08-22]. (原始内容存档于2015-08-22).
clowwindy. shadowsocks/shadowsocks. GitHub. 2015-08-22 [2015-08-22]. (原始内容存档于2015-08-22) (英语).
percy. 中国开发者被警察要求删除软件. GreatFire. 2015-08-26 [2016-01-16]. (原始内容存档于2015-10-02) (中文).
Vergil. 翻墙=犯法?从许东翻墙第一案说起. pao-pao.net. [2016-08-18]. (原始内容存档于2016-08-08).(中文)
Catalin Cimpanu. Recent GitHub DDOS Linked to Chinese Government and Two GitHub Projects. Softpedia. 2015-08-29 [2016-01-16]. (原始内容存档于2016-05-06) (英语).
Shadowsocks - spec. [2015年12月11日]. (原始内容存档于2015年12月4日) (英语).
Shadowsocks - Clients. [2015-09-05]. (原始内容存档于2015-09-04) (英语).
Mygod. SIP004 - Support for AEADs implemented by large libraries. 2017-01-12 [2021-06-14]. (原始内容存档于2020-10-16).
riobard. SIP007 - Per-session subkey. 3017-02-10 [2021-06-14]. (原始内容存档于2020-10-16).
AEAD Ciphers. Shadowsocks.org. [2021-06-14]. (原始内容存档于2021-02-26).
Shadowsocks AEAD 加密方式设计存在严重漏洞,无法保证通信内容的可靠性. GitHub. [2021-02-28]. (原始内容存档于2021-07-18).
利用防重放机制自动对 Shadowsocks、VMess 等未知流量代理进行“隐蔽式拒绝服务攻击”. GitHub. [2021-03-01]. (原始内容存档于2021-07-18).
Deng, Z.; Liu, Z.; Chen, Z.; Guo, Y. The Random Forest Based Detection of Shadowsock's Traffic. 2017 9th International Conference on Intelligent Human-Machine Systems and Cybernetics (IHMSC). August 2017, 2: 75–78 [2018-02-05]. doi:10.1109/IHMSC.2017.132. (原始内容存档于2018-02-06).
VV, 特约撰稿人. 道高一尺,牆高一丈:互聯網封鎖是如何升級的. 端传媒. [2018-04-07]. (原始内容存档于2018-06-28) (中文(香港)).
madeye. SIP003 - A simplified plugin design for shadowsocks. GitHub. 2017-01-04 [2021-06-14]. (原始内容存档于2020-10-03).
Shadowsocks / GOST v2. [2022-12-02]. (原始内容存档于2022-12-02).
Outline - Making it safer to break the news. getoutline.org. [2018-04-06]. (原始内容存档于2018-03-30) (英语).
Shadowsocks · Project V 官方网站. v2ray.com. [2020-06-11]. (原始内容存档于2020-06-11).
txthinking/brook. GitHub. [2018-06-05]. (原始内容存档于2018-06-17) (英语).
trojan. trojan-gfw. trojan. [2021-02-15]. (原始内容存档于2021-05-30).
Fndroid, Clash for Windows, 2022-11-17 [2022-11-17], (原始内容存档于2023-01-14)
ShadowsocksR. breakwa11.github.io. [2017-03-24]. (原始内容存档于2017-02-07).
Shadowsocks Plugin Spec. shadowsocks.org. [2017-03-24]. (原始内容存档于2017-03-25) (英语).
breakwa11. SS被动检测1.0版 #868. GitHub. [2017-06-24]. (原始内容存档于2017-07-25).
CK、吴晶、瑞哲. 国内网络青年开发翻墙软件遭“人肉”威胁. Radio Free Asia. 2018-01-25 [2019-03-31]. (原始内容存档于2019-03-31).
Shadowsocks
加密传输协议
Socks5
参考
你可能想看的
大模型是如何工作的至今仍然是个迷
大模型AI
如何创建阿里云账号(主账号)的AccessKey
阿里云
阿里云oss上传文件报错:You have no right to access this object because of bucket acl
阿里云OSSPython
报错No module named _crcfunext
Python
绮梦 - 专注分享次元世界
二次元
日本动漫《物理魔法使马修》第一季全12集迅雷下载
动画片日漫
猫耳FM_来自二次元的声音_( :3」∠)_M站
动漫二次元
搜索关键词工具里出现的展现量、点击量、点击率、排名都是什么?
SEO
aurora = auroraの失落之境 = 吾は悪事も一言、善事も一言、言い离つ神。
博客
青泥学术-大数据学术写作辅助系统
AI学术写作
Shadowsocks
加密传输协议
Socks5
大模型
AI
密码生成器Copyright©2023
斑点象
bandianxiang.com
陕ICP备2020012906号-3
Shadowsocks | Project X
Shadowsocks | Project X
Project X 首页 大史记 配置指南 开发指南 使用指南 多语言多语言 简体中文 English (WIP) 查看源码 open in new tag 首页 大史记 配置指南 开发指南 使用指南 多语言多语言 简体中文 English (WIP) 查看源码 open in new tag特性详解 XTLS 深度剖析 Fallback 回落 Browser Dialer 环境变量 多文件配置 基础配置 配置文件 日志配置 API 接口 内置 DNS 服务器 FakeDNS 入站代理 出站代理 本地策略 反向代理 路由 统计信息 传输方式 metrics 入站代理 Dokodemo-Door HTTP Shadowsocks Socks Trojan VLESS VMess 出站代理 Blackhole DNS Freedom HTTP Loopback Shadowsocks OutboundConfigurationObject ServerObject Socks Trojan VLESS VMess Wireguard 底层传输 Domain Socket gRPC HTTP/2 mKCP QUIC TCP WebSocket ShadowsocksShadowsocksopen in new tag 协议,兼容大部分其它版本的实现。目前兼容性如下:支持 TCP 和 UDP 数据包转发,其中 UDP 可选择性关闭;推荐的加密方式: 2022-blake3-aes-128-gcm2022-blake3-aes-256-gcm2022-blake3-chacha20-poly1305其他加密方式 aes-256-gcmaes-128-gcmchacha20-poly1305 或称 chacha20-ietf-poly1305xchacha20-poly1305 或称 xchacha20-ietf-poly1305none 或 plainShadowsocks 2022 新协议格式提升了性能并带有完整的重放保护,解决了旧协议的以下安全问题:Shadowsocks AEAD 加密方式设计存在严重漏洞,无法保证通信内容的可靠性open in new tag原有 TCP 重放过滤器误报率随时间增加没有 UDP 重放保护可用于主动探测的 TCP 行为警告"none" 不加密方式下流量将明文传输。为确保安全性, 不要在公共网络上使用。OutboundConfigurationObject{
"servers": [
{
"email": "love@xray.com",
"address": "127.0.0.1",
"port": 1234,
"method": "加密方式",
"password": "密码",
"uot": true,
"UoTVersion": 2,
"level": 0
}
]
}
servers: [ServerObject]一个数组,代表一组 Shadowsocks 服务端设置, 其中每一项是一个 ServerObject。ServerObject{
"email": "love@xray.com",
"address": "127.0.0.1",
"port": 1234,
"method": "加密方式",
"password": "密码",
"uot": true,
"UoTVersion": 2,
"level": 0
}
email: string邮件地址,可选,用于标识用户address: addressShadowsocks 服务端地址,支持 IPv4、IPv6 和域名。必填。port: numberShadowsocks 服务端端口。必填。method: string必填。password: string必填。uot: bool启用udp over tcp。UoTVersion: numberUDP over TCP 的实现版本。当前可选值:1, 2Shadowsocks 2022使用与 WireGuard 类似的预共享密钥作为密码。使用 openssl rand -base64 <长度> 以生成与 shadowsocks-rust 兼容的密钥,长度取决于所使用的加密方法。加密方法密钥长度2022-blake3-aes-128-gcm162022-blake3-aes-256-gcm322022-blake3-chacha20-poly130532在 Go 实现中,32 位密钥始终工作。其他加密方法任意字符串。不限制密码长度,但短密码会更可能被破解,建议使用 16 字符或更长的密码。level: number用户等级,连接会使用这个用户等级对应的 本地策略。level 的值, 对应 policy 中 level 的值。 如不指定, 默认为 0。 帮助我们改善此页面! open in new tag最近更改: Contributors: JimhHan, HystericalDragon, tdjnodj, yuhan6665, 世界 Loopback Socks
Shadowsocks是如何被检测和封锁的
Shadowsocks是如何被检测和封锁的
Great Firewall Report
Home
(current)
Publications
IMC20
FOCI20
USENIX Security 23
Projects
Shadowsocks是如何被检测和封锁的
作者: Alice, Bob, Carol, Jan Beznazwy, Amir Houmansadr
演讲者: David Fifield
这场演讲介绍了我们的IMC'20论文: Shadowsocks是如何被检测和封锁的。
视频及字幕
幻灯片 (ODP 格式)
幻灯片 (PDF 格式)
幻灯片 (源代码)
English subtitle and transcript
最后修改日期: 2020年10月27日,星期二
这场演讲介绍了我们的IMC'20论文: Shadowsocks是如何被检测和封锁的。
你可以点击视频下方的cc按钮来选择中文或英文字幕。
Video
这是关于"中国是如何检测和封锁Shadowsocks的"的论文介绍,
该论文出自GFW Report,Jan Beznazwy和Amir Houmansadr。
我是David Fifield。我今天代替作者做论文介绍,
因为他们中大多数都是匿名的。
我有在这个领域的研究经验,
而且在作者的帮助下,
我已经完全熟悉了他们的这项工作。
对这项工作总结成一句话就是:
中国的防火长城已经采用
被动流量分析与主动探测相结合的手段
来检测和封锁Shadowsocks。
现在让我们来讲一下这些词是什么意思。
Shadowsocks是一个加密代理协议,
其设计旨在让协议难以被审查者识别。
这个审查绕过(翻墙)协议在中国非常流行。
而且作为信息管控任务的一部分,
防火长城努力找出并封锁各种类型的代理服务器,
其中包括Shadowsocks。
而事实上,从2019年5月起,
已经有许多来自中国的用户汇报
他们的Shadowsocks服务器被墙。
这些封锁有时发生在政治敏感时期。
但当时对封锁原理都缺乏解释。
这项研究揭示了封锁原理。
首先,在Shadowsocks中,
客户端与服务端之间的连接是加密的。
而且这种加密后,
观察者看到的全部都是密文。
这一点与TLS不同。
TLS的报头中含有明文。
而Shadowsocks流量则全部是密文。
如果你观察就会发现Shadowsocks的流量
就好像一列列均匀随机的字节。
而其就是这么设计的。
这样的设计意味着,你不能仅仅用一个
简单的正则表达来匹配出所有的Shadowsocks流量。
你得更努力一些才行。
现在如果你想流量这样的随机,这样的缺乏特征,
是不是本身就是一种特征呢?
那你想的绝对正确。
事实上,这项研究揭示了防火长城
使用在TCP流中数据包的长度和熵作为
其识别Shadowsocks流量的第一步。
现在我来解释下刚刚提到的
主动探测是啥意思。
这项研究揭示了:
防火长城识别Shadowsocks流量的过程分两步:
第一步被动,第二步主动。
第一步,防火长城流量分析出
其怀疑是Shadowsocks的连接。
而在第二步中,
防火长城会假装成Shadowsocks客户端,
从自己的IP地址主动去连接它怀疑的服务器。
然后观察被探测的服务器会怎样回应。
你可以把第一步的目的想成“怀疑”,
而第二步的目的则为“确认”。
现在你就能理解了:
主动探测是为了在识别中增加准确率,降低成本。
如果你仅仅用流量分析被动地识别Shadowsocks流量,
那么假阳性可能会高得不可接受。
而另一方面,如果你对每一个经过防火长城的连接,
都进行主动探测的话,
那你又会因为需要发送的
主动探测太多而管不过来。
因此你可以把步骤一想成是对步骤二的预先过滤。
这当然不是第一个记录中国采用
主动探测来识别翻墙协议的研究。
早在2011年,就有研究显示中国以主动探测
的方式来识别Tor和其他VPN协议。
但防火长城用来识别Shadowsocks的技术
可谓又达到了新的高度。
我们又是怎么知道这些的呢?
你可能已经猜到了文章作者的调查方法。
她们在中国境外搭建了自己的Shadowsocks服务器;
然后又从中国用自己的客户端去
穿过防火长城,连接到搭建好的服务器。
然后再观察还有什么连接
到了她们的服务器上。
她们还搭建了对照服务器,
她们自己的客户端从未连接到上面,
对照服务器只是用来区分主动探测
和一般的互联网扫描。
她们的实验大概持续了4个月。
目前已经有许多许多的Shadowsocks实现了。
而在这项实验中,
作者选用了其中最受欢迎的两个实现:
分别叫做Shadowsocks-libev和Outline。
它们是对同一个协议的两个相互独立的实现。
在为期4个月的实验中得到的一个主要观察是
防火长城会使用各种各不同类型的主动探测:
一部分主动探测是对合法连接的重放,
另一部分则不是。
合法连接可能被储存起来,
然后经过长得惊人的时间才被重放。
另一部分非重放探测的数据包,
有着奇特的长度分布。
主动探测看上去来自上千个不同的源IP地址。
现在我们来谈谈基于重放的主动探测。
首先这些重放基于合法客户端发出的连接。
具体来讲,它们是基于
合法客户端发出的第一个数据包。
有的重放和原连接一模一样,
而有的重放则是在特定位置上
改变了1个,2个或者更多的字节。
那么审查者发送这些重放探测的目的是什么呢?
原来,审查者是想利用存在于Shadowsocks协议中的某些弱点。
你看,协议并没有规定当一个服务器遇到
重放攻击时应该如何响应。
如果一个实现对重放攻击不做任何的过滤,
那么它就会向代理之前合法客户端发出
的请求一样,去代理重放攻击的请求,
进而将密文的代理流量发送回主动探测者。
虽然审查者因为不知道密码
而无法解密代理流量,
但是服务器向审查者返回了一串密文
这件事本身就足以暴露其为Shadowsocks。
即使是使用了重放过滤的Shadowsocks实现,
仍可能在其服务器关闭连接时的
一些边界情况上暴露信息。
审查者会改变原始连接中一些特定位置上的
字节后再重放,可能是为了绕过重放过滤器。
因为很容易找到重放攻击所基于的原始连接,
所以我们可以测量从合法连接被发送到
其重放攻击被发送的延迟。
请看这幅累积分布函数(CDF)图。
因为同一个合法连接可能被重放多次,
因此暗色线仅表示合法连接第一次被重放的延迟;
而浅色线则表示所有重放的延迟。
如你所见,25%的第一次重放发生在1秒内,
相当于是紧随合法连接之后。
但这幅图还有一个长的惊人的尾巴:
一些重放的延迟是以分钟,小时,甚至是天来计数的。
现在我们来看非重放的主动探测,
这些探测的数据看上去完全随机,
但又并非基于之前的任何合法连接。
你可能发现了这个包长度分布很奇怪。
你看这些长度小于50字节的包,
它们如“三重奏”一般地分布在
8, 12, 16, 22, 33, 41,和49字节。
比如说基于8字节“三重奏”,
包括了数量大致相同的长度为7,8,9字节的探测包。
除此之外,请注意不同类型的非重放探测的比例:
绝大多数的非重放探测的
长度为整整221字节。
这是一个有趣而又发人思考的包长度分布。
论文作者觉得她们至少可以部分地解释
为什么审查者会发送这些长度的探测数据包。
你看,当你向Shadowsock服务器
发送未经认证的随机数据时,
不同的数据长度会引起服务器不同的反应。
如果你发送了过少的数据,
服务器会期待你发送更多的数据,
因此服务器最终会超时。
但当你发送的数据长度超过这一阀值时,
服务器会尝试验证它受到的数据,
而之后又因验证失败而关闭连接。
我不会介绍过多的细节,
但你要知道Shadowsocks
可以配置使用不同的加密方式
而不同加密方式的初始向量长度会不同。
你可以看到,很多的“三重奏”,
长度都是骑跨在服务器不同反应的临界值上的。
服务器的反应包括超时和发送RST关闭连接等。
如第一行所示,如果你向服务器发送了
7或者8字节的数据后,服务器将超时。
但如果你发送了9字节,
那么服务器就会立即发送RST来关闭连接。
因此这个服务器反应可以被识别。
但这个分析并不能完全地
解释“三重奏”的分布。
因为,比如说,长度为32,33,34,
或者长度为40,41,42字节的“三重奏”,
就不位于任何临界值附近。
另外221字节的探测长度也不在临界值上。
现在来讲主动探测的源头。
在为期4个月的实验中,
作者的Shadowsocks服务器收到了
超过50,000次主动探测,
它们来自超过12,000个不同的IP地址。
所有这些IP地址都是中国的。
由上述观察可知,仅仅简单的枚举并屏蔽
所有主动探测的IP地址并不容易。
但这也不是什么令人惊讶的结论,
因为之前的研究工作就早已发现了
审查者会用大量不同的
IP地址来主动探测。
现在我们把这12,000多个在这次研究中
发现的IP地址与之前工作中发现的做对比。
它们之前的重合并不多,
但这也不是很令人惊奇的,
因为之前的研究早已发现
这些主动探测所用的IP地址随时间会发生大量的变化。
虽然这些主动探测看似来自
成千上万的不同IP地址,
但它们很可能是被一小撮进程集中控制的。
证据来自TCP层的旁道信息泄露:
TCP时间戳。
TCP时间戳是一个32位的计数器,
其以固定的速率随时间增长。
其被附在每一个(非RST的)TCP包上面。
不同的计算机通常不会有
相同的TCP时间戳序列。
因为这个序列会在系统重启时,
被归零或初始化为一个随机值
这张图显示了来自上千个不同IP地址的
数据包的TCP时间戳随时间的变化,
你可以看到,虽然它们来自不同的IP地址,
但它们都可以被归为很少的几个TCP时间序列。
这些序列的增长速率为250 HZ或1,000 HZ。
那条1,000HZ的线由20个
相距很近的数据点拟合而成。
但可以确定它们的变化率
更接近1000HZ而非250HZ。
TCP时间戳的观察与之前研究中的发现一致。
其他许多不同网络层的指纹
也与之前研究的发现很像。
但TCP源端口号则是一个例外。
先前的工作发现主动探测的TCP源端口号
近乎是均匀随机分布(于1-65535)的。
但在这项研究中,
TCP源端口号有很大一部分与
Linux的临时端口相吻合。
现在可以确定防火长城会主动探测
Shadowsocks服务器。
但防火长城是如何怀疑上
Shadowsocks服务器的呢?
以下两个事实辅助了作者的调查:
重放攻击通常紧随合法连接之后;
重放攻击仅仅基于第一个携带数据的包。
作者因此设计实验,
在建立TCP连接后仅发送一个数据包。
发送的数据包的长度和熵由作者设置。
虽然我们没有在图中看到尖锐的拐点,
但高熵的数据包比低熵的
数据包更有可能被重放。
作者还确定防火长城也会根据
包的长度来怀疑Shadowsocks流量。
请看这幅累积分布函数(CDF)图。
灰线代表作者自己的连接。
她们发送了长度从1到1,000字节
均匀随机分布的数据包。
现在你看,非重放的探测包
的长度集中在221字节。
而绝大部分重放探测包
的长度则在160到700字节之间。
这个区间长度之外的连接极少被重放。
而即使是在这个区间之内,
一些长度的连接也更有可能被重放。
你会发现代表重放探测的这条线呈阶梯状。
事实上,详细结构如下:
对于长度为160到384字节的包,
如果其长度对16取模后为9,
则其更有可能被重放。
对于长度为246到700字节的包,
如果其长度对16取模后为2,
则其更有可能被重放。
这长度在两个区间的重叠区域的包,
其长度对16取模后的结果则以2和9为主。
作者对这一现象没有好的解释,
她们只是发现了这个让人着迷的包长度分布。
那么我们又能怎么缓解
对Shadowsocks的主动探测呢?
我们已经知道了探测分两步,
那么阻挡其中任何一步就足以挫败探测。
你既可以选择绕过被动地流量分析,
也可以选择绕过主动探测模块。
绕过流量分析就是说去改变会被
防火长城用来分析的特征:
也就是包的熵和长度。
改变包的熵并不容易,
因为这需要根本性地改变协议本身。
而你有更多地余地来改变包的长度。
比如说新版本的Outline会
合并两个连续的包:
这样一来其包的长度分布就可能
不同于防火长城期待的流量特征。
另一个有意思的发现是基于一个叫
Brdgrd(Bridge Guard)的工具.
这是一个你可以安装在
Shadowsocks服务器上的工具。
它可以让客户端发送的每个包的长度变小,
这是通过在每次连接的初始阶段,
改变服务器TCP窗口大小来实现的。
Brdgrd配合Shadowsocks使用
有着种种的缺点和注意事项,
但可以看到在这项实验中,
当Brdgrd被开启时,
主动探测被有效地缓解了,
尽管不是完完全全地阻止了。
你还可以改变服务器对探测的
回应方式,从而避免被识别。
刚刚我给你展示过这个表格,
但我其实撒了一点点谎:
这个表格展示的其实是旧版本的Shadowsocks。
部分因为这项研究的成果,
一些新的Shadowsocks版本,
试图消除超时和关闭连接这样的不一致反应。
新版本的Shadowsocks的反应
更像是这幅图所示的那样。
我不会介绍太多关于AEAD
在新的Shadowsocks协议中的细节,
但你可以看到当在新版Shadowsocks
中使用了推荐的AEAD后,
由于缺乏验证,在使用流加密协议时,
服务器的反应无法做到完全一致地超时。
但开发者已经尽力保持反应一致,
来消除其特征。
总而言之,中国的防火长城已经开始
使用被动的流量分析和主动探测来识别Sadowsocks
主动探测可被连接中的第一个带有数据的包触发。
而且拥有特定长度的包,
和高熵的包更容易触发重放。
与许多种不同的主动探测:
一些是重放攻击,另一些则不是。
主动探测来自许多不同的IP地址,
但有被集中控制的迹象。
可以通过阻断防火长城对Shadowsocks
识别过程中两步的任一一步,
来阻止Shadowsocks被识别。
感谢您的收看。如果您有任何的疑问或评论,
尽情直接与作者们联系。
研究中的源代码和数据在下方链接中。
评论区
您可以开启 JavaScript 以浏览我们尊重隐私的评论区。
订阅我们
邮件订阅
RSS订阅
联系我们
[email protected]
B0C6 EB19 DA7C EAA3
@gfw_report
@gfw-report
1 分钟快速搭建 Shadowsocks - vultr
1 分钟快速搭建 Shadowsocks - vultr
vultrVultr 官网点此注册获取100美金余额Vultr 简易教程Search⌃KLinksVultr 搭建 VPN 系列教程Vultr教程Vultr和搬瓦工到底怎么选Vultr整体介绍、方案选择[手把手] Vultr 图文购买教程专属优惠码通过SSH管理服务器1 分钟快速搭建 Shadowsocks3分钟快速安装宝塔面板5分钟快速搭建WordPress博客安装TCP BBR加速教程常见问题关于本站Powered By GitBook1 分钟快速搭建 Shadowsocks快速搭建 SS 服务前提你已经根据 通过SSH管理服务器 的步骤连接上服务器搭建服务 三步走1 . 安装 在CentOS中运行下面两条命令就完成了shadowsocks的安装了:yum install python-setuptools && easy_install pippip install shadowsocks2 . 配置 完成之后创建一个配置文件 /etc/shadowsocks.json,写入以下内容:{ "server":"0.0.0.0", #服务器IP地址 "server_port":8388, #服务监听端口 "local_port":1080, #本地连接端口 "password":"barfoo", #加密传输使用到的密码 "timeout":600, #连接超时时间 "method":"aes-256-cfb" #加密算法}3 . 启动、停止 运行下面的命令来启动和停止后台服务:ssserver -c /etc/shadowsocks.json -d startssserver -c /etc/shadowsocks.json -d stop然后你就可以使用上面的配置连接shadowsocks了。1.客户端如何用?各个平台使用的客户端都有差异,但是用到的信息就这些: - 服务器IP: 不是上面的0.0.0.0,是你申请的VPS,会提供一个ip。打开网站,登录,找到它 - 端口(port): 8388 - 协议类型: aes-256-cfb 一般默认就这个,不用换。但还是要看一眼。 - 密码(password): barfoo 连接,欢呼。Previous通过SSH管理服务器Next3分钟快速安装宝塔面板Last modified 5yr ago
科学上网:用 VPS 搭建 shadowsocks 服务器 - Shawntan's Blog
科学上网:用 VPS 搭建 shadowsocks 服务器 - Shawntan's Blog
yload":{"allShortcutsEnabled":false,"fileTree":{"":{"items":[{"name":".github","path":".github","contentType":"directory"},{"name":"doc","path":"doc","contentType":"directory"},{"name":"img","path":"img","contentType":"directory"},{"name":"update","path":"update","contentType":"directory"},{"name":".gitignore","path":".gitignore","contentType":"file"},{"name":"auth_aes128.md","path":"auth_aes128.md","contentType":"file"},{"name":"readme.md","path":"readme.md","contentType":"file"},{"name":"shadowsocks-win.xml","path":"shadowsocks-win.xml","contentType":"file"},{"name":"shadowsocksr-win.xml","path":"shadowsocksr-win.xml","contentType":"file"},{"name":"ssr.md","path":"ssr.md","contentType":"file"}],"totalCount":10}},"fileTreeProcessingTime":1.828206,"foldersToFetch":[],"repo":{"id":98540751,"defaultBranch":"master","name":"shadowsocks-rss","ownerLogin":"shadowsocksrr","currentUserCanPush":false,"isFork":true,"isEmpty":false,"createdAt":"2017-07-27T13:43:52.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/30500389?v=4","public":true,"private":false,"isOrgOwned":true},"symbolsExpanded":false,"treeExpanded":true,"refInfo":{"name":"master","listCacheKey":"v0:1504436586.0","canEdit":false,"refType":"branch","currentOid":"b2d836c7019a149f7f45bd1ca21627d095855b18"},"path":"ssr.md","currentUser":null,"blob":{"rawLines":null,"stylingDirectives":null,"csv":null,"csvError":null,"dependabotInfo":{"showConfigurationBanner":false,"configFilePath":null,"networkDependabotPath":"/shadowsocksrr/shadowsocks-rss/network/updates","dismissConfigurationNoticePath":"/settings/dismiss-notice/dependabot_configuration_notice","configurationNoticeDismissed":null},"displayName":"ssr.md","displayUrl":"https://github.com/shadowsocksrr/shadowsocks-rss/blob/master/ssr.md?raw=true","headerInfo":{"blobSize":"24.2 KB","deleteTooltip":"You must be signed in to make or propose changes","editTooltip":"You must be signed in to make or propose changes","ghDesktopPath":"https://desktop.github.com","isGitLfs":false,"onBranch":true,"shortPath":"ab8a18a","siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2Fshadowsocksrr%2Fshadowsocks-rss%2Fblob%2Fmaster%2Fssr.md","isCSV":false,"isRichtext":true,"toc":[{"level":1,"text":"ShadowsocksR 协议插件文档","anchor":"shadowsocksr-协议插件文档","htmlText":"ShadowsocksR 协议插件文档"},{"level":2,"text":"概要","anchor":"概要","htmlText":"概要"},{"level":2,"text":"现有插件介绍","anchor":"现有插件介绍","htmlText":"现有插件介绍"},{"level":4,"text":"1.混淆插件","anchor":"1混淆插件","htmlText":"1.混淆插件"},{"level":4,"text":"2.协议定义插件","anchor":"2协议定义插件","htmlText":"2.协议定义插件"},{"level":2,"text":"混淆特性","anchor":"混淆特性","htmlText":"混淆特性"},{"level":2,"text":"协议特性","anchor":"协议特性","htmlText":"协议特性"},{"level":2,"text":"混淆与协议配置建议","anchor":"混淆与协议配置建议","htmlText":"混淆与协议配置建议"},{"level":2,"text":"配置方法","anchor":"配置方法","htmlText":"配置方法"},{"level":4,"text":"兼容性","anchor":"兼容性","htmlText":"兼容性"},{"level":2,"text":"实现接口","anchor":"实现接口","htmlText":"实现接口"},{"level":3,"text":"插件编写","anchor":"插件编写","htmlText":"插件编写"}],"lineInfo":{"truncatedLoc":"266","truncatedSloc":"200"},"mode":"file"},"image":false,"isCodeownersFile":null,"isPlain":false,"isValidLegacyIssueTemplate":false,"issueTemplate":null,"discussionTemplate":null,"language":"Markdown","languageID":222,"large":false,"planSupportInfo":{"repoIsFork":null,"repoOwnedByCurrentUser":null,"requestFullPath":"/shadowsocksrr/shadowsocks-rss/blob/master/ssr.md","showFreeOrgGatedFeatureMessage":null,"showPlanSupportBanner":null,"upgradeDataAttributes":null,"upgradePath":null},"publishBannersInfo":{"dismissActionNoticePath":"/settings/dismiss-notice/publish_action_from_dockerfile","releasePath":"/shadowsocksrr/shadowsocks-rss/releases/new?marketplace=true","showPublishActionBanner":false},"rawBlobUrl":"https://github.com/shadowsocksrr/shadowsocks-rss/raw/master/ssr.md","renderImageOrRaw":false,"richText":"ShadowsocksR 协议插件文档\n\n概要\n用于方便地产生各种协议接口。实现为在原来的协议外套一层编码和解码接口,不但可以伪装成其它协议流量,还可以把原协议转换为其它协议进行兼容或完善(但目前接口功能还没有写完,目前还在测试完善中),需要服务端与客户端配置相同的协议插件。插件共分为两类,包括混淆插件和协议定义插件。\n现有插件介绍\n1.混淆插件\n此类型的插件用于定义加密后的通信协议,通常用于协议伪装,部分插件能兼容原协议。\nplain:表示不混淆,直接使用协议加密后的结果发送数据包\nhttp_simple:并非完全按照http1.1标准实现,仅仅做了一个头部的GET请求和一个简单的回应,之后依然为原协议流。使用这个混淆后,已在部分地区观察到似乎欺骗了QoS的结果。对于这种混淆,它并非为了减少特征,相反的是提供一种强特征,试图欺骗GFW的协议检测。要注意的是应用范围变大以后因特征明显有可能会被封锁。此插件可以兼容原协议(需要在服务端配置为http_simple_compatible),延迟与原协议几乎无异(在存在QoS的地区甚至可能更快),除了头部数据包外没有冗余数据包,客户端支持自定义参数,参数为http请求的host,例如设置为cloudfront.com伪装为云服务器请求,可以使用逗号分割多个host如a.com,b.net,c.org,这时会随机使用。注意,错误设置此参数可能导致连接被断开甚至IP被封锁,如不清楚如何设置那么请留空。服务端也支持自定义参数,意义为客户端仅能填写的参数列表,以逗号分割。\n本插件的高级设置(C#版、python版及ssr-libev版均支持):本插件可以自定义几乎完整的http header,其中前两行的GET和host不能修改,可自定义从第三行开始的内容。例子:\nbaidu.com#User-Agent: abc\\nAccept: text/html\\nConnection: keep-alive\n这是填于混淆参数的内容,在#号前面的是上文所说的host,后面即为自定义header,所有的换行使用\\n表示(写于配置文件时也可直接使用\\n而不必写成\\n,换行符亦会转换),如遇到需要使用单独的\\号,可写为\\\\,最末尾不需要写\\n,程序会自动加入连续的两个换行。\nhttp_post:与http_simple绝大部分相同,区别是使用POST方式发送数据,符合http规范,欺骗性更好,但只有POST请求这种行为容易被统计分析出异常。此插件可以兼容http_simple,同时也可兼容原协议(需要在服务端配置为http_post_compatible),参数设置等内容参见http_simple,密切注意如果使用自定义http header,请务必填写boundary。\nrandom_head(不建议使用):开始通讯前发送一个几乎为随机的数据包(目前末尾4字节为CRC32,会成为特征,以后会有改进版本),之后为原协议流。目标是让首个数据包根本不存在任何有效信息,让统计学习机制见鬼去吧。此插件可以兼容原协议(需要在服务端配置为random_head_compatible),比原协议多一次握手导致连接时间会长一些,除了握手过程之后没有冗余数据包,不支持自定义参数。\ntls1.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。服务端暂不支持自定义参数。\n2.协议定义插件\n此类型的插件用于定义加密前的协议,通常用于长度混淆及增强安全性和隐蔽性,部分插件能兼容原协议。\norigin:表示使用原始SS协议,此配置速度最快效率最高,适用于限制少或审查宽松的环境。否则不建议使用。\nverify_deflate(不建议):对每一个包都进行deflate压缩,数据格式为:包长度(2字节)|压缩数据流|原数据流Adler-32,此格式省略了0x78,0x9C两字节的头部。另外,对于已经压缩过或加密过的数据将难以压缩(可能增加1~20字节),而对于未加密的html文本会有不错的压缩效果。因为压缩及解压缩较占CPU,不建议较多用户同时使用此混淆插件。此插件不能兼容原协议,千万不要添加_compatible的后缀。\nverify_sha1(即原版OTA协议,已废弃):对每一个包都进行SHA-1校验,具体协议描述参阅One Time Auth,握手数据包增加10字节,其它数据包增加12字节。此插件能兼容原协议(需要在服务端配置为verify_sha1_compatible)。\nauth_sha1(已废弃):对首个包进行SHA-1校验,同时会发送由客户端生成的随机客户端id(4byte)、连接id(4byte)、unix时间戳(4byte),之后的通讯使用Adler-32作为效验码。此插件提供了能抵抗一般的重放攻击的认证,默认同一端口最多支持64个客户端同时使用,可通过修改此值限制客户端数量,使用此插件的服务器与客户机的UTC时间差不能超过1小时,通常只需要客户机校对本地时间并正确设置时区就可以了。此插件与原协议握手延迟相同,能兼容原协议(需要在服务端配置为auth_sha1_compatible),支持服务端自定义参数,参数为10进制整数,表示最大客户端同时使用数。\nauth_sha1_v2(已废弃):与auth_sha1相似,去除时间验证,以避免部分设备由于时间导致无法连接的问题,增长客户端ID为8字节,使用较大的长度混淆。能兼容原协议(需要在服务端配置为auth_sha1_v2_compatible),支持服务端自定义参数,参数为10进制整数,表示最大客户端同时使用数。\nauth_sha1_v4(不建议):与auth_sha1对首个包进行SHA-1校验,同时会发送由客户端生成的随机客户端id(4byte)、连接id(4byte)、unix时间戳(4byte),之后的通讯使用Adler-32作为效验码,对包长度单独校验,以抵抗抓包重放检测,使用较大的长度混淆,使用此插件的服务器与客户机的UTC时间差不能超过24小时,即只需要年份日期正确即可。能兼容原协议(需要在服务端配置为auth_sha1_v4_compatible),支持服务端自定义参数,参数为10进制整数,表示最大客户端同时使用数。\nauth_aes128_md5或auth_aes128_sha1(均推荐):对首个包的认证部分进行使用Encrypt-then-MAC模式以真正免疫认证包的CCA攻击,预防各种探测和重防攻击,同时此协议支持单端口多用户,具体设置方法参见breakwa11的博客。使用此插件的服务器与客户机的UTC时间差不能超过24小时,即只需要年份日期正确即可,针对UDP部分也有做简单的校验。此插件不能兼容原协议,支持服务端自定义参数,参数为10进制整数,表示最大客户端同时使用数。\nauth_chain_a(推荐):对首个包的认证部分进行使用Encrypt-then-MAC模式以真正免疫认证包的CCA攻击,预防各种探测和重防攻击,数据流自带RC4加密,同时此协议支持单端口多用户,不同用户之间无法解密数据,每次加密密钥均不相同,具体设置方法参见breakwa11的博客。使用此插件的服务器与客户机的UTC时间差不能超过24小时,即只需要年份日期正确即可,针对UDP部分也有加密及长度混淆。使用此插件建议加密使用none。此插件不能兼容原协议,支持服务端自定义参数,参数为10进制整数,表示最大客户端同时使用数,最小值支持直接设置为1,此插件能实时响应实际的客户端数量(你的客户端至少有一个连接没有断开才能保证你占用了一个客户端数,否则设置为1时其它客户端一连接别的就一定连不上)。\nauth_chain_b(推荐):与auth_chain_a几乎一样,但TCP部分采用特定模式的数据包分布(模式由密码决定),使得看起来像一个实实在在的协议,使数据包分布分析和熵分析难以发挥作用。如果你感觉当前的模式可能被识别,那么你只要简单的更换密码就解决问题了。此协议为测试版本协议,不能兼容原协议。\nauth_chain_c(推荐):与auth_chain_b相比,尽力使得数据包长度分布归属到模式中,让包分布看起来更规整。但此版本与auth_chain_b相比对带宽有更多的浪费。\nauth_chain_d(推荐):与auth_chain_c相比,在一定程度上增加了各种密码生成的模式的最大适用长度,这样就不需要在极端情况下再临时生成随机数,降低大包传输时的计算量,提高下载极限速度。\n推荐使用auth_chain_*系列插件,在以上插件里混淆能力较高,而抗检测能力最高,即使多人使用也难以识别封锁。同时如果要发布公开代理,以上auth插件均可严格限制使用客户端数(要注意的是若为auth_sha1_v4_compatible,那么用户只要使用原协议就没有限制效果),而auth_chain_*协议的限制最为精确。\n混淆特性\n\n\n\nname\nRTT\nencode speed\nbandwidth\nanti replay attack\ncheat QoS\nanti analysis\n\n\n\n\nplain\n0\n100%\n100%\nNo\n0\n/\n\n\nhttp_simple\n0\n20%/100%\n20%/100%\nNo\n90\n70\n\n\nhttp_post\n0\n20%/100%\n20%/100%\nNo\n100\n70\n\n\nrandom_head (X)\n1\n100%\n85%/100%\nNo\n0\n10\n\n\ntls1.2_ticket_auth\n1\n98%\n75%/ 95%\nYes\n100\n90\n\n\n\n说明:\n\n20%/100%表示首包为20%,其余为100%速度(或带宽),其它的 RTT 大于0的混淆,前面的表示在浏览普通网页的情况下平均有效利用带宽的估计值,后一个表示去除握手响应以后的值,适用于大文件下载时。\nRTT 表示此混淆是否会产生附加的延迟,1个RTT表示通讯数据一次来回所需要的时间。\nRTT 不为0且没有 anti replay attack 能力的混淆,不论协议是什么,都存在被主动探测的风险,即不建议使用random_head。 RTT 为0的,只要协议不是 origin,就没有被主动探测的风险。当然由于原协议本身也存在被主动探测的风险,在目前没有观察到主动探测行为的情况下,暂时不需要太担心。\ncheat QoS 表示欺骗路由器 QoS 的能力,100表示能完美欺骗,0表示没有任何作用,50分左右表示较为严格的路由能识别出来。\nanti analysis 表示抗协议分析能力,plain 的时候依赖于协议,其它的基于网友反馈而给出的分值。值为100表示完美伪装。\n\n协议特性\n假设 method = \"aes-256-cfb\"\n以下所有协议与均 anti CPA\n\n\n\nname\nRTT\nencode speed\nbandwidth\nanti CCA\nanti replay attack\nanti MITM detect\nanti packet length analysis\n\n\n\n\norigin\n0\n100%\n99%\nNo\nNo\nNo\n0\n\n\nverify_deflate\n0\n30%\n97%~110%\nNo\nNo\nNo\n6\n\n\nverify_sha1 (X)\n0\n85%\n98%/99%\nNo\nNo\nNo\n0\n\n\nauth_sha1 (X)\n0\n95%\n97%\nNo\nYes\nNo\n4\n\n\nauth_sha1_v2 (X)\n0\n94%\n80%/97%\nNo\nYes\nNo\n10\n\n\nauth_sha1_v4\n0\n90%\n85%/98%\nNo\nYes\nNo\n10\n\n\nauth_aes128_md5\n0\n80%\n70%/98%\nYes\nYes\nYes\n10\n\n\nauth_aes128_sha1\n0\n70%\n70%/98%\nYes\nYes\nYes\n10\n\n\nauth_chain_a\n0\n70%\n75%/98%\nYes\nYes\nYes\n15\n\n\nauth_chain_b\n0\n68%\n70%/98%\nYes\nYes\nYes\n20\n\n\nauth_chain_c\n0\n69%\n70%/98%\nYes\nYes\nYes\n20\n\n\nauth_chain_d\n0\n70%\n70%/98%\nYes\nYes\nYes\n20\n\n\n\n说明:\n\n以上为浏览普通网页(非下载非看视频)的平均测试结果,浏览不同的网页会有不同的偏差\nencode speed仅用于提供相对速度的参考,不同环境下代码执行速度不同\nverify_deflate的bandwidth(有效带宽)上限110%仅为估值,若数据经过压缩或加密,那么压缩效果会很差\nverify_sha1的bandwidth意为上传平均有效带宽98%,下载99%\nauth_aes128_md5的bandwidth在浏览普通网页时较低(为了较强的长度混淆,但单个数据包尺寸会保持在 TCP MSS 以内,所以其实对网速影响很小),而看视频或下载时有效数据比率比auth_sha1要高,可达97%,所以不用担心下载时的速度。auth_chain_a及auth_aes128_md5类似\n如果同时使用了其它的混淆插件,会令bandwidth的值降低,具体由所使用的混淆插件及所浏览的网页共同决定\n对于抗包长度分析一列,满分为100,即0为完全无效果,5以下为效果轻微,具体分析方法可参阅方校长等人论文\n对于抗包时序分析一列,方校长的论文表示虽然可利用,但利用难度大(也即他们还没能达到实用级),目前对此也不做处理\n\n混淆与协议配置建议\n\n协议推荐:协议用auth_chain_*最佳,此时推荐不使用加密(设置为none),混淆随意\n加密选择:若协议用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。\n混淆推荐:如果QoS在你的地区明显,混淆建议在http_simple与tls1.2_ticket_auth中选择,具体选择可以通过自己的试验得出。如果选择混淆后反而变慢,那么混淆请选择plain。如果你不在乎QoS,但担心你的个人vps能不能持久使用,那么混淆选择plain或tls1.2_ticket_auth,协议选择auth_chain_*或auth_aes128_*\n如果你用于玩游戏,或对连接延迟有要求的情况下,建议不要使用tls1.2_ticket_auth混淆,用其它混淆或plain\n服务端里,http_simple与http_post是相互兼容的,没有使用上的区别\n如果你在公司,或学校,或某些环境下,发现原版SS协议不可用,建议你启用http_simple、http_post或tls1.2_ticket_auth混淆,同时端口相应使用80或443,通常能解决问题。同时能躲避你所在环境下的网络封锁(如禁止访问网盘禁止上传等等)\n如果使用tls1.2_ticket_auth混淆或不开启混淆,那么协议最好不要使用origin或verify_sha1\n如果使用二重代理,一般你只需要考虑越过防火墙的那一段使用混淆或加强协议,除非为了匿名\n如果你发现你的代理突然不能用了,但换一个端口又能用了,或者等15分钟到半小时后又能用了,这种情况下请联系我\n\n配置方法\n服务端配置:使用最新SSR的manyuser分支\nuser-config.json或config.json里有一个protocol的字段,目前的可能取值为:\norigin\nverify_deflate (不建议)\nverify_sha1 (已过时)\nverify_sha1_compatible (已过时)\nauth_sha1 (已过时)\nauth_sha1_compatible (已过时)\nauth_sha1_v2 (已过时)\nauth_sha1_v2_compatible (已过时)\nauth_sha1_v4 (不建议)\nauth_sha1_v4_compatible (不建议)\nauth_aes128_md5\nauth_aes128_sha1\nauth_chain_a\nauth_chain_b\nuser-config.json或config.json里有一个obfs的字段,目前的可能取值为:\nplain\nhttp_simple\nhttp_simple_compatible\nhttp_post\nhttp_post_compatible\nrandom_head (已过时)\nrandom_head_compatible (已过时)\ntls1.2_ticket_auth\ntls1.2_ticket_auth_compatible\n默认为\n\"protocol\":\"auth_aes128_md5\",\n\"obfs\":\"tls1.2_ticket_auth_compatible\",\n相应的\n协议插件参数默认为\"protocol_param\":\"\"\n混淆插件参数默认为\"obfs_param\":\"\"\n对于protocol,必须服务端与客户端严格匹配\n服务端配置为xxabc_compatible时(以compatible为后缀的),即服务端支持使用原版客户端,或使用配置插件为xxabc或plain的ssr客户端。\n客户端配置:使用本ssr版本,在编辑服务器配置里找到相应节点,最后在protocol选项和obfs选项的列表里选择需要使用的插件,然后填写相应的参数即可\n兼容性\n目前ssr-libev客户端、ssr-python及ssr-csharp支持全部没有标注为过时或不推荐的协议和混淆。\n实现接口\n以下以C#语言为例做说明\ninterface IObfs\n成员函数\nInitData()\n参数:无\n返回:一个自定义类型变量,通常用于保存此接口的全局信息,不应返回null,c语言中返回void*\n说明:第一次创建实例前调用,同一服务端配置不会重复调用,服务端在建立监听时调用,客户端在第一次连接时调用。\nSetServerInfo(ServerInfo serverInfo)\n参数:ServerInfo结构,包含成员变量:\n\nhost: 字符串类型,服务端ip,客户端需要把域名转换为ip,如有前置代理,则直接使用配置时所用的域名也可,服务端需要获取监听ip\nport: 整数类型,服务端监听端口\nparam: 用户设置的参数,字符串类型\ndata: 由InitData返回的结果,为object类型(c语言中使用void*)\niv: 客户端或服务端加密时使用的iv数组(c语言中需要添加额外字段以记录其长度,下同)\nrecv_iv: 客户端或服务端接收到的iv数组\nkey: 加密时使用的key(不是原key,是通过BytesToKey生成的指定长度数组)\ntcp_mss: 整数类型,TCP分包大小,设置为1460\noverhead: 整数类型,协议头部大小,需要由调用方设置\n\n返回:无\n说明:实例构造的时候(每个连接建立时)调用,调用前iv和key必须已经初始化;而接收到数据后先初始化recv_iv再调用插件。\nint GetOverhead()\n参数:无\n返回:此插件在通信时的附加头部大小\nDispose()\n参数:无\n返回:无\n说明:实例析构时(每个连接关闭时)调用\nbyte[] ClientPreEncrypt(byte[] plaindata, int datalength, out int outlength)\n参数:需要处理的字节数组及其长度\n返回:处理后的字节数组及其长度\n说明:客户端发送到服务端数据加密前调用此接口\nbyte[] ClientEncode(byte[] encryptdata, int datalength, out int outlength)\n参数:需要编码的字节数组及其长度\n返回:编码后的字节数组及其长度\n说明:客户端发送到服务端数据加密后调用此接口\nbyte[] ClientDecode(byte[] encryptdata, int datalength, out int outlength, out bool needsendback)\n参数:需要解码的字节数组及其长度\n返回:解码后的字节数组及其长度,以及needsendback标记是否立即回发服务端数据。如needsendback为true,则会立即调用ClientEncode,调用时参数是一个长度为0的字节数组\n说明:客户端收到服务端数据在解密前调用此接口\nbyte[] ClientPostDecrypt(byte[] plaindata, int datalength, out int outlength)\n参数:需要处理的字节数组及其长度\n返回:处理后的字节数组及其长度\n说明:客户端收到服务端数据在解密后调用此接口\nbyte[] ServerPreEncrypt(byte[] plaindata, int datalength, out int outlength)\n参数:需要处理的字节数组及其长度\n返回:处理后的字节数组及其长度\n说明:服务端发送到客户端数据加密前调用此接口\nbyte[] ServerEncode(byte[] encryptdata, int datalength, out int outlength)\n参数:需要编码的字节数组及其长度\n返回:编码后的字节数组及其长度\n说明:服务端发送到客户端数据加密后调用此接口\nbyte[] ServerDecode(byte[] encryptdata, int datalength, out int outlength, out bool needdecrypt, out bool needsendback)\n参数:需要解码的字节数组及其长度\n返回:解码后的字节数组及其长度,以及needdecrypt标记数据是否需要解密(一般都应该为true),以及needsendback标记是否立即回发客户端数据。如needsendback为true,则会立即调用ServerEncode并发送其返回结果,调用时参数是一个长度为0的字节数组\n说明:服务端收到客户端数据在解密前调用此接口\nbyte[] ServerPostDecrypt(byte[] plaindata, int datalength, out int outlength)\n参数:需要处理的字节数组及其长度\n返回:处理后的字节数组及其长度\n说明:服务端收到客户端数据在解密后调用此接口\nbyte[] ClientUdpPreEncrypt(byte[] plaindata, int datalength, out int outlength)\n参数:需要处理的字节数组及其长度\n返回:处理后的字节数组及其长度\n说明:客户端发送到服务端UDP数据加密前调用此接口\nbyte[] ClientUdpPostDecrypt(byte[] plaindata, int datalength, out int outlength)\n参数:需要处理的字节数组及其长度\n返回:处理后的字节数组及其长度\n说明:客户端收到服务端UDP数据在解密后调用此接口\nbyte[] ServerUdpPreEncrypt(byte[] plaindata, int datalength, out int outlength)\n参数:需要处理的字节数组及其长度\n返回:处理后的字节数组及其长度\n说明:服务端发送到客户端UDP数据加密前调用此接口\nbyte[] ServerUdpPostDecrypt(byte[] plaindata, int datalength, out int outlength)\n参数:需要处理的字节数组及其长度\n返回:处理后的字节数组及其长度\n说明:服务端收到客户端UDP数据在解密后调用此接口\n插件编写\n有两类插件,一类是协议插件,一类是混淆插件\n其中接口InitData, SetServerInfo, Dispose接口必须实现,其它的接口为通讯接口\n编写协议插件的话,需要重写ClientPreEncrypt, ClientPostDecrypt, ServerPreEncrypt, ServerPostDecrypt,其它的按原样返回,needdecrypt必须为true,needsendback必须为false\n编写混淆插件的话,需要重写ClientEncode, ClientDecode, ServerEncode, ServerDecode,其它的按原样返回。\n如果编写的部分仅含客户端部分,那么只需要编写Client为前缀的两个接口,服务端同理。\n目前支持此插件接口的,有 ShadowsocksR C# 和 ShadowsocksR Python\n","renderedFileInfo":null,"shortPath":null,"symbolsEnabled":true,"tabSize":8,"topBannersInfo":{"overridingGlobalFundingFile":false,"globalPreferredFundingPath":null,"showInvalidCitationWarning":false,"citationHelpUrl":"https://docs.github.com/github/creating-cloning-and-archiving-repositories/creating-a-repository-on-github/about-citation-files","actionsOnboardingTip":null},"truncated":false,"viewable":true,"workflowRedirectUrl":null,"symbols":{"timed_out":false,"not_analyzed":false,"symbols":[{"name":"ShadowsocksR 协议插件文档 #","kind":"section_1","ident_start":2,"ident_end":35,"extent_start":0,"extent_end":24788,"fully_qualified_name":"ShadowsocksR 协议插件文档 #","ident_utf16":{"start":{"line_number":0,"utf16_col":2},"end":{"line_number":0,"utf16_col":23}},"extent_utf16":{"start":{"line_number":0,"utf16_col":0},"end":{"line_number":266,"utf16_col":0}}},{"name":"概要 ##","kind":"section_2","ident_start":45,"ident_end":54,"extent_start":42,"extent_end":466,"fully_qualified_name":"概要 ##","ident_utf16":{"start":{"line_number":3,"utf16_col":3},"end":{"line_number":3,"utf16_col":8}},"extent_utf16":{"start":{"line_number":3,"utf16_col":0},"end":{"line_number":7,"utf16_col":0}}},{"name":"现有插件介绍 ##","kind":"section_2","ident_start":469,"ident_end":490,"extent_start":466,"extent_end":10606,"fully_qualified_name":"现有插件介绍 ##","ident_utf16":{"start":{"line_number":7,"utf16_col":3},"end":{"line_number":7,"utf16_col":12}},"extent_utf16":{"start":{"line_number":7,"utf16_col":0},"end":{"line_number":52,"utf16_col":0}}},{"name":"1.混淆插件 ####","kind":"section_4","ident_start":497,"ident_end":516,"extent_start":492,"extent_end":4900,"fully_qualified_name":"1.混淆插件 ####","ident_utf16":{"start":{"line_number":9,"utf16_col":5},"end":{"line_number":9,"utf16_col":16}},"extent_utf16":{"start":{"line_number":9,"utf16_col":0},"end":{"line_number":25,"utf16_col":0}}},{"name":"2.协议定义插件 ####","kind":"section_4","ident_start":4905,"ident_end":4930,"extent_start":4900,"extent_end":10606,"fully_qualified_name":"2.协议定义插件 ####","ident_utf16":{"start":{"line_number":25,"utf16_col":5},"end":{"line_number":25,"utf16_col":18}},"extent_utf16":{"start":{"line_number":25,"utf16_col":0},"end":{"line_number":52,"utf16_col":0}}},{"name":"混淆特性 ##","kind":"section_2","ident_start":10609,"ident_end":10624,"extent_start":10606,"extent_end":12470,"fully_qualified_name":"混淆特性 ##","ident_utf16":{"start":{"line_number":52,"utf16_col":3},"end":{"line_number":52,"utf16_col":10}},"extent_utf16":{"start":{"line_number":52,"utf16_col":0},"end":{"line_number":69,"utf16_col":0}}},{"name":"协议特性 ##","kind":"section_2","ident_start":12473,"ident_end":12488,"extent_start":12470,"extent_end":15129,"fully_qualified_name":"协议特性 ##","ident_utf16":{"start":{"line_number":69,"utf16_col":3},"end":{"line_number":69,"utf16_col":10}},"extent_utf16":{"start":{"line_number":69,"utf16_col":0},"end":{"line_number":100,"utf16_col":0}}},{"name":"混淆与协议配置建议 ##","kind":"section_2","ident_start":15132,"ident_end":15162,"extent_start":15129,"extent_end":17045,"fully_qualified_name":"混淆与协议配置建议 ##","ident_utf16":{"start":{"line_number":100,"utf16_col":3},"end":{"line_number":100,"utf16_col":15}},"extent_utf16":{"start":{"line_number":100,"utf16_col":0},"end":{"line_number":112,"utf16_col":0}}},{"name":"配置方法 ##","kind":"section_2","ident_start":17048,"ident_end":17063,"extent_start":17045,"extent_end":18783,"fully_qualified_name":"配置方法 ##","ident_utf16":{"start":{"line_number":112,"utf16_col":3},"end":{"line_number":112,"utf16_col":10}},"extent_utf16":{"start":{"line_number":112,"utf16_col":0},"end":{"line_number":156,"utf16_col":0}}},{"name":"兼容性 ####","kind":"section_4","ident_start":18649,"ident_end":18663,"extent_start":18644,"extent_end":18783,"fully_qualified_name":"兼容性 ####","ident_utf16":{"start":{"line_number":152,"utf16_col":5},"end":{"line_number":152,"utf16_col":13}},"extent_utf16":{"start":{"line_number":152,"utf16_col":0},"end":{"line_number":156,"utf16_col":0}}},{"name":"实现接口 ##","kind":"section_2","ident_start":18786,"ident_end":18801,"extent_start":18783,"extent_end":24788,"fully_qualified_name":"实现接口 ##","ident_utf16":{"start":{"line_number":156,"utf16_col":3},"end":{"line_number":156,"utf16_col":10}},"extent_utf16":{"start":{"line_number":156,"utf16_col":0},"end":{"line_number":266,"utf16_col":0}}},{"name":"插件编写 ###","kind":"section_3","ident_start":23967,"ident_end":23983,"extent_start":23963,"extent_end":24788,"fully_qualified_name":"插件编写 ###","ident_utf16":{"start":{"line_number":253,"utf16_col":4},"end":{"line_number":253,"utf16_col":12}},"extent_utf16":{"start":{"line_number":253,"utf16_col":0},"end":{"line_number":266,"utf16_col":0}}}]}},"copilotInfo":null,"copilotAccessAllowed":false,"csrf_tokens":{"/shadowsocksrr/shadowsocks-rss/branches":{"post":"H_dxwmpzvZAwp0Ukx4ie5VU7akqlFx4_R77ALpg0cbTHa_wLkAErkIYVxd-WIu_7EP6W_escKshRaNY8y3pZJw"},"/repos/preferences":{"post":"M2V7wcDmreTuF408M0lgmzcucMFxw_q8bAH9CnRV6w27VozkkEw2pLyYXtJioUpyCZ2BcjxohgkIGy0uaZgf5w"}}},"title":"shadowsocks-rss/ssr.md at master · shadowsocksrr/shadowsocks-rsShadowsocks - GOST
dowsocks - GOST Skip to content GOST v3尚未正式发布,文档正在完善中,敬请期待! GOST Shadowsocks 中文 English Initializing search go-gost/gost GOST go-gost/gost 主页 入门 入门 快速开始 配置概述 常见问题 概念 概念 概述 代理转发和通道 服务 转发链 跳跃点 选择器 认证 分流 负载均衡 限速限流 准入控制 域名解析 主机IP映射 Ingress 路由器 服务发现 数据记录 服务观测 插件系统 教程 教程 协议 协议 概述 HTTP HTTP2 HTTP3 SOCKSv4/v5 Shadowsocks Shadowsocks Table of contents 标准shadowsocks代理 UDP 端口转发 数据通道 SS Over TLS SS Over Websocket SS Over KCP SNI Relay TLS DTLS Websocket gRPC QUIC PHT KCP SSH MTCP TLS设置 HTTP通道 端口转发 反向代理 反向代理隧道 反向代理隧道-高可用 HTTP文件服务 探测防御 PROXY Protocol DNS代理 透明代理 多网络接口 TUN/TAP设备 ICMP通道 Unix域套接字重定向 串口重定向 监控指标 日志 WebAPI WebAPI 概述 动态配置 参考 参考 配置 配置 命令行 配置文件 监听器(Listeners) 监听器(Listeners) TCP UDP TLS MTLS WS MWS HTTP2 H2(C) gRPC QUIC PHT HTTP3 KCP SSH SSHD RED REDU RTCP RUDP DNS TUN TAP ICMP OHTTP OTLS FTCP 处理器(Handlers) 处理器(Handlers) HTTP HTTP2 SOCKS4 SOCKS5 Auto Relay TCP UDP RTCP RUDP SS SSU SNI SSHD DNS RED REDU TUN TAP 拨号器(Dialers) 拨号器(Dialers) TCP UDP TLS MTLS WS MWS HTTP2 H2(C) gRPC QUIC PHT HTTP3 KCP SSH SSHD ICMP OHTTP OTLS FTCP 连接器(Connectors) 连接器(Connectors) HTTP HTTP2 SOCKS4 SOCKS5 Forward Relay SS SSU SNI SSHD 博客 博客 Archive Archive 2024 2023 2022 2017 2016 2015 Categories Categories Bypass Deploy Docker General K8S Port Forwarding Reverse Proxy Serial TUN VPN 捐助 Table of contents 标准shadowsocks代理 UDP 端口转发 数据通道 SS Over TLS SS Over Websocket SS Over KCP Shadowsocks¶ GOST对shadowsocks的支持基于shadowsocks/shadowsocks-go和shadowsocks/go-shadowsocks2库。 标准shadowsocks代理¶ 命令行配置文件 gost -L ss://chacha20-ietf-poly1305:pass@:8338services:
- name: service-0
addr: :8338
handler:
type: ss
auth:
username: chacha20-ietf-poly1305
password: pass
listener:
type: tcp
延迟发送 默认情况下shadowsocks协议会等待请求数据,当收到请求数据后会把协议头部信息与请求数据一起发给服务端。当客户端nodelay选项设为true后,协议头部信息会立即发给服务端,不再等待用户的请求数据。当通过代理连接的服务端会主动发送数据给客户端时(例如VNC服务,MySQL数据库)需要开启此选项,以免造成连接异常。 UDP¶ GOST中shadowsocks的TCP和UDP服务是相互独立的两个服务。 命令行配置文件 gost -L ssu://chacha20-ietf-poly1305:pass@:8338
等同于 gost -L ssu+udp://chacha20-ietf-poly1305:pass@:8338
services:
- name: service-0
addr: :8338
handler:
type: ssu
auth:
username: chacha20-ietf-poly1305
password: pass
listener:
type: udp
端口转发¶ Shadowsocks UDP relay可以配合UDP端口转发来使用: 命令行配置文件 gost -L udp://:10053/1.1.1.1:53 -F ssu://chacha20-ietf-poly1305:123456@:8338
services:
- name: service-0
addr: :10053
handler:
type: udp
chain: chain-0
listener:
type: udp
forwarder:
nodes:
- name: target-0
addr: 1.1.1.1:53
chains:
- name: chain-0
hops:
- name: hop-0
nodes:
- name: node-0
addr: :8338
connector:
type: ssu
auth:
username: chacha20-ietf-poly1305
password: "123456"
dialer:
type: udp
数据通道¶ Shadowsocks代理可以与各种数据通道组合使用。 SS Over TLS¶ 命令行配置文件 gost -L ss+tls://:8443
services:
- name: service-0
addr: :8443
handler:
type: ss
listener:
type: tls
双重加密 这里为了避免双重加密,Shadowsocks未使用任何加密方法,采用明文传输。 SS Over Websocket¶ 命令行配置文件 gost -L ss+ws://:8080
gost -L ss+wss://:8080
services:
- name: service-0
addr: :8080
handler:
type: ss
listener:
type: ws
# type: wss
SS Over KCP¶ 命令行配置文件 gost -L ss+kcp://:8080
services:
- name: service-0
addr: :8080
handler:
type: ss
listener:
type: kcp
Back to top Previous SOCKSv4/v5 Next SNI Copyright © 2015 - 2024 GOST Made with Material for MkDocs