本文档的Copyleft归yfydz所有,使用GPL发布,可以自由拷贝,转载,转载时请保持文档的完整性,
严禁用于任何商业用途。
msn: yfydz_no1@hotmail.com
来源: http://yfydz.cublog.cn

1. 前言

由于RFC2367中只定义了SA的类型,但没有定义安全策略的定义,因此各种IPSEC实现只能自己定义,
openswan-2.4.7和linux-2.6.19.2内核的xfrm都实现了IPSEC,但某些非标准参数定义有差异,
openswan的头文件为openswan-2.4.7/linux/include/pfkeyv2.h, xfrm的头文件为
 include/linux/pfkeyv2.h, 以下比较以下两者的定义的差别。

openswan的内核部分实现是klips, IKE为pluto;linux内核部分实现是xfrm,IKE为ipsec-
tools/racoon。

2. 非标准SA定义

openswan-2.4.7中的定义:

#define SADB_X_PROMISC  11
#define SADB_X_PCHANGE  12
#define SADB_X_GRPSA    13
#define SADB_X_ADDFLOW 14
#define SADB_X_DELFLOW 15
#define SADB_X_DEBUG 16
#define SADB_X_NAT_T_NEW_MAPPING  17
#define SADB_MAX                  17
Linux-2.6.19.2中的定义:

#define SADB_X_PROMISC  11
#define SADB_X_PCHANGE  12
#define SADB_X_SPDUPDATE 13
#define SADB_X_SPDADD  14
#define SADB_X_SPDDELETE 15
#define SADB_X_SPDGET  16
#define SADB_X_SPDACQUIRE 17
#define SADB_X_SPDDUMP  18
#define SADB_X_SPDFLUSH  19
#define SADB_X_SPDSETIDX 20
#define SADB_X_SPDEXPIRE 21
#define SADB_X_SPDDELETE2 22
#define SADB_X_NAT_T_NEW_MAPPING 23
#define SADB_MAX  23
openswan中的SA类型比较少, ADDFLOW和DELFLOW分别对于增加和删除安全策略, 这和linux是相同的,
但不支持其他类型的安全策略操作命令, openswan对安全策略支持比较少,因为其安全策略实际是通
过eroute来实现的,直接根据路由到ipsec*网卡来实现IPSEC封装。NAT_T_NEW_MAPPING的定义不同,
这个参数其实内核不用,只是在IKE双方使用,也就是在NAT穿越情况下pluto和racoon两者应该不能
配合。

3. 非标准SA扩展类型定义
openswan-2.4.7中的定义:
#define SADB_X_EXT_KMPRIVATE          17
#define SADB_X_EXT_SATYPE2            18
#ifdef KERNEL26_HAS_KAME_DUPLICATES
#define SADB_X_EXT_POLICY             18
#endif
#define SADB_X_EXT_SA2                19
#define SADB_X_EXT_ADDRESS_DST2       20
#define SADB_X_EXT_ADDRESS_SRC_FLOW   21
#define SADB_X_EXT_ADDRESS_DST_FLOW   22
#define SADB_X_EXT_ADDRESS_SRC_MASK   23
#define SADB_X_EXT_ADDRESS_DST_MASK   24
#define SADB_X_EXT_DEBUG              25
#define SADB_X_EXT_PROTOCOL           26
#define SADB_X_EXT_NAT_T_TYPE         27
#define SADB_X_EXT_NAT_T_SPORT        28
#define SADB_X_EXT_NAT_T_DPORT        29
#define SADB_X_EXT_NAT_T_OA           30
#define SADB_EXT_MAX                  30
Linux-2.6.19.2中的定义:
#define SADB_X_EXT_KMPRIVATE  17
#define SADB_X_EXT_POLICY  18
#define SADB_X_EXT_SA2   19
/* The next four entries are for setting up NAT Traversal */
#define SADB_X_EXT_NAT_T_TYPE  20
#define SADB_X_EXT_NAT_T_SPORT  21
#define SADB_X_EXT_NAT_T_DPORT  22
#define SADB_X_EXT_NAT_T_OA  23
#define SADB_X_EXT_SEC_CTX  24
#define SADB_EXT_MAX   24

两者虽然都定义了NAT-T相关的SA扩展类型,但定义值完全不同,再次说明NAT穿越下openswan/pluto
和racoon应该不能正常配合。

4. 非标准SA类型定义
openswan-2.4.7中的定义:
#define SADB_X_SATYPE_IPIP    9
#ifdef KERNEL26_HAS_KAME_DUPLICATES
#define SADB_X_SATYPE_IPCOMP  9   /* ICK! */
#endif
#define SADB_X_SATYPE_COMP    10
#define SADB_X_SATYPE_INT     11
#define SADB_SATYPE_MAX       11

Linux-2.6.19.2中的定义:
#define SADB_X_SATYPE_IPCOMP 9
#define SADB_SATYPE_MAX  9

在openswan中增加了COMP和INT两种非标准的SATYPE

5. 非标准ID类型
openswan-2.4.7中的定义:
#define SADB_X_IDENTTYPE_CONNECTION 4
#define SADB_IDENTTYPE_MAX        4

Linux-2.6.19.2中的定义:

#define SADB_IDENTTYPE_MAX 3
在openswan中增加了CONNECTION类型的ID类型定义

6. 非标准的SA标志类型

openswan-2.4.7中的定义:
#define SADB_X_SAFLAGS_REPLACEFLOW 2
#define SADB_X_SAFLAGS_CLEARFLOW 4
#define SADB_X_SAFLAGS_INFLOW  8
Linux-2.6.19.2中的定义:
#define SADB_SAFLAGS_NOPMTUDISC 0x20000000
#define SADB_SAFLAGS_DECAP_DSCP 0x40000000
#define SADB_SAFLAGS_NOECN 0x80000000

两者的标志类型完全不同

7. 算法部分定义

各种加密, 认证, 压缩算法定义都是相同的.

8. 结论

如果只是简单环境的IPSEC,pluto可能会与recoon能正确协商,如NAT穿越情况下两者应该是不能正
确配合的, 不过NAT穿越协商只是IKE过程中的定义, 好象是不涉及IKE和内核的通信。而pluto和
xfrm, racoon和klips是否能正常配合还有待测试,谁有测试情况报告可以说一声。