用C#實現SOCKS5代理服務(源碼公開)
早上,逛園子時看到breeze寫了一篇Socks5代理協議的文章《C# 實現Socket5代理協議通訊 》,並在評論里看到howaaa說“順便也講講用C#實現一個Socks5代理服務器吧,這方面資料很少,相信很有價值”,於是一時興起,花了一個下午的時間搗鼓出Socks5代理的服務端程序。程序很簡單(只要弄懂了Socks5協議就基本明白了)、代碼很零亂。有興趣的可以看看,沒興趣的就飄過吧,嘿嘿....
在breeze的文章中少了一個密碼身份驗證的講解,在這里我補一下。
============================================================================================
當客戶端與Socks5代理服務器連接上並進行握手時,客戶端將會發送以下格式的握手報文:
版本號(1字節) | 認證方法數(1字節) | 認證方法序列(1-255個字節長度)
比如報文(假如為V5版本):
0x05 0x01 0x00 則表示客戶端只支持一種(0x1)認證方法0x00 (無驗證需求)
0x05 0x01 0x02 則表示客戶端只支持一種(0x01)認證方法0x02(用戶名/密碼 驗證)
0x05 0x02 0x00 0x02 則表示客戶端支持兩種(0x02)認證方法“0x00與0x02”
其中Socks5協議定義了以下幾種認證方法:
0x00 無驗證需求
0x01 通用安全服務應用程序接口(GSSAPI)
0x02 用戶名/密碼(USERNAME/PASSWORD)
0x03 至 X'7F' IANA 分配(IANA ASSIGNED)
0x80 至 X'FE' 私人方法保留(RESERVED FOR PRIVATE METHODS)
0xFF 無可接受方法(NO ACCEPTABLE METHODS)
在這里,我們要詳解了解的則是“0x02 用戶名/密碼”驗證的過程。
當客戶端發送帶有0x02認證方法的報文(如:“0x05 0x01 0x02”)到服務端時,根據報文,服務端得知客戶端支持用戶名/密碼認證(0x02),因此如果服務端需要驗證,則發送“0x05 0x02”應答,這樣客戶端將會進入“用戶名/密碼”驗證過程。
“0x02 用戶名/密碼”驗證協議的報文格式是:
0x01 | 用戶名長度(1字節)| 用戶名(長度根據用戶名長度域指定) | 口令長度(1字節) | 口令(長度由口令長度域指定)
所以報文的長度是根據用戶名與密碼的長度而定,比如以下報文:
0x01 0x02 0x41 0x42 0x02 0x43 0x43
則表示發送用戶名為“AB”密碼為“CC”的驗證報文。
服務端接收到用戶名/密碼驗證報文后進行相應處理並返回以下格式的應答報文:
0x01 | 驗證結果標志
如果驗證通過則“驗證結果標志”的值為“0x00”,否則其它值都表示驗證失敗!不允許再進行下一步的操作。
當握手與身份驗證過程都通過后,將進入“連接請求”過程,在這步中服務端應該需要對客戶端發送過來的遠程服務端地址進行連接狀態檢查的,但在我這個程序中,我偷了懶沒做,簡單的就去后面的“連接”會話過程了,嘿嘿。
源代碼下載:
http://files.cnblogs.com/kingthy/Socks5Server.rar
此程序用QQ與迅雷測試過,基本都能正常運行。。。
分類: C#
標簽: Socket5
本文轉自Kingthy博客園博客,原文鏈接:http://www.cnblogs.com/kingthy/archive/2008/10/22/1317132.html,如需轉載請自行聯系原作者