這裡主要講的是用.NET實現基於Socket5下面的代理協議進行用戶端的通訊,Socket4的實現是類似的,注意的事,這裡不是講用C#實現一個Proxy 伺服器,因為實現一個Proxy 伺服器需要實現很多協議,頭大,而且現在市面上有很多現成的Proxy 伺服器用,效能又好,直接用不好嗎?而是用C#來實現用戶端通過一個Proxy 伺服器進行Socket5的通訊,這個簡單點,一般來說用Socket5就好了,Socket4現在也逐漸淘汰,基本上Proxy 伺服器都支援Socket5。
首先我們要瞭解下Socket5的代理協議是基於TCP協議之上的,從Socket4擴充上來的,用於提供給其他協議例如HTTP、FTP所作用的一套防火牆協議。
(這裡做點小解釋,實際上應該是SOCKS V5協議,但是目前網上都用Socket5這樣稱呼,目前本文也暫時這樣稱)
然後下面簡單的說下該協議的內容,具體分為兩部分:
一部分是基於TCP協議的客戶
當一個基於TCP協議的用戶端希望與一個只能通過防火牆可以到達的目標(這是由實現所決定的)建立串連,它必須先建立一個與SOCKS伺服器上SOCKS 連接埠的TCP串連。通常這個TCP連接埠是1080。當串連建立後,用戶端進入協議的“握手(negotiation)”過程:認證方式的選擇,根據選中的方式進行認證,然後發送轉寄的要求。SOCKS伺服器檢查這個要求,根據結果,或建立合適的串連,或拒絕。是不是有點像FTP?差不多。
握手的過程:
用戶端連到伺服器後,然後就發送請求來協商版本和認證方法:
VER |
NMETHODS |
METHODS |
1 |
1 |
1 to 255 |
這個版本的SOCKS協議中,VER欄位被設定成X'05'。NMETHODS欄位包含了在METHODS欄位中出現的方法標示的數目(以位元組為單位)。簡化就是像伺服器發送05 01 00
伺服器從這些給定的方法中選擇一個並發送一個方法選中的訊息回用戶端:
如果選中的訊息是X’FF’,這表示用戶端所列出的方法列表中沒有一個方法被選中,用戶端必須關閉串連。
這裡我們關注的是 X’00’ 不需要認證和X’02’ 使用者名稱/密碼,簡化是伺服器會返回的前兩個位元組
會是05 00或者05 02,02的時候進行驗證。
驗證過程結束後,用戶端就發送詳細的請求資訊。如果協商的方法中有以完整性檢查和/或安全性為目的的封裝,這些請求必須按照該方法所定義的方式進行封裝。
握手完成之後,要進行一個請求串連,這個就是對遠程伺服器的串連,我們知道當前既然串連的是Proxy 伺服器,我們實際上發送資料的對象並不是它,也就是我們要告訴Proxy 伺服器去串連真實的某某,現在就是在做這一步了。
SOCKS請求的格式如下:
VER |
CMD |
RSV |
ATYP |
DST.ADDR |
DST.PROT |
1 |
1 |
X’00’ |
1 |
Variable |
2 |