Ipsec Openswan 26sec等基础知识扫盲

来源:互联网 发布:淘宝数据魔方多少钱 编辑:程序博客网 时间:2024/05/17 07:35

http://blog.csdn.net/rosetta/article/details/7547308

http://www.linuxjournal.com/article/9916


最近在整理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章有介绍。 PF_KEY协议族主要用来处理安全联盟SA的,对SADB(SA数据库)进行管理,主要用在IPSEC协议中,其他协议如OSPF等用到密钥的协议中也可以用。   

PF_KEY_v2的编程API在RFC2367中定义,其实在freeswan的pluto中有完整的PF_KEY运用实例。在UNP这本书中只是很简单的介绍了一下,属于入门级,详细说明要看RFC,程序实例看pluto。     

PF_KEY协议族只支持RAW模式,只能由ROOT权限的用户打开PF_KEY类型的套接口,这和netlink类型套接口是类似的,而且数据格式也是以消息方式传输。     

进程PF_KEY类型的套接口和netlink套接口一样,可以和内核进行双向通信。可以向内核和其他打开了PF_KEY套接口发送消息,可进行SADB中的SA项的增加和删除;也可以从内核中接收消息。     

PF_KEY的消息的数据格式都有一个格式相同的数据头(12字节长), 说明数据类型等信息, 然后后面可以跟0到多个扩展的结构用来描述不同类型的具体数据内容。

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)).

KLIPS: "kernel IPsec support". This is the kernel portion of FreeS/WAN, Openswan and Strongswan. Not to be confused with NETKEY (aka 26sec), the kernel IPsec implementation included with kernel 2.6, which is also supported by recent versions of FreeS/WAN, Openswan and Strongswan.
KLIPS:"kernel IPsec support".这是FreeS/WAN, Openswan and Strongswan的核心部分。不要和NETKEY混淆,它是被包含在LINUX内核2.6里的IPSec核心实现,它被最新版本的FreeS/WAN, Openswan 和 Strongswan支持。
PS:KLIPS是在LINUX内核里,是对IPSEC的支持,要在内核里开启该选项。

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

(

Two IPsec kernel stacks are currently available: KLIPS and NETKEY. The Linux kernel NETKEY code is a rewrite from scratch of the KAME IPsec code. The KAME Project was a group effort of six companies in Japan to provide a free IPv6 and IPsec (for both IPv4 and IPv6) protocol stack implementation for variants of the BSD UNIX computer operating system.

KLIPS is not a part of the Linux kernel. When using KLIPS, you must apply a patch to the kernel to support NAT-T. When using NETKEY, NAT-T support is already inside the kernel, and there is no need to patch the kernel.

When you apply firewall (iptables) rules, KLIPS is the easier case, because with KLIPS, you can identify IPsec traffic, as this traffic goes through ipsecX interfaces. You apply iptables rules to these interfaces in the same way you apply rules to other network interfaces (such as eth0).

When using NETKEY, applying firewall (iptables) rules is much more complex, as the traffic does not flow through ipsecX interfaces; one solution can be marking the packets in the Linux kernel with iptables (with a setmark iptables rule). This mark is a member of the kernel socket buffer structure (struct sk_buff, from the Linux kernel networking code); decryption of the packet does not modify that mark.

)

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使用klips,则使用PF_KEY套接字;如果pluto使用NETKEY,则使用NETLINK_XFRM套接字。


问题提出:

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

IKE,ipsec,pluto的深入理解?

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

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

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

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

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

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》