shadowsocks源码剖析
Jul 24, 2016
VPS上嗨皮的跑了那么久shadowsock的server了, 但一直比较想搞明白具体是怎么实现的. 前段时间比较忙, 最近总算有点私人时间了, 速度的强读一发shadowsocks源码
什么是shadowsocks?
- 不想再强行安利一发了, 毕竟开发者都被请去喝茶了
- 只需要知道和
G * F * W有关就好了 - 如果上面你都不知道, 说明这篇文章与你无缘, 叉掉吧
所读源码基于shadowsocks-go 1.1.5, 为什么选择golang实现版本? 我难道会告诉你, Golang的吉祥物太萌了, 我已经决定好好安利golang了. 正经点的回复, golang的语法灵活不失简洁, 棒棒哒.
终入正题
先来张图, 假装自己很专业…

流程概述:
- shadowsocks包含local和server两个程序, local运行在当前登录想要翻墙的机器上, server运行在墙外的服务器上(比如我的server运行在vultr家的VPS上)
- local监控本地1080端口, 提供socks v5协议接口, 浏览器请求和local的1080端口建立TCP连接, 首先进行local端对本机进程进行心跳检测, 然后与server端建立请求发出实际请求包(
目标的地址和端口) - 连接传输的数据通过加密,一般使用
aes-256-cfb - server端解密收到的数据, 然后与实际请求的目标ip和端口建立TCP连接, 将获取的数据写回到local端, local端最终写回到浏览器进程完成一次翻越长城.
show me your code
口说无凭, 也让人觉得云里雾里, 所以来是直接上代码吧
PS: 代码均进行了精简, 只保持核心逻辑
- 首先来看shadowsocks-local文件
|
|
最后我们来看一下 PipeThenClose这个函数的实现
|
|
- 再来看shadowsocks-server代码, 你会发现两者惊人的相似
|
|
由local和server端总共四个PipeThenClose函数完成了由local到server, 再由server到local的数据传输. 但是要注意的是在server端是没有与local进行心跳检测的阶段
socks v5
socks v5代码TCP协议的流程:
- 用户进程与监听1080端口的进程建立TCP连接
- 心跳检测, 用户进程向监听进程发送
VER, NMETHODS, METHODS, 监听进程向请求进程响应VER, METHOD - 用户进程结束心跳检测, 向监听进程发起请求, 格式如下
- 监听进程对用户进程响应, 表示成功, 则表示用户进程可以进行发送数据.
|
|