socks5代理原理

socks5代理原理要从网络7层协议说起,SOCKS协议建立在OSI 7层模型的会话层。

网络七层协议

SOCKS5协议

SOCKS协议是Internet跟踪协议标准,作用于网络防火墙,是会话层与会话层间的安全服务方案,将内部网络与外部网络进行隔离。SOCKS协议建立在OSI 7层模型的第5层,对应用层进行过滤,第7层应用程序协议的变化,不会影响SOCKS。SOCKS协议参见rfc1928

Shadowsocks工作原理

Shadowsocks客户端与应用程序间使用SOCKS5标准建立连接,在配置浏览器代理时,选择SOCKS5协议。

浏览器使用SOCKS5格式将数据发送给Shadowsocks本地客户端,Shadowsocks本地客户端(ss-local)将数据加密,发送给远程Shadowsocks服务(ss-remote),Shadowsocks服务端(ss-remote)接收数据并解密,将数据转发给目标服务。ss-remote接收来自目标服务器的回复,加密并回传给ss-local,ss-local解密数据并传给浏览器。

Shadowsocks客户端(ss-local)在发送的加密数据流中,以目标服务器的地址开始,Shadowsocks服务端(ss-remote)以此与目标服务器建立TCP连接,并将有效数据转发给目标服务器。

Shadowsocks客户端与服务端数据传输格式:

[target address][payload]

Shadowsocks基于SOCKS5的安全拆分代理,整个交互过程如下:

client <---> ss-local <--[encrypted]--> ss-remote <---> target

Shadowsocks地址数据格式

[1-byte type][variable-length host][2-byte port]一

type:长度1字节,用来说明host数据类型;0x01:表示4字节的IPv4地址,0x03:表示host是1~255字节变长域名。0x04: 表示host是一个16字节的IPv6地址。port是个两字节的端口号。

以上是以TCP方式进行的数据传递,UDP方式基本相似,ss-local将包含目标地址和有效负载的加密数据包发送到ss-remote。

[target address][payload]

收到加密数据包后,ss-remote解密并解析目标地址,将有效数据包发送给目标服务。ss-remote从目标接收数据包,并在每个数据包的有效数据前面加上目标地址,将加密的数据包回传给ss-local。

[target address][payload]

本质上,ss-remote是在为ss-local执行网络地址转换。