爱悠闲 > Ipsec Openswan 26sec等基础知识扫盲

Ipsec Openswan 26sec等基础知识扫盲

分类: 网络  |  作者: bytxl 相关  |  发布日期 : 2012-02-01  |  热度 : 444°

链接地址

最近在整理openswan clips,linux netkey等 方面的东西.

理清openswan什么版本支持ipv6,pluto和racoon作用等等知识 .

希望对研究ipsec,vpn方面的朋友有帮助.整理不足之处还请指正.


问题提出:什么是xfrm,racoon,netkey,PF_KEY,netlink,clips,26sec,Setkey,KAME,ipsec?

IPsec:Internet Protocol Security是一种开放标准的框架结构,通过使用加密的安全服务以确保在网络上进程保密而安全的通讯。IPsec IP层协议安全主要包括一个IP包进程模块和一个密钥交换模块,IPsec包的处理模块是基本IPsec安全策略(SP)和安全关联(SA)的。

PF_KEY:PF_KEY是密钥管理套接子,在UNPV13e 第19章有介绍。

klips或是NETKEY:实现IP数据包的安全接受或发送的进程。在内核域中运行,主要负责控制管理SA及密钥,同时处理数据包的加密和解密工作。

klips主要由以下模块组成:通信接口socket PF_KEY(klips是pluto自带的,而这个PF_KEY是clips自带的,Linux内核也有PF_KEY的实现,所以这两种PF_KEY是不一样的),负责注册和初始化模块,数据包处理和转发模块,数据包的接收和处理模块,SA的管理模块,SHA1、MD5算法实现模块,路由器的基数实现模块,PF_KEY2协议实现模块,其它一些相关子模块。KLIPS不支持IPv6(这仅对早期的openswan,2.6.33以后版本的klips已经支持了IPv6,现在已经到了2.6.38(2012-04-23)).

NETKEY:又称26sec,通信接口socket netlink, 该部分实现包含在2.6内核中,实际是对KAME项目的重写。

xfrm:指处理IP数据包的网络框架。是IPSec SPD/SAD的管理模块,与原网络架构的路由和网络数据处理密切相关,策略检查、SA的获取都属于xfrm.支持pf_key和netlink.

racoon:一个密钥管理守护进程,实现用户中的IKE密钥协商模块,主要用于自动方式下与通信对端相应模块的SA协商(相当于openswan的pluto吧),配置管理模块由Setkey实现,用来手动配置SP、SA,完成SPD、SAD的人工管理(相当于openswan的whack?)。为实现racoon和Setkey模块与内核交互,需使用PF_KEYv2套接字

pluto:密钥交换协议(IKE)的守护进程。主要实现IKE协议,以及完成SA的交互。

   如果pluto使用clips,则使用PF_KEY套接字;如果pluto使用NETKEY,则使用NETLINK_XFRM套接字。

SA,SP,SADB等具体在代码中怎么操作,代码中的含义是什么?数据是怎么组织的?

IKE,ipsec,pluto的深入理解?

安全策略(Security Policy,简写为SP):定义对满足条件IP报文进行安全处理的规则。即下面的一条路由。或者另一描述:安全策略是用来识别一个数据包是应该处理、忽略、还是应该丢弃。

安全关联(SecurityAssociation,简写为SA):这是这组协议中最重要的一个概念,是RFC文档中要求所有实现中必须包含的一个概念。它为当前IP报文的鉴别、加密处理提供必要的算法标识和算法相关的参数。安全关联是由当前IP报文的目的地址、SPI值及协议这个三元组(即SAID)唯一确定的

安全参数指针(SecurityParameter Index ,简写为SPI):是一个32位的整数,用来标识当前IP报文所对应的安全关联

安全策略数据库(Security PolicyDatabase,简写为SPDB):存放所有本机安全策略的集合

安全关联数据库(SecurityAssociation Database ,简写为SADB):是存放本机所有安全关联的集合

pluto可支持内核使用KLIPS或NETKEY实现IPSEC,前者的通信接口socket是PF_KEY, 后者的通信接口是netlink, 另外也支持内核无IPSEC的情况(NO_KERNEL), 不过基本就没什么意义。KLIPS的IPSEC实现是通过构造ipsec*虚拟网卡来实现的, 将数据从该网卡发送, 就意味着对数据进行加密; 从该网卡获取数据, 就是对数据包进行解密。因此安全策略(SP)实际是根据路由来进行的,因此配置加密路由就是配置安全策略,因此专门引入了eroute概念来描述这类路由。(此段引用yfydz的openswan实现)

                                      加解密

host: eth*<------>ipsec*<======>ipsec*<------>eth*:host


以上这个图有点问题,更正为如下(2013.1.8)。详细的数据传送走向可看新博文<<IPsec VPN数据传输过程>>

      加密       =====================》        解密

host:ipsec*<======>eth*==============eth*<=====>ipsec*:host

      解密        《=====================               加密


 

[root@xxxdotunnel]# ./i/eroute

0          30.0.0.0/24        -> 20.0.0.0/24        => tun0x1006@192.168.95.225

所以上面这条eroute其实就是所谓的安全策略SP,而0x1006即为安全参数指针SPI(用来标识当前IP报文所对应的安全关联)

现在用的linux内核为2.6的,它已经自带了Netkey模块,用来替代openswan开发的klips模块,2.4及以下版本内核不支持Netkey,所以只能使用Klips。2.6.9以下版本内核Netkey模块存在bug,建议使用Klips。KLIPS可以支持2.6, 但和2.6自带的NETKEY不能同时使用,只能2选1。所以如果2.6.内核需要使用Klips,需要卸载Netkey模块:

  rmmod xfrmuser af_key esp4 ah4 ipcomp xfrm4_tunnel

所以下回不用klips而要加载netkey时只要加载相应的ko模块,再把service ipsec自动加载的ipsec.ko改个名字(此ko路径:/lib/modules/‘uname -r’/kernel/net/ipsec/ipsec.ko,此ko是由openswan执行make module后生成的ipsec.ko,再执行make minstall就会自动拷过去并执行depmod –a完成模块依赖),因为ipsec首先加载此ipsec.ko,如果加载失败再去加载netkey相关模块。ko模块位置:/lib/modules/<kernel-version>/kernel/net/key/af_key.ko

       

查看ipsec加载的是netkey,klips还是没有加载: ipsec --version

                Linux OpenswanU2.4.7/K2.6.9-42.EL (netkey)

                Linux Openswan 2.4.7 (klips)

                Linux Openswan U2.4.7/K(nokernel code presently loaded)

查看ipsec进程各模块加载情况:ipsec verify

手动增加klips模块:

        lsmod|grep ipsec 查看ipsec模块是否已在内核

        如果没有,进入~/openswan-2.3.1

make module

cd  ~/openswan-2.3.1/modobj26

        insmod ipsec.o 或者是ipsec.ko

我现在使用的linux内核虽然是2.6.18,但设备使用的还是openswan自带的Klips而不是Netkey,为了使Linux和设备能成功建立隧道,所以Linux需要卸载Netkey,并加载Klips模块。也就是说现在内核对于pluto的支持是openswan自己实现的东西,只不过openswan编译出来了ipsec.ko,再把它insmod到内核。

(要是一边用Klips,一边用Netkey能建立隧道吗?不能。)


此文档由rosetta整理,主要内容来致互联网,转载请注明出处.

这里列出引用比较多的文章,在此表示感谢,

文献参考:

《OpenSWan安装配置指南》雁南飞

《pluto实现分析》独孤阁

《 UNPV13e》