http://blog.chinaunix.net/uid-127037-id-2919568.html
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, 以下比较以下两者的定义的差别。
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
#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
#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
#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
#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
#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
#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
#define SADB_SAFLAGS_DECAP_DSCP 0x40000000
#define SADB_SAFLAGS_NOECN 0x80000000
两者的标志类型完全不同
7. 算法部分定义
各种加密, 认证, 压缩算法定义都是相同的.
8. 结论
如果只是简单环境的IPSEC,pluto可能会与recoon能正确协商,如NAT穿越情况下两者应该是不能正
确配合的, 不过NAT穿越协商只是IKE过程中的定义, 好象是不涉及IKE和内核的通信。而pluto和
xfrm, racoon和klips是否能正常配合还有待测试,谁有测试情况报告可以说一声。