到网上查查sslvpn的实现方式,基本上都找不到。功能和需求是可以找到不少,实现方式却没有。虽然有开源的ssl-explorer,但是用java写的也没有去研究过。下面写出个人想法,望高手指正。
一、sslvpn的表现
下面列出sslvpn需要的条件:
1.只开一个端口,比如443;
2.访问被保护网页时,浏览器不得做任何设置,不得采用任何控件;
3.通过浏览器,通过web的方式访问ftp、网络邻居以及邮件应用;
4.支持tcp和udp应用;
当需求较少时,实现方式有多种选择;当需求很多时,很可能实现方式有0种选择。SSLVPN的实现方式,刚刚好,只有一种选择。研究的目的就是找出那条路来,为什么别人能想出来,自己就不能呢?(题外话)。
二、http协议之CONNECTION方法介绍
当访问https协议,并且浏览器需要采用http代理来实现时,CONNECTION方法就出现了。一个实现了connection方法的http代理,不仅能够代理网页,也能建立一条TCP隧道。那UDP怎么办呢?可以将他转换为TCP来通过此隧道。
三、实现sslvpn
1.服务必须打开一个端口,确切说是SSL握手的端口,设定为443;那么我们的sslvpn服务一开始就打开此端口,并用他来等待客户的握手(客户是浏览器或者是控件(java小程序和ocx控件,这里统称控件,下同);
2.一般sslvpn会提供一个https的登录界面让用户登录,登录后访问各种服务。握完手该干嘛呢,有下面几种情况:
A)用户访问SSLVPN的管理网页;
此时,握手完毕后读取客户端数据,会得到http消息,SSLVPN需要区分它是管理网页还是其他应用,如何区分呢?请看B)和C);
收到请求本地的http消息之后,此时就需要一个自己实现的httpd程序了。只是这个httpd程序不是去监听端口接受数据,而是直接分析数据给用户以相应(通过ssl)。
B)用户访问SSLVPN保护的网页;
用户登录SSLVPN之后,他能看到他能访问的应用。为了保证用户点击链接后,数据能够传给SSLVPN,返回给他的链接必须指向SSLVPN。并且,此链接信息中必须包含是什么应用,比如用户能访问http://192.168.1.200/a.html,给他的数据必须是:https://sslvpnhost:443/app=http&host=192.168.1.200&port=80/a.html。这时,用户点击此链接,SSLVPN才能收到数据,并能知道他要访问的服务。SSLVPN分析app=http&host=192.168.1.200&port=80/a.html,构造一个http消息,比如:
GET /a.html HTTP/1.1
Host:192.168.1.200
……
发送给192.168.1.200,接受数据后通过SSL返回给客户浏览器。
C)用户访问SSL保护的FTP、网络邻居以及邮件等;
此时,用户看到的链接应该是这样的:https://sslvpnhost:443/app=ftp&host=192.168.1.200&port=21/pwd=xxxx&cmd=XXX
当他点击此链接后,SSLVPN会收到/app=ftp&host=192.168.1.200&port=21/pwd=xxxx&cmd=XXX信息,此信息明确告诉SSLVPN要访问的服务,服务的地址和端口,以及应用协议相关的命令。这时SSLVPN与目标服务建立链接,并且构造一个应用数据包发送过去,接受到响应后,将数据改写成为html格式的http消息发送给客户浏览器。
D)用户访问SSLVPN保护的tcp和udp服务;
这种CS应用,客户端浏览器必须运行控件。用户访问此控件所提供的端口。此控件用来与sslvpn的443端口握手,握手后,发送一条CONNECT 消息给SSLVPN,此消息包含了目的地址和端口,以及是tcp还是udp。如果是udp,控件需要打开一个本地的udp端口,接受到数据后以tcp方式发送给SSLVPN(通过ssl)。
SSLVPN收到CONNECTION后,知道了用户在运行CS应用。它提取CONNECTION消息中的目的地址和端口号进行链接,并转发消息。如果是UDP应用,他得将收到的TCP数据以UDP的方式发送出去。
[ 本帖最后由 forxy 于 2007-3-20 13:26 编辑 ]
sslvpn.rar
Ronaldo9_8 回复于:2007-03-21 14:16:47
最近正好在做一个VPN的项目,下载研究一下。
不知道楼主对OpenURL有没有研究?
forxy 回复于:2007-03-21 23:48:05
好东西,大致浏览了下文档,感觉可以解决我的app=http&host=192.168.1.200&port=80/a.html看起来比较丑陋的问题。
cosmonaut 回复于:2007-03-30 10:07:15
請問在 linux 上編譯可以嗎 ?
需要哪些開發用套件?
小弟一直編譯不過
forxy 回复于:2007-04-01 15:47:57
我只把源码发了,没有发的包括:openssl头文件和库,服务证书和私钥,make文件
windows和linux应该都能编译
forxy 回复于:2007-04-01 16:01:21
http返回内容改写比较麻烦,有的http消息还是压缩的,。。。。。。
[ 本帖最后由 forxy 于 2007-4-6 20:12 编辑 ]
hongfengyue 回复于:2007-04-01 17:54:23
谢谢,看看先
force_eagle 回复于:2007-04-05 10:21:11
讲的很精辟!
forxy 回复于:2007-04-07 21:04:33
对于返回给用户的html数据,需要改写其中链接,使得用户点击时将数据发送到sslvpn,,,,改写html可能很复杂。不知道有没有开源现成的?
forxy 回复于:2007-05-10 18:52:15
需要实现的东西我都想好了:
1.实现一个ssl的httpd,并且支持cgi,并且再加上connect方法支持(apache的源码居然都有!);
2.url替换采用cgi方式来做,并且替换也有现成的源码不过是java的,看了看sslexplorer,有个replacement的web访问,就是我所说的url替换。不过还没弄懂sslexplorer中的其他web访问是个啥意思(web tunnel知道,就是connect方法,把它当作一般的CS来看);
|