SS和SSR的原理

Introduction

SS

SS全称是Shadowsocks,是一种基于Socks5代理方式的加密传输协议。

Shadowsocks是一种基于Socks5代理方式的网络数据加密传输包,并采用Apache许可证、GPL、MIT许可证等多种自由软件许可协议开放源代码。shadowsocks分为服务器端和客户端,在使用之前,需要先将服务器端部署到服务器上面,然后通过客户端连接并创建本地代理。目前包使用Python、C、C++、C#、Go语言等编程语言开发。

特点

  • Shadowsocks使用自行设计的协议进行加密通信。加密算法有AES、Blowfish、IDEA、RC4等,除创建TCP连接外无需握手,每次请求只转发一个连接,无需保持“一直连线”的状态,因此在移动设备上相对较为省电。
  • 所有的流量都经过算法加密,允许自行选择算法。
  • Shadowsocks通过异步I/O和事件驱动程序运行,响应速度快。

安全性

  • 在某些极端的环境下,通过深度包检测(DPI)也有可能识别出协议特征。
  • 通过随机森林算法检测Shadowsocks流量的方法,并自称可达到85%的检测精度。

shadowsocks.org

SSR

ShadowsocksR是breakwa11发起的Shadowsocks分支,在Shadowsocks的基础上增加了一些数据混淆方式,称修复了部分安全问题并可以提高QoS优先级。

Socks5

Socks5是属于TCP/IP模型中应用层的协议,因此,网络连接过程可以理解基于Socks5协议的请求由客户机到代理机的整个过程如下:

  • 将用户数据添加SOCKS5头部,发到传输层;
  • 传输层将SOCKS5协议数据分段,添加TCP/UDP协议数据发到网络层;
  • 网络层将TCP/UDP协议数据添加IP协议头,发往链路层;
  • 链路层添加帧头与尾,将数据封装成帧发往代理机。

Socks5工作原理

Socks5客户端 <---socks5---> Socks5服务器 <—正常请求—> 目标主机

Socks5客户端在与Socks5服务器交互的整个过程是有可能暴露在整个互联网中的,因此很容易被监控到,根据协议特征也可以很容易识别出来。

Shadowsocks Socks5工作原理

Socks5客户端 <---socks5---> sslocal <–密文–> ss-server <—正常请求—> 目标主机

Shadowsocks的处理方式是将Socks5客户端与Socks5服务器的连接提前,Socks5协议的交互完全是在本地进行的,在网络中传输的完全是利用加密算法加密后的密文,这就很好的进行了去特征化,使得传输的数据不是很容易的被特征识别。

差异部分:

  • 本地的sslocal:sslocal对于Socks5客户端便是Socks5服务器,对于Socks5客户端是透明的,sslocal完成与Socks5客户端所有的交互。
  • 远程的ssserver:ssserver对于目标主机同样也是Socks5服务器,对于目标主机是透明的,完成Socks5服务器与目标主机的所有操作。
  • sslocal-ssserver:sslocal接收到Socks5客户端发送的数据,会将数据加密,并将配置信息发送到ssserver,ssserver接收到配置信息进行权限验证,然后将数据进行解密,然后将明文发往目标主机;当目标主机响应ssserver,ssserver将接收到的数据进行解包,并将数据加密,发送到sslocal,sslocal接收到加密后的数据进行解密,再发送给Socks 5客户端,这就完成了一次交互。

阻断技术

DNS污染/劫持

在进行域名访问时,首先会将域名通过dns解析为对应的真实IP,然后通过IP进行HTTP访问,所谓DNS攻击手段,即通过某种手段使得客户机发起DNS查询但得到的却是错误的IP,导致客户机无法正常访问。 防火长城会在骨干网出口的53端口进行IDS入侵检测,检测到黑名单域名等,会伪装成域名服务器向客户机发送虚假的回应,由于DNS查询请求一般是基于UDP无连接传输层协议,该协议特征是无状态连接、不可靠传输,DNS查询会接收最先到达的请求,抛弃之后到达的请求,因此导致客户机被欺骗,请求被重定位到虚假IP。


IP封锁

在客户机发送请求到服务器的过程中会经过一系列路由的转发,在路由器转发的过程中会根据路由表中存储的表项来决定下一跳的路由器或主机,选择的下一跳地址会根据路由协议来决定。 早期使用的是ACL(访问控制列表)来进行IP黑名单限制,现在更高效的路由扩散技术来进行对特定的IP进行封锁。早期路由器都是采用静态路由协议,每一条路由需要进行人工来配置路由表项,或者配置一些策略,在决定路由转发,这时可以通过检测,对相应要封锁的IP配置一条错误的路由,将之牵引到一个不做任何操作的服务器(黑洞服务器),此服务器所要做的就是丢包,这样便无声息封锁掉了。动态路由协议的出现可以更高效的进行屏蔽,动态路由协议可以让路由器通过交换路由表信息来动态更新路由表,并通过寻址算法来决定最优化的路径。因此可以通过动态路由协议的路由重分发功能将错误的信息散播到整个网络,从而达到屏蔽目的。


IP/端口黑名单

该手段可以结合上边提到的IP封锁技术,将封锁精确到具体的端口,使该IP的具体端口接收不到请求,从而达到更细粒度的封锁。

经常被封锁的端口如下:

  • SSH的TCP协议22端口
  • HTTP的80端口
  • PPTP类型VPN使用的TCP协议1723端口
  • L2TP类型VPN使用的UDP协议1701端口
  • IPSec类型VPN使用的UDP协议500端口和4500端口
  • OpenVPN默认使用的TCP协议和UDP协议的1194端口
  • TLS/SSL/HTTPS的TCP协议443端口
  • Squid Cache的TCP协议3128端口

无状态TCP连接重置

TCP连接会有三次握手,此种攻击方式利用了该特点来进行攻击,gfw会对特定IP的所有数据包进行监控,会对特定黑名单动作进行监控(如TLS加密连接),当进行TCP连接时,会在TCP连接的第二部SYNC-ACK阶段,伪装成客户端和服务器同时向真实的客户端和服务器发送RESET重置,以很低的成本来达到切断双方连接的目的。与丢弃客户机的包相比,在丢包后客户机会不断的发起重试,这样会加重黑洞服务器的负担,利用TCP连接重置来断开连接,客户机也不必发送ACK来确认,这样成本就要低得多。


TCP协议关键字阻断

该手段在无状态TCP连接重置手段之上,加入了关键字过滤功能,当协议的头部包含特定的关键字便对其连接进行重置,比如HTTP协议、ED2K协议等等。


深度包检测

深度数据包检测(Deep packet inspection,DPI)是一种于应用层对网络上传递的数据进行侦测与处理的技术,被广泛用于入侵检测、流量分析及数据挖掘。就字面意思考虑,所谓“深度”是相对于普通的报文检测而言的——DPI可对报文内容和协议特征进行检测。基于必要的硬件设施、适宜的检测模型及相应的模式匹配算法,gfw能够精确且快速地从实时网络环境中判别出有悖于预期标准的可疑流量,并对此及时作出审查者所期望的应对措施。

Reference

Shadowsocks原理详解(上篇):https://sq.163yun.com/blog/article/185530682109534208
Shadowsocks原理详解(中篇):https://sq.163yun.com/blog/article/185531711118745600
Shadowsocks原理详解(下篇):https://sq.163yun.com/blog/article/185532158474821632
shadowsocks实现原理:https://bingtaoli.github.io/2016/11/23/shadowsocks%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86/