天天看點

用C#實作SOCKS5代理服務 - 意揚

用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”,否則其它值都表示驗證失敗!不允許再進行下一步的操作。

當握手與身份驗證過程都通過後,将進入“連接配接請求”過程,在這步中服務端應該需要對用戶端發送過來的遠端服務端位址進行連接配接狀态檢查的,但在我這個程式中,我偷了懶沒做,簡單的就去後面的“連接配接”會話過程了,嘿嘿。

源代碼下載下傳:

https://files.cnblogs.com/kingthy/Socks5Server.rar

此程式用QQ與迅雷測試過,基本都能正常運作。。。