欢迎来到天天文库
浏览记录
ID:46549386
大小:95.50 KB
页数:11页
时间:2019-11-25
《OpenVPN协议解析-握手数据包分析》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、学习一种协议的最好的方式就是研究它的数据包,这样可以加深对协议的理解。对于研究过某种协议数据包的家伙来讲,他一定知道协议头的哪个位置对应哪个字段,虽然这对于理解协议为什么这么设计可能没有太人的帮助,然而对于排查问题和实际实施是很冇帮助的。既然很多人都对RichardStevens的《TCP/IP详解》情冇独钟,咱就剽窃他的风格,解析一下OpenVPN的握手是如何完成的。木文分析70余个数据包,当然,最终我会略去重复的内容,来看看OpenVPN的握手协商过程。1•分析前的解释•数据包格式本文以如下格式分析每一个握乎数据包,具体Op
2、enVPN数据包的格式,请参阅《OpenVPN协议解析■网络结构之外》:1.1.1.*文为了节省篇幅,省去了UDP以下各层的数据,直接从OpenVPN的封装开始。1/12以下为数据包格式,xx为十六进制字节:方向,分别为Server->Client和Client・>Server
3、xx
4、:操作码+keyid,1字节,xx右移5位就是操作码
5、xx
6、xx
7、xx
8、xx
9、xx
10、xx
11、xx
12、xx
13、:sessionID,这个ID是单方向的,8字节
14、xx
15、xx
16、xx
17、xx
18、xx
19、xx
20、xx
21、xx
22、1a
23、de
24、38
25、06
26、ab
27、5e
28、55
29、0f
30、
31、8f
32、ed
33、ea
34、ca
35、:数据包消息MAC,本文启用tls-auth选项,本文MAC长度20字节(使用SHA1)
36、xx
37、xx
38、xx
39、xx
40、xx
41、xx
42、xx
43、xx
44、:包id和时间戳,包括ack包的id和时间戳,在该方向每法送一个包,包id都会递增。8字节
45、xx
46、[...
47、xx
48、...]:如果ackbufferlength长度为0,没有ack信息,如果不为0,则后面包含确认的包序列号,然后追加一个对端的sessionid,变长
49、xx
50、xx
51、xx
52、xx
53、:包序列号,不包括ack包,也就是说,发送一个非PACK包,包序列号才会递增,实际
54、上如果是P_ACK包,根本就没有这一行字段。4字节1.2.TLS/SSL握手协议关于TLS/SSL握手协议,最好的资料是RFC,然后或许看OpenSSL的源码上手更快些。这里仅给出儿个图示和儿点解释,SSL握手协议包格式如2IPleaderTCPheaderSS!.recordheaderhandshakeheader7handshakedataHMAC20bytes20bytes5hytes4bytes4016or20bytes<—handshakenu'ssdge—■—^Xr—padding—"Sr—SSI.recordTC
55、PsegmentIPp56、于类世分别为:Clienthello:0x01Serverhello:0x02Certificate:0x0bServerkeyexchange:0x0cCertificaterequest:OxOdServerhellodone:OxOeCertificateverify:OxOfClientkeyexchange:0x10Finish:0x141.3.SSL握手协议和OpenVPN握手的关系我们知道,OpenVPN的连接建立使用了SSL握手协议,可是却抓不到SSL握手包,实际上SSL握手协议是作为一种载荷封装在了OpenVP57、N的协议包里面了,SSL握手协议数据实际上是写入了一块内存,然后OpenVPN从该内存中读出这些数据包,然后封装后通过reliable层发出,数据到达对端后,解封装后写入一块内存,然后SSL从内存屮读;l;SSL握手载荷,一切都是通过BIO实现的。(如不其理解,请参阅《OpenVPN协议解析■网络结构之外》)可以看出,SSL和OpenVPN属于不同的层次,SSL握于协议在OpenVPN握手协议Z上,然而当SSL握手结束后,OpenVPN的密钥协议又在SSL记录协议协议Z上,更清晰的图示如下所示:提供安全通道提供密钥ILS/SSL58、握手OpenVPN握手协议密钥交换找荷SSL记录协议ip数据报/以太帧ReliabiltyLayerOpenVPN记录协议OpenVPN^路复用/解复用协议(OVPN头);操作码^KEYIDUDP因此,OpenVPN握手协议可以将SSL握手载荷随意拆分和合并,它
56、于类世分别为:Clienthello:0x01Serverhello:0x02Certificate:0x0bServerkeyexchange:0x0cCertificaterequest:OxOdServerhellodone:OxOeCertificateverify:OxOfClientkeyexchange:0x10Finish:0x141.3.SSL握手协议和OpenVPN握手的关系我们知道,OpenVPN的连接建立使用了SSL握手协议,可是却抓不到SSL握手包,实际上SSL握手协议是作为一种载荷封装在了OpenVP
57、N的协议包里面了,SSL握手协议数据实际上是写入了一块内存,然后OpenVPN从该内存中读出这些数据包,然后封装后通过reliable层发出,数据到达对端后,解封装后写入一块内存,然后SSL从内存屮读;l;SSL握手载荷,一切都是通过BIO实现的。(如不其理解,请参阅《OpenVPN协议解析■网络结构之外》)可以看出,SSL和OpenVPN属于不同的层次,SSL握于协议在OpenVPN握手协议Z上,然而当SSL握手结束后,OpenVPN的密钥协议又在SSL记录协议协议Z上,更清晰的图示如下所示:提供安全通道提供密钥ILS/SSL
58、握手OpenVPN握手协议密钥交换找荷SSL记录协议ip数据报/以太帧ReliabiltyLayerOpenVPN记录协议OpenVPN^路复用/解复用协议(OVPN头);操作码^KEYIDUDP因此,OpenVPN握手协议可以将SSL握手载荷随意拆分和合并,它
此文档下载收益归作者所有