learner
驱动牛犊
驱动牛犊
  • 注册日期2001-07-27
  • 最后登录2001-12-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2614回复:7

关于实现ipsec的体会,欢迎讨论

楼主#
更多 发布于:2001-08-29 18:25
上个月,为了实现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,欢迎同道者.

最新喜欢:

myelanmyelan
learner
驱动牛犊
驱动牛犊
  • 注册日期2001-07-27
  • 最后登录2001-12-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2001-08-29 18:46
感觉大家在实现ipsec时,选择的都是imd(我指nt/2k下),所以我才提出这个问题.
实现ipsec最好的方案是做到tcp/upd 和 ip之间,可是windows好像没有给出接口(只是好像,因为我不知道有还是没有),如果有,就是我们作ipsec的福气了.

另:有谁了解tcpip.sys吗? 是不是可以利用这个驱动达到介入传输层和网络层之间?换句话说,介入tcp/udp 与 ip之间?

只要与这个题目有关的任何意见,兄弟都表示欢迎!
HuYuguang
论坛版主
论坛版主
  • 注册日期2001-04-25
  • 最后登录2013-04-29
  • 粉丝3
  • 关注1
  • 积分92分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分1分
  • 专家分0分
板凳#
发布于:2001-08-29 20:32
我有个疑问,你看过ipsec的相关rfc文档吗?

关于ip设备,ddk文档中几乎什么都没有说。
ddk里面详细介绍的是tdi接口。

但是,一切irp都可以filter,一切system service
都可以hook。nothing is impossible。
不再回忆从前,我已经生活在幸福当中。
learner
驱动牛犊
驱动牛犊
  • 注册日期2001-07-27
  • 最后登录2001-12-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于: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的功能了.
learner
驱动牛犊
驱动牛犊
  • 注册日期2001-07-27
  • 最后登录2001-12-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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,我完全是个新手,提出的想法可能很愚蠢,还请高手不惜赐教.谢谢先!

                      
rascal
驱动牛犊
驱动牛犊
  • 注册日期2001-07-05
  • 最后登录2005-02-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2001-08-30 14:06
我看有一博士论文里头是这么说的,基于方机的实施的IPSEC可以分成两类
一个是基于操作系统(OS)集成实施方案:由于IPSEC是一个网络安全协议,所以在主机实施方案中,IPSEC可以与操作系统集成在一起,将IPSEC作为网络层的一部分实现 ,IPSEC协议的实现需要IP层的服务来构造IP头信息,这与其它网络层协议(如ICMP)的实施是相同的。
另外一个是:在协议堆栈的网络层与数据链路层之间实施,作为两个协议之间的一个“楔子”使用。

我想由于WIN2K源代码不开放,所以只能用第二种方法吧,但是它原有的数据包经过加密,认证和隧道封装后会变大,这就要求实现一部分网络层的功能吧,比如分片什么的。

所以我想应该没有LEARNER想要的那种方法啦(我也是本本地想的说!)
是我吗,不是吧!?
moqingsong
论坛版主
论坛版主
  • 注册日期2002-04-07
  • 最后登录2011-02-03
  • 粉丝0
  • 关注0
  • 积分74分
  • 威望71点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
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就正常了。
我解释不清楚这个现象。


 
按第一贴的“给分”键,给分。
hover_
驱动牛犊
驱动牛犊
  • 注册日期2002-05-30
  • 最后登录2002-07-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-06-28 11:25
我是新手,我倒是见过有人在protocol driver这一层实现ipsec,
好像和imd差不多。自己实现ip层我觉得倒不是很复杂。如果不实现icmp的话。
游客

返回顶部