现在,在Linux上有两种IPSEC可用。对于2.2和2.4,第一个比较正规的实现有FreeS/WAN。他们有一个官方站点和一个经常维护的非官方站点。出于多种原因,FreeS/WAN历来没有被合并到内核的主线上。最常提到的原因就是政治问题——违反了美国的密码产品扩散条例。所以它不会被集成到Linux内核中。
另外,很多合作伙伴表明了他们对代码质量的忧虑。关于如何设置FreeS/WAN,有很多文档可以参考。
Linux 2.5.47版内核里有一个内置的IPSEC实现,是由Alexey Kuznetsov和Dave Miller在USAGI ">IPv6 小组的启发下写成的。经过这次合并,James Morris的CrypoAPI也成了内核的一部分——它能够真正地加密。
本HOWTO文档仅收录2.5以上版本内核的IPSEC。Linux 2.4内核的用户推荐使用FreeS/WAN。但是要注意,它的配置方法与内置IPSEC不同。
2.5.49版内核的IPSEC不再需要任何补丁。
我在这里收集了Alexey或Dave Miller发布的一些补丁。对于2.5.48版的内核,在报告BUG之前请确认已经打上了那些补丁!(迄今还没有2.5.49这方面的补丁)。一些简单的用户级工具可以在这里 (编译好的可执行文件和手册)找到。编译这些用户级工具需要修改Makefiles指向你的2.5.x内核。这种情况可望很快解决。
编译你的内核的时候,要确认已经打开CryptoAPI中的“PF_KEY”、“AH”、“ESP”以及其他所有选项!netfilter中的TCP_MSS方法现在不能用,请关掉。
首先,我们展示一下如何在两个主机之间手动设置安全通讯。其间的大部分工作都可以自动完成,但是为了了解细节我们仍然用手动完成。
如果你仅仅对自动密钥管理感兴趣,请跳过下面一节。但是要知道,了解手动密要管理是很有用的。
1. 从手动密钥管理开始
IPSEC是一个复杂的主题。有很多在线信息可以查阅,这个HOWTO将集中讲解如何设置、运行并解释一些基本原理。
很多iptables配置会丢弃IPSEC数据包!要想让IPSEC通过,运行
iptables -A xxx -p 50 -j ACCEPT
iptables -A xxx -p 51 -j ACCEPT
IPSEC提供了一个安全的IP协议版本。所谓的“安全”意味着两件事情:加密与验证。如果认为安全仅仅就是加密哪就太天真了,很容易看出来那是不够的——你的通讯过程或许是加密的,但是你如何保证与你通讯的对端就是你期望中的人呢?
IPSEC使用ESP('Encapsulated Security Payload',安全载荷封装) 来支持加密,使用AH(Authentication Header,头部验证)来支持对端验证。你可以同时使用二者,也可以使用二者之一。
ESP和AH都依靠SA(security associations,安全联盟)来工作。一个SA由一个源、一个目的和一个说明组成。一个验证SA看上去应该是:
add 10.0.0.11 10.0.0.216 ah 15700 -A hmac-md5 "1234567890123456";
意思是:“从10.0.0.11到10.0.0.216的数据包需要AH,使用HMAC-MD5签名,密码是1234567890123456”。这个说明的SPI(Security Parameter Index,安全参数索引)号码是'15700',细节后面再谈。有意思的是一个会话的两端都使用相同的SA——它们是全等的,而不是镜像对称的。要注意的是,SA并没有自动翻转规则——这个SA仅仅描述了从10.0.0.11到10.0.0.216的认证。如果需要双向安全,需要2条SA。
一个简单地ESP SA:
add 10.0.0.11 10.0.0.216 esp 15701 -E 3des-cbc "123456789012123456789012";
意思是:“从10.0.0.11到10.0.0.216的数据包需要ESP,使用3des-cbc加密算法,密码是123456789012123456789012”。SPI号码是'15701'。
到此,我们看到SA描述了所有的说明,但它并没有描述应该什么时候用到这些策略。实际上,可以有很多完全相同的SA,除了它们之间的SPI不同。顺便提一句,SPI的意思是Security Parameter Index(安全参数索引)。为了进行加密操作,我们需要声明一个策略。这个策略可以包含诸如“如果可能的话使用ipsec”或者“除非我们有ipsec否则丢弃数据包”这样的东西。