一、前言
1瓮具、SOCKS名稱來源荧飞。
該協(xié)議設(shè)計之初是為了讓有權(quán)限的用戶可以穿過過防火墻的限制凡人,使得高權(quán)限用戶可以訪問一般用戶不能訪問的外部資源。當時設(shè)計者考慮到幾乎所有使用TCP/IP通信的應(yīng)用軟件都使用socket(套接字叹阔,實際上是一組應(yīng)用程序接口)完成底層的數(shù)據(jù)通信挠轴。為了方便軟件開發(fā)者使用該協(xié)議,協(xié)議設(shè)計者就刻意對應(yīng)了幾組socket編程最經(jīng)典的操作耳幢,并且將協(xié)議定名為SOCKS岸晦。
2、SOCKS版本睛藻。
這個協(xié)議最初由David Koblas開發(fā)启上,而后由NEC的Ying-Da Lee將其擴展到版本4,最新協(xié)議是版本5店印,與前一版本相比冈在,SOCKS5做了以下增強:
- 增加對UDP協(xié)議的支持;
- 支持多種用戶身份驗證方式和通信加密方式按摘;
- 修改了socks服務(wù)器進行域名解析的方法包券,使其更加優(yōu)雅;
3院峡、SOCKS網(wǎng)絡(luò)代理層次兴使。
SOCKS是一種網(wǎng)絡(luò)傳輸協(xié)議,主要用于客戶端與外網(wǎng)服務(wù)器之間通訊的中間傳遞照激。根據(jù)OSI七層模型來劃分,SOCKS屬于會話層協(xié)議盹牧,位于表示層與傳輸層之間俩垃。
4、SOCKS軟件部署架構(gòu)汰寓。
SOCKS實際分為了客戶端和服務(wù)端來共同協(xié)作完成代理目標口柳。在客戶端進行socket網(wǎng)絡(luò)編程時,SOCKS提供了一套和傳統(tǒng)socket接口(socket,listen,bind等)一致的接口SDK供應(yīng)用層調(diào)用有滑,這類軟件最著名的莫過于SocksCap32了跃闹,它是Permeo公司早期推出的一款產(chǎn)品,后來又提供了Permeo Security Driver(稱為PSD)SDK毛好。在服務(wù)端通常是提供一個服務(wù)器提供SOCKS代理服務(wù)望艺,一般監(jiān)聽1080端口。用戶將客戶端的請求和流量代理到目的服務(wù)器肌访,常見的SOCKS服務(wù)像shadowsock等找默。
二、SOCKS代理流程
上圖中是socks代理的簡單流程吼驶。
客戶端和SOCKS代理服務(wù)器建立TCP三次握手連接惩激。這里需要說明的是不管客戶端是希望和target服務(wù)器建立TCP連接還是UDP連接店煞,客戶端都需要先和SOCKS代理服務(wù)器建立TCP連接。
在和SOCKS代理服務(wù)器建立連接后风钻,開始進行身份認證顷蟀,目前比較常用的或者說在SOCKS服務(wù)器上實現(xiàn)較多的是無身份驗證和用戶名/密碼這兩種方式。
身份驗證通過后骡技,客戶端開始請求SOCKS服務(wù)器相應(yīng)的代理命令鸣个,目前SOCKS5協(xié)議規(guī)定了三種代理命令(connect,bind哮兰,udp)毛萌。
SOCKS代理服務(wù)器依據(jù)客戶端請求的命令執(zhí)行相應(yīng)的代理模式,并與target服務(wù)器建立連接喝滞。
接下來客戶端開始像正常的網(wǎng)絡(luò)收發(fā)包一樣開始進行網(wǎng)絡(luò)通信阁将。
三、SOCKS協(xié)議
階段一:TCP請求
這里省略tcp三次握手建立連接的過程右遭,因為這部分不屬于協(xié)議部分做盅。
階段二:認證過程
在與SOCKS代理服務(wù)器建立tcp連接后客戶端開始發(fā)起認證過程,這個過程中會和服務(wù)器協(xié)商認證方式窘哈。
1吹榴、客戶端請求認證
VERSION | METHODS_COUNT | METHODS |
---|---|---|
1字節(jié) | 1字節(jié) | 1到255字節(jié),長度由METHODS_COUNT值決定 |
0x05 | 0x03 | 0x00 0x01 0x02 |
- VERSION SOCKS協(xié)議版本滚婉,目前固定0x05
- METHODS_COUNT 客戶端支持的認證方法數(shù)量
- METHODS… 客戶端支持的認證方法疟游,每個方法占用1個字節(jié)
METHOD定義
- 0x00 不需要認證(常用)
- 0x01 GSSAPI認證
- 0x02 賬號密碼認證(常用)
- 0x03 - 0x7F IANA分配
- 0x80 - 0xFE 私有方法保留
- 0xFF 無支持的認證方法
2、服務(wù)器返回選定的認證方法
a吵护、無需認證
VERSION | METHOD |
---|---|
1字節(jié) | 1字節(jié) |
0x05 | 0x00 |
b列赎、賬號密碼認證
VERSION | METHOD |
---|---|
1字節(jié) | 1字節(jié) |
0x05 | 0x02 |
- VERSION SOCKS協(xié)議版本,目前固定0x05
- METHOD 本次連接所用的認證方法骇窍,0x00無需認證瓜晤,0x02賬號密碼認證
3、如果為賬號密碼認證客戶端再次發(fā)送賬密密碼進行認證
VERSION | USERNAME_LENGTH | USERNAME | PASSWORD_LENGTH | PASSWORD |
---|---|---|---|---|
1字節(jié) | 1字節(jié) | 1-255字節(jié) | 1字節(jié) | 1-255字節(jié) |
0x01 | 0x01 | 0x0a | 0x01 | 0x0a |
- VERSION 認證子協(xié)商版本(與SOCKS協(xié)議版本的0x05無關(guān)系)
- USERNAME_LENGTH 用戶名長度
- USERNAME 用戶名字節(jié)數(shù)組腹纳,長度為USERNAME_LENGTH
- PASSWORD_LENGTH 密碼長度
- PASSWORD 密碼字節(jié)數(shù)組痢掠,長度為PASSWORD_LENGTH
4、服務(wù)器響應(yīng)賬號密碼認證結(jié)果
VERSION | STATUS |
---|---|
1字節(jié) | 1字節(jié) |
- VERSION 認證子協(xié)商版本嘲恍,與客戶端VERSION字段一致
- STATUS 認證結(jié)果(0x00 認證成功大于0x00 認證失斪慊)
階段三:命令過程
在客戶端和SOCKS代理服務(wù)器身份認證階段結(jié)束后,客戶端開始向代理服務(wù)器發(fā)送命令協(xié)議蛔钙,指示代理服務(wù)器接下來啟用何種代理模式(TCP/UDP)锌云。這里SOCKS5協(xié)議中規(guī)定了三種命令,分別是CONNECT吁脱,BIND桑涎,UDP ASSOCIATE彬向。
1、客戶端發(fā)起命令請求
VERSION | COMMAND | RSV | ADDRESS_TYPE | DST.ADDR | DST.PORT |
---|---|---|---|---|---|
1字節(jié) | 1字節(jié) | 1字節(jié) | 1字節(jié) | 1-255字節(jié) | 2字節(jié) |
- VERSION SOCKS協(xié)議版本攻冷,固定0x05
-
COMMAND 命令
- 0x01 CONNECT 連接目標服務(wù)器
- 0x02 BIND 綁定娃胆,客戶端會接收來自代理服務(wù)器的鏈接,也就是說告訴代理服務(wù)器創(chuàng)建socket等曼,監(jiān)聽來自目標機器的連接里烦。像FTP服務(wù)器這種主動連接客戶端的應(yīng)用場景。
- 0x03 UDP ASSOCIATE UDP中繼
- RSV 保留字段
-
ADDRESS_TYPE 目標服務(wù)器地址類型
- 0x01 IP V4地址
- 0x03 域名地址(沒有打錯禁谦,就是沒有0x02)胁黑,域名地址的第1個字節(jié)為域名長度,剩下字節(jié)為域名名稱字節(jié)數(shù)組
- 0x04 IP V6地址
- DST.ADDR ip地址
- DST.PORT 端口號
說明:這里的DST.ADDR和DST.PORT在COMMAND不同時有不用的表示
- CONNECT 希望連接的target服務(wù)器ip地址和端口號
- BIND 希望連接的target服務(wù)器ip地址和端口號
- UDP ASSOCIATE 客戶端本地使用的ip地址和端口號州泊,代理服務(wù)器可以用這個信息對訪問進行一些限制丧蘸。
2、代理服務(wù)器響應(yīng)
VERSION | RESPONSE | RSV | ADDRESS_TYPE | BND.ADDR | BND.PORT |
---|---|---|---|---|---|
1字節(jié) | 1字節(jié) | 1字節(jié) | 1字節(jié) | 1-255字節(jié) | 2字節(jié) |
- VERSION SOCKS協(xié)議版本遥皂,固定0x05
-
RESPONSE 響應(yīng)命令
- 0x00 代理服務(wù)器連接目標服務(wù)器成功
- 0x01 代理服務(wù)器故障
- 0x02 代理服務(wù)器規(guī)則集不允許連接
- 0x03 網(wǎng)絡(luò)無法訪問
- 0x04 目標服務(wù)器無法訪問(主機名無效)
- 0x05 連接目標服務(wù)器被拒絕
- 0x06 TTL已過期
- 0x07 不支持的命令
- 0x08 不支持的目標服務(wù)器地址類型
- 0x09 - 0xFF 未分配
- RSV 保留字段
- BND.ADDR 代理服務(wù)器連接目標服務(wù)器成功后的代理服務(wù)器IP
- BND.PORT 代理服務(wù)器連接目標服務(wù)器成功后的代理服務(wù)器端口
說明:這里的DST.ADDR和DST.PORT在COMMAND不同時有不用的表示
- CONNECT 此時綁定的地址是指代理服務(wù)器連接到目標機器時的ip和端口
- BIND 這里有兩次響應(yīng)
- 第一次響應(yīng)中是指代理服務(wù)器創(chuàng)建監(jiān)聽socket時綁定的ip和端口
- 第二次響應(yīng)中是指代理服務(wù)器監(jiān)聽的scoket收來自目標機器連接時的ip和端口
- UDP ASSOCIATE 此時綁定地址指明了客戶發(fā)送UDP消息至服務(wù)器的端口和地址力喷。
階段四:數(shù)據(jù)轉(zhuǎn)發(fā)
這里如果代理的是tcp連接則直接轉(zhuǎn)發(fā)tcp數(shù)據(jù)。如果代理的是udp數(shù)據(jù)客戶端和代理服務(wù)器之間需要對原始UDP數(shù)據(jù)包進行包裝之后再進行轉(zhuǎn)發(fā)演训。
RSV | FRAG | ATYP | DST.ADDR | DST.PORT | DATA |
---|---|---|---|---|---|
2字節(jié) | 1字節(jié) | 1字節(jié) | 1-255字節(jié) | 2字節(jié) | variable |
- RSV 保留字段
- FRAG 包編號
- ATYP 目標服務(wù)器地址類型
- 0x01 IP V4地址
- 0x03 域名地址(沒有打錯弟孟,就是沒有0x02),域名地址的第1個字節(jié)為域名長度样悟,剩下字節(jié)為域名名稱字節(jié)數(shù)組
- 0x04 IP V6地址
- DST.ADDR 目標服務(wù)器地址
- DST.PORT 目標服務(wù)器端口
- DATA 用戶數(shù)據(jù)
四拂募、實例分析
在本實例中演示UDP代理過程及其中抓包過程。
UDP服務(wù):127.0.0.1:19999(每收到一個請求包返回一個this is udp server的字符串給客戶端)
SOCKS代理服務(wù):127.0.0.1:1080
階段一:TCP請求窟她。
編號489,490,491没讲。客戶端127.0.0.1:26551請求到127.0.0.1:1080的TCP三次握手協(xié)議礁苗。
階段二:認證過程。
1徙缴、編號492试伙。客戶端發(fā)起認證請求于样。版本為0x05疏叨,客戶端認證方法總數(shù)為0x01,認證方式0x00不認證穿剖。編號493為TCP的ACK確認包蚤蔓。
2、編號494糊余。代理服務(wù)器回復(fù)請求版本為0x05秀又,認證方式確認為0x00不認證单寂。編號495為TCP確認包。
階段三:命令過程
1吐辙、編號496.客戶端向代理服務(wù)器發(fā)送命令請求包版本為0x05宣决,命令字為0x03(udp associate)客戶端的IP端口號為127.0.0.1:60842。編號497為TCP請求確認包昏苏。
2尊沸、編號498。代理服務(wù)器向客戶端回復(fù)確認包贤惯,版本為0x05洼专,狀態(tài)為0x00成功,代理服務(wù)器的開啟的UDP地址為127.0.0.1:60843孵构。編號499為TCP確認包屁商。
階段四:數(shù)據(jù)轉(zhuǎn)發(fā)
1、編號500為客戶端向代理服務(wù)器發(fā)送UDP數(shù)據(jù)報文浦译,客戶端地址127.0.0.1:60842棒假,服務(wù)器地址127.0.0.1:60843。包裝過的udp載荷中reserve保留字段0x00精盅,fragment 0x00帽哑,address type ipv4,要連接的遠端服務(wù)器地址端口為127.0.0.1:19999叹俏,發(fā)送的數(shù)據(jù)為“some data”妻枕。
2、編號501為代理服務(wù)器127.0.0.1:60843向遠端udp服務(wù)器127.0.0.1:19999發(fā)送數(shù)據(jù)包常規(guī)UDP數(shù)據(jù)包粘驰。
3屡谐、編號502位遠端UDP服務(wù)器127.0.0.1:19999向代理服務(wù)器127.0.0.1:60843返回數(shù)據(jù),返回“this is udp server”蝌数。
4愕掏、編號503為代理服務(wù)器127.0.0.1:60843向客戶端127.0.0.1:60842轉(zhuǎn)發(fā)遠端服務(wù)器的返回數(shù)據(jù),包裝過的udp載荷中reserve保留字段0x00顶伞,fragment 0x00饵撑,address type ipv4,遠端服務(wù)器地址端口為127.0.0.1:19999唆貌,發(fā)送的數(shù)據(jù)為“this is udp server”滑潘。
五、引用
https://www.rfc-editor.org/rfc/rfc1928.txt