# README
socks5
socks5 protocol
Auth
认证流程
client ---> server
客户端发送请求确认版本和请求方式,单位字节
+-------------------------+
| VER | NMETHODS | METHODS|
+-------------------------+
| 1 | 1 | 1-255 |
+-------------------------+
- VER: socks 的版本,这里应该是
0x05
- NMETHODS: METHODS 部分的长度,取值范围 1~255
- METHODS: 客户端支持的认证方式列表,每个方法占1字节,支持的认证方式有
0x00
: 不需要认证0x01
: GSSAPI0x02
: 用户名,密码认证0x03
-0x7F
: 保留,有 IANA 分配0x80
-0xFE
: 自定义,私人方法0xFF
: 无可接受的的方法
server ---> client
服务器端返回支持的方法,单位字节
+--------------+
| VER | METHOD |
+--------------+
| 1 | 1 |
+--------------+
- VER: socks 的版本,这里应该是
0x05
- METHOD: 服务端选中的方法。如果返回
0xFF
表示没有选中任何方法,客户端需要关闭连接。
Connect
认证结束之后,客户端发送请求信息
client ---> server
+---------------------------------------------------+
| VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT |
+---------------------------------------------------+
| 1 | 1 | 1 | 1 | (dynamic) | 2 |
+---------------------------------------------------+
- VER: socks 的版本,这里应该是
0x05
- CMD: sock 的命令码
0x01
: 表示 CONNECT 请求0x02
: 表示 BIND 请求0x03
: 表示 UDP 转发
- RSV: 保留,固定
0x00
- ATYP: DST.ADDR 的地址类型
0x01
: IPv4 地址,DST.ADDR 部分4字节长度0x03
: DST.ADDR 部分第一个字节为域名长度,DST.ADDR 剩余部分内容为域名,没有\0
的结束符0x04
: IPv6 地址,DST.ADDR 部分16字节长度
- DST.ADDR 目的地址
- DST.PORT 目的端口
server ---> client
+---------------------------------------------------+
| VER | REP | RSV | ATYP | DST.ADDR | DST.PORT |
+---------------------------------------------------+
| 1 | 1 | 1 | 1 | (dynamic) | 2 |
+---------------------------------------------------+
- VER: socks 的版本,这里应该是
0x05
- REP: 应答字段,表示请求状态
0x00
: 表示成功0x01
: 表示 SOCKS 服务器连接失败0x02
: 表示现有规则不允许连接0x03
: 表示网络不可达0x04
: 表示主机不可达0x05
: 表示连接被拒0x06
: 表示TTL超时0x07
: 表示不支持的命令0x08
: 表示不支持的地址类型0x09
-0xFF
: 未定义
- RSV: 保留,固定
0x00
- ATYP: DST.ADDR 的地址类型
0x01
: IPv4 地址,DST.ADDR 部分4字节长度0x03
: DST.ADDR 部分第一个字节为域名长度,DST.ADDR 剩余部分内容为域名,没有\0
的结束符0x04
: IPv6 地址,DST.ADDR 部分16字节长度
- DST.ADDR 服务器绑定的地址
- DST.PORT 服务器绑定的端口
Forward
端口转发
UserAuth
使用用户名密码的方式进行用户认证
client ---> server
+--------------------------------------------------------------------+
| VER | username length | username | password length | password |
+--------------------------------------------------------------------+
| 1 | 1 | (dynamic) | 1 | (dynamic) |
+--------------------------------------------------------------------+
- VER: 鉴定协议版本,目前为
0x01
- username length: 用户名长度
- username: 用户名
- password length: 密码长度
- password: 密码
server ---> client
+--------------+
| VER | STATUS |
+--------------+
| 1 | 1 |
+--------------+
- VER: 鉴定协议版本,目前为
0x01
- STATUS: 鉴定状态
0x00
: 表示成功0x01
: 表示失败
TODO
- kcp with encrypt
- 同时加密的情况下,key 或者 salt 不匹配的话,server 都是拿不到结果的哟,就是说 listener.Accept 无法解密拿到连接
- 就算是 server 端不加密,client 使用加密算法,或者直接使用 nc 或其他方式创建 udp 连接发送数据也是接收不到的,因为 kcp 是特有的协议,有自己的协议头解析规则
- 所以,首先是需要加密或者不加密,以及加密方式保持一致,然后密钥和盐保持一致,才能正确的互通互联。
- kcp with encrypt and socks5
- 直接替换接口,模块划分的很好
- 如何处理低延迟高丢包的网络情况
- http with socket proxy
- HTTP proxy implement
- study shadowsocks
- DNS
socks4
socks4 protocol
Connect
客户端直接发送请求信息,包括目的地址信息
client ---> server
+----+----+----+----+----+----+----+----+----+----+....+----+
| VN | CD | DSTPORT | DSTIP | USERID |NULL|
+----+----+----+----+----+----+----+----+----+----+....+----+
| 1 | 1 | 2 | 4 | variable | 1 |
+----+----+---------+-------------------+---------+....+----+
- VN: socks 的版本(SOCKS protocol version number),这里应该是
0x04
- CD: socks 操作命令(SOCKS command code)
0x01
: 表示 CONNECT 请求0x02
: 表示 BIND 请求
- DSTPORT: 目的端口
- DSTIP: 目的地址
- USERID: 用户id
- NULL: 终止符,这里应该是
0x00
server --> client
+----+----+----+----+----+----+----+----+
| VN | CD | DSTPORT | DSTIP |
+----+----+----+----+----+----+----+----+
| 1 | 1 | 2 | 4 |
+----+----+---------+-------------------+
- VER: socks 的版本,这里应该是
0x04
- REP: 应答字段,表示请求状态
0x5a
: (90)表示请求得到允许;0x5b
: (91)表示请求被拒绝或失败;0x5c
: (92)表示由于SOCKS服务器无法连接到客户端的identd(一个验证身份的进程),请求被拒绝;0x5d
: (93)表示客户端程序与identd报告的用户身份不同,连接被拒绝。
- DSTPORT: 服务器绑定的地址,但被忽略。
- DSTIP: 服务器绑定的端口,但被忽略。
SOCKS4a
其实是和 socks4 基本一样的,只是多了请求域名的简单扩展。
+----+----+----+----+----+----+----+----+----+----+....+----+----------+----+
| VN | CD | DSTPORT | DSTIP | USERID |NULL| HOSTNAME |NULL|
+----+----+----+----+----+----+----+----+----+----+....+----+----------+----+
| 1 | 1 | 2 | 4 | variable | 1 | variable | 1 |
+----+----+---------+-------------------+---------+....+----+----------+----+