socks5是一個(gè)代理協(xié)議,主要的作用就是代理客戶端來(lái)訪問(wèn)遠(yuǎn)程服務(wù)器,起到一個(gè)中介作用。
一般情況下當(dāng)代理客戶端因?yàn)榉阑饓Φ仍蛟L問(wèn)不了遠(yuǎn)程服務(wù)器,而另一個(gè)服務(wù)器即可以訪問(wèn)遠(yuǎn)程服務(wù)器又可以被客戶端訪問(wèn)到時(shí),可以在這個(gè)服務(wù)器上部署socks5服務(wù)端,本地部署socks5客戶端,讓這個(gè)中介服務(wù)器來(lái)代理訪問(wèn)遠(yuǎn)程服務(wù)器。
下面介紹協(xié)議流程,可以簡(jiǎn)單分為握手階段,準(zhǔn)備階段和代理階段
握手階段
客戶端建立和代理服的tcp連接A,并發(fā)送第一幀數(shù)據(jù):
+----+----------+----------+
|VER | NMETHODS | METHODS |
+----+----------+----------+
| 1 | 1 | 1 to 255 |
+----+----------+----------+
VER:協(xié)議版本號(hào),socks5情況下為0x05
代理服務(wù)器收到后,會(huì)鑒別VER,回應(yīng)
+----+--------+
|VER | METHOD |
+----+--------+
| 1 | 1 |
+----+--------+
METHOD:身份驗(yàn)證方法,不需要身份驗(yàn)證時(shí)為0x00,此時(shí)直接進(jìn)入”準(zhǔn)備階段“(不為0x00時(shí),需要走身份驗(yàn)證流程,參見(jiàn)socks5身份驗(yàn)證)
準(zhǔn)備階段
客戶端發(fā)送第二幀數(shù)據(jù):
+----+-----+-------+------+----------+----------+
|VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT |
+----+-----+-------+------+----------+----------+
| 1 | 1 | X'00' | 1 | Variable | 2 |
+----+-----+-------+------+----------+----------+
CMD:命令,tcp代理0x01,udp代理0x03
RSV:保留字段
ATYP:地址類型 0x01:ipv4,0x03:域名,0x04:ipv6
DST.ADDR:目標(biāo)地址
DST.PORT:目標(biāo)端口
比如數(shù)據(jù) :0x05|0x01|0x00|0x03|0x0d7777772e62616964752e636f6d|0x01bb
代表需要代理的是tcp連接,目標(biāo)地址類型是域名,真實(shí)解析出來(lái)目標(biāo)地址就是"www.baidu.com:443",即告訴代理服,幫我和"www.baidu.com:443"作代理吧
代理服收到后,就直接建立和DST.ADDR的tcp連接B,回復(fù)
+----+-----+-------+------+----------+----------+
|VER | REP | RSV | ATYP | BND.ADDR | BND.PORT |
+----+-----+-------+------+----------+----------+
| 1 | 1 | X'00' | 1 | Variable | 2 |
+----+-----+-------+------+----------+----------+
REP:狀態(tài)位,0x00代表連接DST.ADDR成功了
RSV:保留字段
ATYP:地址類型 0x01:ipv4,0x03:域名,0x04:ipv6
BND.ADDR:綁定地址,連接B的本地地址
BND.PORT:綁定端口,連接B的本地端口
比如,返回0x05|0x00|0x00|0x01|0xc0a8c76a|0xcdf0,代表準(zhǔn)備代理成功了,進(jìn)入下一步吧
代理階段
客戶端把發(fā)給目標(biāo)服的數(shù)據(jù)由連接A發(fā)給代理服,代理服將這些數(shù)據(jù)轉(zhuǎn)由連接B發(fā)給目標(biāo)服,同時(shí)代理服收到的目標(biāo)服數(shù)據(jù)轉(zhuǎn)由連接A返回給客戶端

總結(jié)
以上是整個(gè)socks5代理的tcp代理流程的簡(jiǎn)單流程,udp代理會(huì)復(fù)雜些,后面會(huì)單獨(dú)寫(xiě)一篇,
想詳細(xì)了解的可以參照我的golang實(shí)現(xiàn)https://github.com/0990/socks5