阅读:2703回复:7
关于实现ipsec的体会,欢迎讨论
上个月,为了实现windows各平台的ipsec,首先选择了2k来实现.
这之前,我从未接触driver的东西,唯一熟悉的是vc,看了一些以前的帖子,感觉应该从imd下手,于是一直忙到今天,看了大量imd的资料,对imd也有了大概的认识,本来准备就开始着手实现了,忽然发现有问题. windows 2k下(以下缺省2k),imd的层次是 protocol imd miniport 其中protocol包括了tcp/ip,ipx等. 从理论上说,ipsec是和ip同层次的协议,从实现上看,好的体系应该是ipsec接受上层协议,如tcp,udp传来的数据,需要的话加ah/esp,然后交给ip协议来传送,接受时先由ip协议处理,然后经过ipsec处理,然后交给tcp/udp. 如果要利用ndis imd来实现ipsec,由于ndis imd的位置,相当于tcp/udp ---> ip---->imd ---->miniport. 返回是相反. 问题就出在这里,imd接受的是ip包,而且imd无法利用系统原有ip的功能!!!!!!!!!!!! 于是,我今天看了一下2k自带ipsec.sys,发现它完全不是这样做的! ipsec.sys重点利用了tcpip.sys(系统的tcpip协议实现),尽管我不知道ipsec.sys内部如何实现的,但毫无疑问,它不是imd! 来在这里,而且正在,或者做过,或者要做ipsec的人很多,上面是我的体会,希望同道的人一起讨论一下. (当然,我承认imd也可以实现ipsec,但感觉是走了弯路). 我的email是wangwei@ncic.ac.cn,欢迎同道者. |
|
最新喜欢:myelan |
沙发#
发布于:2001-08-29 18:46
感觉大家在实现ipsec时,选择的都是imd(我指nt/2k下),所以我才提出这个问题.
实现ipsec最好的方案是做到tcp/upd 和 ip之间,可是windows好像没有给出接口(只是好像,因为我不知道有还是没有),如果有,就是我们作ipsec的福气了. 另:有谁了解tcpip.sys吗? 是不是可以利用这个驱动达到介入传输层和网络层之间?换句话说,介入tcp/udp 与 ip之间? 只要与这个题目有关的任何意见,兄弟都表示欢迎! |
|
板凳#
发布于:2001-08-29 20:32
我有个疑问,你看过ipsec的相关rfc文档吗?
关于ip设备,ddk文档中几乎什么都没有说。 ddk里面详细介绍的是tdi接口。 但是,一切irp都可以filter,一切system service 都可以hook。nothing is impossible。 |
|
|
地板#
发布于:2001-08-29 21:11
sorry,从未仔细看过ipsec的rfc.
不过对ipsec的框架还是比较熟的. 我的意思是,如果做ipsec,做到imd里,有点不合适,因为imd里, 在发送时,imd无法再次调用ip的功能(比如以隧道模式,需要重新 生成ip包).而接受时,无法利用ip先对接受的包进行处理(如重组). 所以imd需要具备ip的功能,然后再加上对ah&esp的处理. 至于ike当然不需要做到内核了,至于密钥协商的结果,可以通过 app&driver通讯解决. 我想知道的是,有没有一个更合适的做法来实现ipsec,使得在发送时处理的是ip发出的包,同时又可以再次调用ip的功能,而接受时处理的是ip处理过(比如重组)的包. 这样的一个程序,就可以专心实现ipsec,而不需要额外考虑ip的功能了. |
|
地下室#
发布于:2001-08-29 21:27
更正一下:第二篇里"实现ipsec最好的方案是做到tcp/upd 和 ip之间"有问题,确切的说不是介于两者之间,而是发送时位于ip之下,但是又可以调用ip功能,接受时位于ip之上,tcp/udp之下.
也就是发送时 tcp/udp -> ip ->ipsec -> ip (如果是transport模式,最好就不必走ip了,直接调用发送ip包的功能). 而接受mac -> ip ->ipsec -> tcp/udp. 如果有这种可能,那么在实现ipsec时,就根本不必考虑实现ip的功能. 这样可以省去很多麻烦. 对于driver & ndis,我完全是个新手,提出的想法可能很愚蠢,还请高手不惜赐教.谢谢先! |
|
5楼#
发布于:2001-08-30 14:06
我看有一博士论文里头是这么说的,基于方机的实施的IPSEC可以分成两类
一个是基于操作系统(OS)集成实施方案:由于IPSEC是一个网络安全协议,所以在主机实施方案中,IPSEC可以与操作系统集成在一起,将IPSEC作为网络层的一部分实现 ,IPSEC协议的实现需要IP层的服务来构造IP头信息,这与其它网络层协议(如ICMP)的实施是相同的。 另外一个是:在协议堆栈的网络层与数据链路层之间实施,作为两个协议之间的一个“楔子”使用。 我想由于WIN2K源代码不开放,所以只能用第二种方法吧,但是它原有的数据包经过加密,认证和隧道封装后会变大,这就要求实现一部分网络层的功能吧,比如分片什么的。 所以我想应该没有LEARNER想要的那种方法啦(我也是本本地想的说!) |
|
|
6楼#
发布于:2002-06-02 19:33
在rfc中有这样的论述:
“在主机上或路由器、防火墙(创建安全网关)的连接处,IPsec可以有几种实现方式。几个通常的例子: a. IPsec完全嵌入原有的IP层实现。这需要涉及IP源码和这对主机和网关要都是适用的。 b. “Bump-in-the-stack\"(BITS)实现。IPsec实现于原有IP协议栈的下部,处于原有的IP和网络设备驱动之间。在这种情况下并不需要涉及IP协议栈的源码,所以该实现方法适于遗留系统。这种方法多在主机上采用。 c. 采用外接加密处理设备是军方、金融系统常用的网络安全系统设计方案。它有时被称为“Bump-in-the-wire”(BITW)实现。这种设计方案设计来服务于主机或网关(或两者兼有)。通常这种BITW设备是可设定IP地址的。(be IP addressable)当只支持一个单独的主机时,它和BITS方案就十分相似。但作为支持一个路由器或防火墙时,它必须象个网关一样操作。“ 我想,使用IMD实现的ipsec应该属于第二种,但win2000的ipsec是属于哪一种呢? 为此我做里个试验: 1.在win2000ipsec启动的同时,启动IMD方式实现的ipsec服务, 2.结果IMD不能正常工作了。 3.把win2000的ipsec 服务停掉,IMD就正常了。 我解释不清楚这个现象。 |
|
|
7楼#
发布于:2002-06-28 11:25
我是新手,我倒是见过有人在protocol driver这一层实现ipsec,
好像和imd差不多。自己实现ip层我觉得倒不是很复杂。如果不实现icmp的话。 |
|