之前编写的一个基于openfire服务器的即时通讯软件,因为部署环境需要,需要增加代理登录通信的实现。整理了一下相关代理的知识分享一下。

  一个基于TCP协议的客户端希望与一个只能通过特定网络节点才可以联通的目标建立通讯时,它必须在该节点搭建代理,先建立一个与SOCKS服务器上端口的TCP连接(TCP端口可以是1080)。当连接建立后,客户端和代理服务器进入协议的“握手(negotiation)”过程,握手通过过后,这时就建立了客户端和代理之间的连接。完成握手后代理可以看作一个透明的网络,向代理发送真正的请求协议即可实现代理请求。

  整个代理过程主要分两个重要的阶段“协议握手”、“代理请求”,代理请求由代理服务器上的代理服务处理,现在有很多成熟的代理软件,选一个即可。我们主要实现的是基于代理软件的连接,或者说是实现基于SOCKS V5协议的连接过程(应用是代理IM的通信),所以主要实践“协议握手(negotiation)”。

协议握手的过程:

  1. 连接代理服务器.
  2. 发送请求商定版本和认证方式。
  3. 请求认证。

客户端连到服务器后,然后就发送请求来协商版本和认证方法〔格式见下〕:

VER

NMETHODS

METHODS

1

1

1 to 255

  SOCKS v5协议中,VER字段被设置成X'05'。NMETHODS字段包含了在METHODS字段中出现的方法标示的数目(以字节为单位)。 我们发送请求商定版本和认证方式后(发送05 01 00),服务器从给定的方法中选择一个并发送一个方法选中的消息回客户端〔格式见下〕

VER

METHOD

1

1

返回的消息中如果是X’FF’,这表示客户端所列出的方法列表中没有一个方法被选中,客户端必须关闭连接。我们需要关注的第二位的消息内容,返回的消息是05 00或者05 02(00 忽略验证 ;02 进行用户验证)。

下面我们要了解的则是“0x02 用户名/密码”验证的过程。

  当客户端发送带有0x02认证方法的报文(如:“0x05 0x01 0x02”)到服务端时,根据报文,服务端得知客户端支持用户名/密码认证(0x02),因此如果服务端需要验证,则发送“0x05 0x02”应答,这样客户端将会进入“用户名/密码”验证过程。

“0x02 用户名/密码”验证协议的报文格式是:

0x01 | 用户名长度(1字节)| 用户名(长度根据用户名长度域指定) | 口令长度(1字节) | 口令(长度由口令长度域指定)

所以报文的长度是根据用户名与密码的长度而定,比如以下报文:

0x01 0x02 0x41 0x42 0x02 0x43 0x43

则表示发送用户名为“AB”密码为“CC”的验证报文。

服务端接收到用户名/密码验证报文后进行相应处理并返回以下格式的应答报文:

0x01 | 验证结果标志

  验证过程结束后,客户端就发送详细的请求信息。如果协商的方法中有以完整性检查和/或安全性为目的的封装,这些请求必须按照该方法所定义的方式进行封装。
协议握手完成之后,就需要发送一个请求连接,这个连接即是对远程服务器的连接,因为现在我们直连的是代理服务器,所以需要告诉代理服务器,我们要连接xxx地址。

请求的格式如下:

VER

CMD

RSV

ATYP

DST.ADDR

DST.PROT

1

1

X’00’

1

Variable

2

注:
· VER 协议版本: X’05’
· CMD
· CONNECT:X’01’
· BIND:X’02’
· UDP ASSOCIATE:X’03’
· RSV 保留
· ATYP 后面的地址类型
· IPV4:X’01’
· 域名:X’03’
· IPV6:X’04’'
· DST.ADDR 目的地址
· DST.PORT 以网络字节顺序出现的端口号

ATYP字段中描述了地址字段(DST.ADDR,BND.ADDR)所包含的地址类型:
X'01':基于IPV4的IP地址,4个字节长;

X'03':基于域名的地址,地址字段中的第一字节是以字节为单位的该域名的长度,没有结尾的NUL字节;·

X'04':基于IPV6的IP地址,16个字节长。
Variable:表示该域的长度是可变的。

代理服务器这边会根据请求内容返回特定格式的消息(如下格式)。

VER

REP

RSV

ATYP

BND.ADDR

BND.PORT

1

1

X’00’

1

Variable

2

注:标识为RSV的字段必须设为X’00’。
VER 协议版本: X’05’
 REP 应答字段:
 X’00’ 成功
 X’01’ 普通的SOCKS服务器请求失败
 X’02’ 现有的规则不允许的连接
 X’03’ 网络不可达
 X’04’ 主机不可达
 X’05’ 连接被拒
 X’06’ TTL超时
 X’07’ 不支持的命令
 X’08’ 不支持的地址类型
 X’09’ – X’FF’ 未定义
 RSV 保留
 ATYP 后面的地址类型
 IPV4:X’01’
 域名:X’03’
 IPV6:X’04’
 BND.ADDR 服务器绑定的地址
 BND.PORT 以网络字节顺序表示的服务器绑定的段口

返回的信息里面都看到,返回结果在第二个域,为0则表示成功。

验证请求成功后,Socket5整个TCP客户端的连接就完成了。这时候代理服务器就可以看作是一个透明的网络连接。

IM客户端Socks 5代理协议应用的更多相关文章

  1. 异步select

    server coding: #!/usr/bin/python # -*- coding: utf-8 -*- import select import socket import sys impo ...

  2. 【转载】SOCKS代理:从***到内网漫游

    原文:SOCKS代理:从***到内网漫游 本文原创作者:tahf,本文属FreeBuf原创奖励计划,未经许可禁止转载 之前在Freebuf上学习过很多大牛写的关于Tunnel.SOCKS代理.***等 ...

  3. Socks协议以及代理转发工具分析

    前言:最近两场HW都和某师傅学到了挺多东西,算是对内网不出网以及流量代理做个分析(SOCKS协议,reGeorg原理分析,frp的代理,CS上的代理 SOCKS SOCKS(Socks:Protoco ...

  4. 网络协议之:一定要大写的SOCKS

    目录 简介 SOCKS的故事 SOCKS的历史 SOCKS协议的具体内容 SOCKS4 SOCKS4a SOCKS5 总结 简介 很久很久以前,人们还穿的是草鞋,草鞋虽然穿着舒服,但是不够美观.然后人 ...

  5. 客户端Socket

    导语 java.net.Socket类是JAVA完成客户端TCP操作的基础类.其他建立TCP网络连接的类(如URL,URLConnection和EditorPane)最终会调用这个类的方法.这个类本身 ...

  6. kali 安装ss代理客户端的方法(纯属个人总结)

    1.声明版本,因为别的版本没测试过 2.下载客户端安装包 wget https://github.com/shadowsocks/shadowsocks/archive/master.zip 这个是代 ...

  7. 基于SS5服务端的Socks5客户端

    SS5停止更新已经好几年了,用作socks5代理的服务端还是比较稳定的.但是如果要使用加密账号和密码的协议,有些坑需要去填. 1.服务端的账号密码验证方式配置为“s”时,客户端进行协议验证时,需要用“ ...

  8. SOCKS 5协议详解(转)

    笔者在实际学习中,由于在有些软件用到了socks5(如oicq,icq等),对其原理不甚了解,相信很多朋友对其也不是很了解,于是仔细研读了一下rfc1928,觉得有必要译出来供大家参考. 1.介绍: ...

  9. 使用ssh正向连接、反向连接、做socks代理的方法

     ssh -L 219.143.16.157:58080:172.21.163.32:8080 用户名@localhost -p 10142  在 219.143.16.157机器执行   将ssh隧 ...

随机推荐

  1. 修改Tomcat服务器的默认端口号

    tomcat服务器的默认端口号是8080,我们也可以修改为其他端口号,并且在没有启动Apache,IIS等占用80端口的web服务时,我们也可以设置为80端口,这样在生产中域名之后就可以不带端口号了, ...

  2. Java for LeetCode 073 Set Matrix Zeroes

    Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. 解题思路: ...

  3. HDU 5745 La Vie en rose (DP||模拟) 2016杭电多校联合第二场

    题目:传送门. 这是一道阅读理解题,正解是DP,实际上模拟就能做.pij+1 指的是 (pij)+1不是 pi(j+1),判断能否交换输出即可. #include <iostream> # ...

  4. Hadoop学习:

    文件名称 格式 描述 hadoop-env.sh BaSh 脚本 记 录 脚 本 要 用 的 环 境 变 , 以 运 行Hadoop core-site.xml HadooP配XML Hadoop C ...

  5. mysql 主主复制(双主复制)+ 配置KEEPALIVED实现热备

    binlog-do-db和replicate-do-db表示需要同步的数据库 binlog-ignore-db和replicate-ignore-db表示不需要同步的数据库 云端服务器为master配 ...

  6. CI中PHP写法规范(不断更新)

    1.类名首字母大写,多个单词用下划线连接,首字母小写是无效的 举例: class CI_Model 2.routes路由配置中的右侧在配置类名和方法名的时候都是小写,如果大写可能会出现404找不到的错 ...

  7. etc目录名字的意思---挖Linux中的古老缩略语

    Unix已经有35年历史了.许多人认为它开始于中世纪,这个中世纪是相对于计算机技术的产生和发展来说的.在过去的时间里,Unix和它的子分支Linux收集有许多的历史和一些完全古老的语言.在这篇技巧文章 ...

  8. hdu 2041:超级楼梯(水题,递归)

    超级楼梯 Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s): Accepted Su ...

  9. 在JavaWeb中使用Log4j步骤

    在JavaWeb中使用Log4J指南.每次在开始写一个项目的时候都忘记Log4J如何配置.所以写个步骤,作为记录. 第一步 下载Log4J jar包 从Apache Logging Services ...

  10. 人人都可以开发高可用高伸缩应用——论Azure Service Fabric的意义

    今天推荐的文章其实是微软的一篇官方公告,宣布其即将发布的一个支撑高可用高伸缩云服务的框架--Azure Service Fabric. 前两天,微软Azure平台的CTO Mark Russinovi ...