C#用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与迅雷测试过,基本都能健康运转。。。

相关文章