共计 1289 个字符,预计需要花费 4 分钟才能阅读完成。
shadowsocks
shadowsocks作者已经被约谈了,所以关于它的介绍就省略了,懂的人自然懂。
shadowsocks分为客户端和服务端,服务端运行在能浏览墙外网页的服务器,客户端运行在需要翻墙的主机,目前支持Linux、Windows、Android、IOS等主流操作系统。
shadowsocks运行原理
运行原理很简单,SS Local和SS Server分别运行在客户端和服务端,SS Local会有一个socket监听本地端口(默认是1080),并会提供 socks v5 协议接口与本地进程建立TCP连接。当本地进程与SS Local建立连接后,发送一个包含目标服务的地址和端口号的请求包给SS Local,即图中1)过程。SS Local 接收到请求包之后,与SS Server建立连接并发送加密后的请求包,即图中2)过程,SS Server接受请求包并解密,请求目标服务网址返回数据,即图中3)、4)过程。之后将返回的数据加密后传回给SS Local,即图中5)过程,再传给本地进程,即图中6)过程。这就是一整个shadowsocks的工作流程。
很多人会疑惑,为什么正常的请求经过GFW之后会被墙,shadowsocks同样会经过GFW是怎么不被墙的呢?
通常情况下一个正常的请求经过GFW之后,GFW通过分析流量特征达到干扰的目的,但是SS经过GFW的数据是加密后的正常TCP包,没有明显特征码所以无法对通讯数据解密,因此不会受到干扰。
shadowsocks源码
shadowsocks有Python版和Go版,这里只介绍Python版。
# shadowsocks源码结构
|...
├── shadowsocks
│ ├── asyncdns.py
│ ├── common.py
│ ├── crypto
│ │ ├── ....
│ ├── daemon.py
│ ├── encrypt.py
│ ├── eventloop.py
│ ├── __init__.py
│ ├── local.py
│ ├── lru_cache.py
│ ├── manager.py
│ ├── server.py
│ ├── shell.py
│ ├── tcprelay.py
│ └── udprelay.py
|...
其中主要包括 eventloop.py、tcprelay.py、udprelay.py、asyncdns.py模块。这里主要介绍TCP模式。
程序的入口可以从server.py开始看,主要工作流程是:先读取配置项,对需要监听的端口分别建立tcprelay.TCPRelay和udprelay.UDPRelay,TCPRelay和UDPRelay类会创建一个socket对端口进行监听。然后将这两个对象加入到eventloop.EventLoop里。然后启动eventloop.EventLoop循环,当eventloop.EventLoop接收到事件时,会调用相应的handle_event进行处理。
大致运行流程就是这样,后面还会针对各个模块的具体流程进行详细地分析。