网络代理:Socks5与Shadowsocks
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
1) 应用程序,安装在用户终端内的提供某种特定服务的客户端程序,譬如浏览器。 2) 代理客户端,安装在用户终端内的负责监听和截获应用程序对网络资源的访问,并将收到的请求资源交付给应用程序。 3) 代理服务器,一台外部主机,负责与目标服务器建立通信连接,在代理客户端和目标服务器之间转发用户数据。 4) 目标服务器,提供特定网络资源的主机。 我们经常说的SSL VPN的Clientless和Thin-Client模式本质上也是一种网络代理技术。很多人将网络代理视为VPN,实际上他们的工作原理并不相同,网络代理通过代理服务器充当中间人转发用户终端和目标服务器之间的数据流量,从而绕过网络限制访问那些受限的网络资源。不仅如此,通过使用缓存机制网络代理还能用于网络加速,提高网络访问速度,其中一个典型的应用就是基于HTTP代理的网络加速器。而VPN通常是通过在公共网络基础上利用加密/封装技术构建一个点到点的隧道,用户通过这条隧道实现对特定资源(大多数是企业内网资源)的访问,其中一个最为典型的应用是IPSec VPN。 二、Socks5与Shadowsocks
1. Socks5协议 Socks5是Socks协议的第五个版本,在Socks4的基础上新增UDP转发和认证功能,是互联网上最典型的一个网络代理协议,它的基本工作原理如下图所示: 图片来源网络 1) 首先Socks5客户端与Socks5服务器TCP三次握手建立一条TCP连接。 2) 然后执行Socks5握手,协商协议版本号、支持的认证方法,对Socks5客户端进行认证(如果配置了验证)。 3) Socks5协商和认证成功后,当用户通过应用程序访问特定网络资源时,Socks5客户端监听并截获到应用程序的访问请求,然后向Socks5服务器发起连接请求。请求的内容包括,应用程序要访问的目标服务器ip地址或域名和端口等信息。 4) 收到客户端的连接请求后,Socks5服务器和目标服务器进行TCP三次握手建立TCP连接。然后向Socks5客户端发送一条Socks5响应消息,通知对方到目标服务器的连接已经建立成功。 5) Socks5客户端将收到的来自应用程序的数据(可能是应用层的数据,也可能是传输层之上的数据,譬如SSL协议报文)通过1)所建立的TCP连接原样发送给Socks5服务器;Socks5服务器再将数据通过4)建立的TCP连接原样发送给目标服务器;目标服务器收到应用程序的数据后,反向将响应数据发送给用户端的应用程序。
通过Socks5的工作过程不难发现,Socks5网络代理明文原样转发应用程序和服务器之间交互的数据,它自身没有数据加密功能,为了保障传输过程中数据的机密性和完整性,通常需要依赖代理的上层应用自身对数据进行加密/完整性校验等处理。谈到这里,想必大家最关心的问题是,通过Socks5能够绕过网管限制访问那些受限网络资源吗?答案是当然不能。因为Socks5明文传输数据,数据内容一目了然,当访问那些受限网络资源时,很容易被过滤掉,而且像Socks5/IPSec VPN这类协议协议特性明显,因为他们的通信报文格式,协商过程等都是明文规范好的很容易识别,在没有获得公司网管授权的情况下,通常不会允许这种代理/VPN报文通过。 2. Shadowsocks协议 为了绕过公司网管的网络限制,访问那些受限的网络资源,需要解决网络代理明文传输数据、协议特性明显等问题,避开公司网管的火眼金睛。因此,有大神就在Socks5的基础上开发出了大名鼎鼎Shadowsocks协议也就是影梭。 首先看一下Shadowsocks网络代理结构和组件: 1) Socks5客户端,安装在用户终端内,作为代理客户端负责监听和截获应用程序的访问请求,与Ss-local执行Socks5握手协商、交互用户数据。 2) Ss-local,同样安装在用户终端内,冲当Socks5服务器,负责与Socks5客户端执行握手、用户数据交互,将用户数据加密后发送给Ss-server。 3) Ss-server,一台外部代理服务器,负责与目标服务器建立通信连接,接收Ss-local加密的用户数据,解密后转发给目标服务器,同时将收到的目标服务器的响应数据加密后发送给Ss-local。 4) 目标服务器,提供特定网络资源的主机。 从Shadowsocks代理结构可以看出,Shadowsocks将Socks5服务器功能拆分成两部分: Ss-local作为Socks5服务器端,负责监听Socks5 客户端请求,与Socks5客户端进行 Socks5 协议相关的握手协商、处理连接请求、接收用户数据。但它并不将用户数据直接发送给目标服务器,而是发送给Ss-server。Ss-server作为代理服务器,负责与目标服务器建立通信连接,将用户数据转发给目标服务器。 这样做的好处是,Socks5客户端和Ss-local都是安装在用户终端内,Socks5协议握手协商是在本地完成的,降低了网络延时,加快Socks5协商过程,并且隐藏了Socks5握手过程中的协议特征。 注:Ss-local和Ss-server之间并不运行Socks5握手协商。 Ss-local与Ss-server之间运行自定义的Shadowsocks协议,它定义了数据传输规则、数据加解密算法(AEAD加密/流加密)、预共享密钥方式的身份验证、数据混淆插件等,对传输的用户数据进行加密处理,这样就保证了数据的机密性。同时可以使用数据混淆插件(simple-obfs)对加密后的数据进行混淆去掉流量特征,把Ss-local和Ss-server之间的流量伪装成普通的TCP或UDP流量。 注:Ss-local与Ss-server之间它们之间并不进行密钥协商和交换。加密密钥通过什么算法产生的,本人并没有深入了解,有兴趣的朋友可以查看一些相关文章。 Ss-local发送给Ss-server加密前的数据格式为: target address:目标服务器的IP地址或域名以及端口号,它的格式为:
type:地址类型 1. 0x01: host是一个4-byte的IPV4地址。2. 0x03: host是一个变长字符串。第一个byte是一个变长字符串长度, 接下来是一个最长255byte的域名。 3. 0x04: host是一个IPV6地址。 port:端口号 payload:用户数据 注:Ss-server发送给Ss-local加密前的数据格式不含target字段。 Ss-local和Ss-server之间传输的加密后的数据格式为:
最后我们看一下Shadowsocks的基本工作过程: 1) Socks5客户端与Ss-local建立TCP连接,进行Socks5握手协商。 2) Socks5客户端截获应用程序的网络访问请求后,向Ss-local发送连接请求。 3) Ss-local收到客户端的连接请求后,向Ss-server发起TCP三次握手,建立TCP连接。然后向Socks5客户端发送一条Socks5响应消息,通知对方连接成功。 4) Socks5客户端将用户数据发送给Ss-local,Ss-local对用户数据进行加密和混淆(可选)处理后,发送给Ss-server。 5) Ss-server解密收到的用户数据,并根据target字段解析出目标服务器的IP地址/域名以及端口号。然后向目标服务器发起TCP三次握手,建立TCP连接,将用户数据转发给目标服务器。目标服务器将响应数据再反向发送给应用程序。
阅读原文:原文链接 该文章在 2025/7/14 18:42:04 编辑过 |
关键字查询
相关文章
正在查询... |