基于SS5服务端的客户端

Posted 国立秀才

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于SS5服务端的客户端相关的知识,希望对你有一定的参考价值。

SS5停止更新已经好几年了,用作socks5代理的服务端还是比较稳定的。但是如果要使用加密账号和密码的协议,有些坑需要去填。

1、服务端的账号密码验证方式配置为“s”时,客户端进行协议验证时,需要用“0x21”,此时服务端会提醒不存在该协议或者错误的请求。是因为服务端的代码有问题。

在服务端SS5Mod_socks5.c文件的unsigned char GetMethod(struct _SS5ClientInfo *ci )函数中,有一段判断协议的代码是这样的

      do {
        if( (node->SrcAddr == n_sa) && (node->Mask == nm) && (sp >= node->SrcRangeMin) && (sp <= node->SrcRangeMax) ) {
          if( ((node->Method == NOAUTH) && ci->NoAuth) || (((node->Method == USRPWD) || (node->Method2 == FAKEPWD)) && ci->BasicAuth)  ||((node->Method == GSSAPI) && ci->GssApiAuth) )
            return node->Method;
          if( ((node->Method2 == NOAUTH) && ci->NoAuth) || (((node->Method2 == USRPWD) || (node->Method2 == FAKEPWD)) && ci->BasicAuth) || ((node->Method2 == GSSAPI) && ci->GssApiAuth) )
            return node->Method2;
        }

 if判断时,把账号密码加密模式给丢了,其实要在里边加上  ((node->Method == S_USER_PWD) && ci->SecureBasicAuth)。

2、开发者写在“draft-supa.txt”里的《Socks 5 Secure User-Name and Password authentication protocol》,其实是有问题的。

比如发送密码交换协议时,作者是这样写的:

Now can start the Key Exchange process based of Diffie-Hellman procedure:
Client send a packet with "P", "G" and "A" to the server:
    +-----+-----+----+-----+
    | STAT|  P  | G  |  A  |
    +-----+----+-----+-----+        STAT:
       |  1  | 4   | 4  | 4   |             0x1: Request Key
     +-----+-----+----+-----+

服务端验证时,其实是这样的:

        +-----+-----+----+-----+-----+----+-----+
        | STAT| Plen| P  |Glen |  G  |Alen|  A  |  
        +-----+----+-----+-----+----+-----+-----+        STAT:
           |  1  | 4   | 4  | 4     | 4   | 4  | 4   |         0x1: Request Key
        +-----+-----+----+-----+-----+----+-----+

这不是一般的坑啊,坑大了。总之感觉作者没经过测试,就把程序放出来了。

以上是关于基于SS5服务端的客户端的主要内容,如果未能解决你的问题,请参考以下文章

基于UDP的客户端和服务器端的代码设计

docker快速搭建ss5

centos下安装SS5服务器

基于thrift的java和python分别作为客户端和服务端的调用实现

基于socket.io客户端与服务端的相互通讯

linux网络编程之用socket实现简单客户端和服务端的通信(基于UDP)