基于socks5代理轻量级网络流量加密研究

2017-07-04 06:54王永鉴孙光浩刘丹青
软件 2017年5期
关键词:代理服务器网络流量密钥

王永鉴,孙光浩,刘丹青

(天津工业大学 计算机科学与软件学院,天津 300387)

基于socks5代理轻量级网络流量加密研究

王永鉴,孙光浩,刘丹青

(天津工业大学 计算机科学与软件学院,天津 300387)

随着Internet的飞速发展,网络环境日趋复杂,用户面临电子邮件被窃取、信息被篡改等威胁。因此,保护网络流量日趋重要。本项目提出轻量级网络流量加密解决方案,基于socks5[4]代理原理,通过对称加密算法和TCP协议数据伪装技术实现。本项目具有配置客户端快速、访问网络安全性高、访问行为隐蔽性高、用户感知不明显、需要配置低等优势。预期成果可以用于邮件加密、隐私保护、公共WIFI安全等相关领域,市场前景广阔。

socks5;TCP/IP协议;Epoll模型

0 引言

Socks[1]协议是网络代理协议,它的设计初衷是为了支持应用穿越防火墙访问外部网络。Socks在协议栈的TCP层上运行,是介于传输层和应用层之间的中介层协议, 是为了让使用TCP和UDP的客户/服务器应用程序更方便安全地使用网络防火墙所提供的服务而设计的。对于上层应用层协议来说,Socks[2]代理只是简单地传递数据包,而不必关心是何种应用协议(比如 FTP,H TTP请求)。Socks协议的工作原理与应用代理相似,作为网络边界上的Socks 服务器接收客户的请求,并代理外部的应用服务器,使得客户与外部的联系实质上是 Socks[5]客户与 Socks 服务器之间的联系;而外部的应用服务器所接受的请求是来自Socks服务器的外部接口,也就是说 Socks服务器对内部网络的客户来说是服务器,对外部网络的应用服务器来说是客户。

1 相关技术简介

1.1 TCP/IP协议

TCP/IP参考模型是一个抽象的分层模型,这个模型中,所有的TCP/IP系列网络协议都被归类到4个抽象的“层”中。每一抽象层创建在低一层提供的服务上,并且为高一层提供服务。完成一些特定的任务需要众多的协议协同工作,这些协议分布在参考模型的不同层中的,因此有时称它们为一个协议栈。TCP/IP参考模型为TCP/IP协议栈订身制作。其中IP协议只关心如何使得数据能够跨越本地网络边界的问题,而不关心如何利用传输媒体,数据如何传输。整个TCP/IP协议栈则负责解决数据如何通过许许多多个点对点通路(一个点对点通路,也称为一“跳”,1 hop)顺利传输,由此不同的网络成员能够在许多“跳”的基础上创建相互的数据通路。如想分析更普遍的网络通信问题,ISO的OSI模型也能起更好的帮助作用。 因特网协议族是一组实现支持因特网和大多数商业网络运行的协议栈的网络传输协议。它有时也被称为TCP/IP协议组,这个名称来源于其中两个最重要的协议:传输控制协议(TCP)和因特网协议(IP),它们也是最先定义的两个协议。同许多其他协议一样网络传输协议也可以看作一个多层组合,每层解决数据传输中的一组问题并且向使用这些低层服务的高层提供定义好的服务。高层逻辑上与用户更为接近,所处理数据更为抽象,它们依赖于低层将数据转换成最终能够进行实体控制的形式。 网络传输协议能够大致匹配到一些厂商喜欢使用的固定7层的OSI模型。然而这些层并非都能够很好地与基于ip的网络对应(根据应用的设计和支持网络的不同它们确实是涉及到不同的层)并且一些人认为试图将因特网协议组对应到OSI会带来混淆而不是有所帮助。

1.2 Socks5协议

RFC(request for comments)1928 文档里面定义了 Socks5 协议[3]。该协议最初设计的目的是为了让有权限的用户可以穿过防火墙的限制,使用户能够访问不能直接连接的资源。目前该协议的最高版本是 Socks5[4]。该协议在 1996 年被 IETF 确认为标准通信协议。目前,大量的网络应用程序都支持Socks5[6]代理。由于 Socks5 实际上仍然对应了socket的操作,所以通过编程很容易实现让不支持Socks5[7]协议的应用软件也能通过 Socks5[8]服务器进行网络通信,该通信过程对被代理的应用软件透明。如Initex 公司开发的 Proxifier。因此,目前SOCKS 协议大多应用于突破网络通信限制,提升网络权限。由于通过 Socks5[9]可以代理任何基于socket 协议的应用软件,因此服务端只是做转发,并不知道客户端使用数据的应用和具体的数据格式。通过对转发数据的加密,可以保证客户端数据网络传输的安全。Socks5[10]代理协议的原理是客户端先连到代理服务器,然后客户端发送的所有TCP数据包请求都通过服务端转发。对于接收端,认为所有的请求都来自代理服务器。代理服务器接收远端发来的消息后,根据维护的客户端列表,将数据转发给不同的客户。

Socks5[11]代理服务的工作流程如下:

①客户端建立到代理服务器的 TCP 连接。②客户端向代理服务器发送代理请求。

③代理服务接收代理客户端应答,根据相应标记判断是否允许代理。

④客户端向代理服务器发送协商请求信息以及相关的端口信息。

⑤客户端将数据发送到代理服务器并由代理服务器进行数据传递操作。

基于以上 Socks5 代理协议的特点,Socks5[12]代理协议非常适合无线局域网通过 Socks5 上网

1.3 Epoll模型简介

epoll是Linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。另一原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入准备队列的描述符集合就行了。epoll除了提供select/poll那种IO事件的水平触发(Level Triggered)外,还提供了边缘触发(Edge Triggered),这就使得用户空间程序有可能缓存IO状态,减少系统调用,提高应用程序效率。

1.4 对称密钥加密算法

对称密钥加密(英语:Symmetric-key algorithm)又称为对称加密、私钥加密、共享密钥加密,是密码学中的一类加密算法。这类算法在加密和解密时使用相同的密钥,或是使用两个可以简单地相互推算的密钥。实务上,这组密钥成为在两个或多个成员间的共同秘密,以便维持专属的通讯联系。与公开密钥加密相比,要求双方取得相同的密钥是对称密钥加密的主要缺点之一。

常见的对称加密算法有DES、3DES、AES、Blowfish、IDEA、RC5、RC6。对称加密的速度比公钥加密快很多,在很多场合都需要对称加密。RC5分组密码算法是1994由麻萨诸塞技术研究所的Ronald L. Rivest教授发明的,并由RSA实验室分析。它是参数可变的分组密码算法,三个可变的参数是:分组大小、密钥大小和加密轮数。在此算法中使用了三种运算:异或、加和循环。

2 应用场景

轻量级网络流量加密系统属于远程访问技术,简单地说就是利用公用网络架设专用网络。例如某公司员工出差到外地,他想访问企业内网的服务器资源,这种访问就属于远程访问。

在传统的企业网络配置中,要进行远程访问,传统的方法是租用DDN(数字数据网)专线或帧中继,这样的通讯方案必然导致高昂的网络通讯和维护费用。对于移动用户(移动办公人员)与远端个人用户而言,一般会通过拨号线路(Internet)进入企业的局域网,但这样必然带来安全上的隐患。

让外地员工访问到内网资源,利用该解决方法就是在内网中架设一台socks5服务器。外地员工在当地连上互联网后,通过互联网连接socks5服务器,然后通过该服务器进入企业内网。为了保证数据安全,服务器和客户机之间的通讯数据都进行了加密处理。有了数据加密,就可以认为数据是在一条专用的数据链路上进行安全传输,就如同专门架设了一个专用网络一样,但实际上VPN使用的是互联网上的公用链路,其实质上就是利用加密技术在公网上封装出一个数据通讯隧道。有了该技术,用户无论是在外地出差还是在家中办公,只要能上互联网就能访问内网资源。

3 实现过程

shadowsocks 是将原来 ssh 创建的 Socks5[13]协议拆开成 server 端和 client 端,所以下面这个原理图基本上和利用 ssh tunnel 大致类似1、6)客户端发出的请求基于 Socks5 协议跟 ss-local 端进行通讯,由于这个 ss-local 一般是本机或路由器或局域网的其他机器,不经过 GFW,所以解决了上面被GFW通过特征分析进行干扰的问题2、5) ss-local 和 ss-server 两端通过多种可选的加密方法进行通讯,经过GFW的时候是常规的TCP包,没有明显的特征码而且GFW也无法对通讯数据进行解密3、4)ss-server 将收到的加密数据进行解密,还原原来的请求,再发送到用户需要访问的服务,获取响应原路返回。

图1 Shadowsocks的实现过程Fig.1 hadowsocks the realization of the process

4 基本原理

shadowsocks的基本工作原理并不复杂。shadowsocks包括local和server两个程序。local 运行在用户自己的机器上,server 运行在墙外的服务器上。正常工作模式下,local 通常会监听本地1080端口,提供socks v5协议接口。在用户本机进程和local的1080端口建立TCP连接之后,首先会发送一个hello包,或者叫handshake 握手包。local 程序接收到这个包之后,进行简单的包数据检查之后就返回一个确认包。本机进程收到确认的包之后,会再发送一个请求包,包的主要内容就是目标服务的地址和端口号。local程序接收到请求包之后,会和server程序建立一个TCP连接,连接建立之后会把上面的目标服务的地址和端口号传给server。这个连接是穿墙的关键,连接里面传输的数据都是经过加密的,最常用的就是aes-256-cfb。local程序会对请求包返回一个确认的包。然后本机进程就开始向local传输实际的数据,local接收到之后加密继续传给server。server接收到之后把数据解密出来,然后和目标服务建立TCP连接,并把解密后的数据发送出去。然后接收数据就是上述的反过来。

为了理解以上内容,强烈建议阅读一下socks v5协议的RFC 1928。不长,一共才9页,定义的包格式也很少。

图2 Shadowsocks 的基本工作原理Fig.2 hadowsocks the basic working principle

4.1 shadowsocks

shadowsocks Python版本主要包括 Event loop、TCP Relay、UDP Relay和DNSResolver 这几个模块。我们主要介绍TCP的模式,UDP不做过多介绍。

shadowsocks 主要的工作流程就是先进行配置处理,然后针对每个需要监听的端口建立一个TCP Relay和UDP Relay,并添加到eventloop里。然后启动eventloop的循环。当eventloop接收到事件时,将事件分发,调用对应的handle_event进行处理。对于每个建立的客户端发起的TCP连接,都会新建一个TCP Relay Handler 进行处理。

在这里,local和server 使用的是同一个 TCPRelay类,他们的处理流程都统一了起来。但是就是因为如此,代码的理解上反而显的不是那么清晰。

4.2 Eventloop

shadowsocks 最早期的版本是基于线程的模型处理并发连接的。由于种种原因,线程模型在频繁建立连接、高并发的情况下效率并不高。现在的版本是基于eventloop的处理模型。shadowsocks里使用的eventloop是基于epoll模型的封装,把 select和kqueue都封装成了epoll模型的接口。

eventloop 最重要的方法run里的逻辑,就是典型的epoll处理方式。这里强烈建议去理解一下epoll的工作模型。这里很简单,接收到event之后,调用对应的 handle_event方法进行处理。

4.3 TCPRelay

TCPRelay 里有个概念就是_server_socket,表示的是监听端口的socket。然后看 TCPRelay 的handle_event逻辑就分为了两块,如果是 _server_ socket,那么就只有客户端请求建立连接的事件,_ server_socket负责accept之后创建新的 TCPRelayHandler;如果不是,那么说明是客户端连接的读写事件,直接分发到对应的TCPRelayHandler调用handle_event进行处理。

在tcprelay.py 这个文件最上方,有一段注释是描述的客户端连接建立的全部过程。

# as sslocal:

# stage 1 addr received from local, query DNS for remote

# stage 2 UDP assoc

# stage 3 DNS resolved, connect to remote

# stage 4 still connecting, more data from local received

# stage 5 remote connected, piping local and re-mote

# as ssserver:

# stage 0 just jump to stage 1

# stage 1 addr received from local, query DNS for remote

# stage 3 DNS resolved, connect to remote

# stage 4 still connecting, more data from local received

# stage 5 remote connected, piping local and remote

在 TCPRelayHandler 里,就是按照如下定义的stage 的流程运行的。

STAGE_INIT = 0

STAGE_ADDR = 1

STAGE_UDP_ASSOC = 2

STAGE_DNS = 3

STAGE_CONNECTING = 4

STAGE_STREAM = 5

STAGE_DESTROYED = -1

先看handle_event,里面的逻辑分成了remote_ sock和local_sock两部分。先从local_sock开始。从客户端建立TCP连接之后,TCPRelayHandler创建的时候,local_sock就存在了,由于是客户端主动建立的连接,数据也都是客户端先发起的,所以先从local_sock的可读事件开始。记住,我们目前处于STAGE_INIT状态。在进入_on_local_read之后,紧守着is_local和_stage两个变量,就可以按照上面基本原理里面说的工作流程,将状态机运行起来了。

eventloop模型比较让人讨厌的就是要不停的循环,然后进入各自的 handle_event 里去思考流程,比较麻烦

5 结论

基于Socks5[14]协议的轻量级网络流量加密系统可适应不同客户端,多种用户需求,便于管理,代价低等优点。适合在不同终端中加密网络流量。概括而言,本系统通过C/S(服务器/客户端)架构,比传统代理方式(PPTPL2TPIPSecOPENVPN等)更加轻量,抛弃了密钥协商的过程,将需要加密的网络流量数据伪装为TCP协议数据,更不容易被阻断,采取事先在服务器端设置好固定密钥的方式来加密连接,同时可以自定义端口和支持远程DNS解析,专为移动设备和无线网络优化。

[1] Delfs, Hans & Knebl, Helmut. Symmetric-key encryption. Introduction to cryptography: principles and applications. Springer. 2007. ISBN 9783540492436.

[2] Mullen, Gary & Mummert, Carl. Finite fields and applications. American Mathematical Society. 2007: 112. ISBN 9780821844182.

[3] William Stallings. 操作系统——精髓与设计原理.: 530. ISBN 7-121-02196-X.

[4] Marcus Leech. SOCKS Protocol Version 5[S]. IETF RFC 1928, 1996.

[5] 俞定国,舒明磊,谭成翔. 基于 Socks5代理的移动SSL VPN系统研究与实现[J]. 计算机科学, 2011, 38(1): 119-122.

[6] 喻小光,陈维斌,潘孝铭. 一种基于SOCKS5的 Web 安全代理技术[J]. 华侨大学学报: 自然科学版,2007,28(3): 268-271.

[7] 孙伟平. 有关几种网络代理协议的探讨[J]. 微计算机信息, 2006, (12): 167-169.

[8] 梁海, 范辉. Socks5协议实现防火墙穿透[J]. 现代计算机(专业版), 2004, (11): 25-29+65.

[9] 刘洪柱. 一种基于SOCKS5协议的代理服务器的设计和实现[J]. 大众科技, 2004, (04): 68-69.

[10] 林心愉. 解决Socks5代理服务器因进程过多而无法运行的问题[J]. 计算机时代, 2001, (03): 3.

[11] 闫鹏. Socks 5点述代理服务[J]. 微电脑世界, 2001, (04): 94-95.

[12] 毕保祥, 肖德宝. SOCKS5的身份认证机构[J]. 计算机应用, 2000, (07): 38-40.

[13] 范雄飞, 汪霖. 基于LSP的SOCKS5代理客户端设计[J]. 湖南工业大学学报, 2009, (05): 102-105.

[14] 陈静. 基于SOCKS5协议的专用网络文件传输的设计与实现[J]. 大众科技, 2009, (09): 33-34.

Research on Lightweight Network Traffic Encryption Based on socks5 Proxy

WANG Yong-jian, SUN Guang-hao, LIU Dan-qing
(School of Computer Science and Software, Tianjin Polytechnic University, Tianjin 300387, China)

With the rapid development of the Internet, the network environment is becoming increasingly complex, users face e-mail theft, information tampering and other threats. As a result, protecting network traffic is becoming increasingly important. The project proposed lightweight network traffic encryption solution, based on socks5[4]proxy principle, through the symmetric encryption algorithm and TCP protocol data disguise technology to achieve. This project has the advantages of fast client configuration, high access network security, high concealment behavior, lack of user perception, and low configuration. Expected results can be used for mail encryption, privacy protection, public WIFI security and other related fields, the market prospect is broad.

Socks5; TCP/IP protocol; Epoll model

SOCKS hello

from local, send hello to local

TP391.41

A

10.3969/j.issn.1003-6970.2017.05.022

本文著录格式:王永鉴,孙光浩,刘丹青. 基于socks5代理轻量级网络流量加密研究[J]. 软件,2017,38(5):107-111

猜你喜欢
代理服务器网络流量密钥
探索企业创新密钥
基于多元高斯分布的网络流量异常识别方法
基于神经网络的P2P流量识别方法
密码系统中密钥的状态与保护*
地铁信号系统中代理服务器的设计与实现
IP地址隐藏器
一种对称密钥的密钥管理方法及系统
AVB网络流量整形帧模型端到端延迟计算
基于ECC的智能家居密钥管理机制的实现
网络流量监控对网络安全治理的重要性