2.6内核中Native IPsec基准

发表于:2007-05-25来源:作者:点击数: 标签:内核2.6基准native新的
新的2.6内核的原生IPsec实现极大的提高了 LINUX 系统的 安全 性 -------------------------------------------------------------------------------------------------------------- IPsec是IP协议的一个附加协议,它允许对IP数据报的认证和加密. IPsec详细
新的2.6内核的原生IPsec实现极大的提高了LINUX系统的安全
--------------------------------------------------------------------------------------------------------------
IPsec是IP协议的一个附加协议,它允许对IP数据报的认证和加密. IPsec详细定义在RFC 2401, RFC 2402 RFC 2406 和RFC 2407中.
IPsec可以用于相当广泛的地方以增强安全性, 最常用于创建虚拟专用网(VPN). VPN是两个子网间通过加密通信构筑在
INTERNET之上的一个安全的,私有的隧道.

FreeS/WAN在相当长的时间里是Linux的主要IPsec实现.不幸的是,FreeS/WAN从来没有集成到Linux内核中.
新的Linux原生IPsec实现基于KAME项目,KAME项目是UNIX/BSD家族的一部分.

USAGI项目使用KAME项目的BSD代码为基础,并集成IPsec到Linux内核中, KAME的用户空间工具----setkey和
Racoon也被IPsec-tools项目组移植到了Linux中.

在这篇文章中,我们实现了一个简单的场景:在两个Linux系统(reblochon, gouda)间设置一个安全的连接.
我们解释了不同的IPsec用户空间工具并说明了如何使用它们在两个系统间建立一个安全的连接.
最后,我们提出我们的基准并讨论.

你需要安装些什么?
------------------------------------------------------------------------------------------
为了使用IPsec,你需要一个支持IPsec协议的内核和允许密钥管理和密钥交换的用户空间工具.
这些密钥将用于不同的加密算法.

在Linux 2.5.47或更高的版本中,IPsec支持已经成为内核的一部分;但是默认的情况下,支持选项并未开启.
如果你使用Suse 9.1或Fedora Core 2, 在它们的2.6内核中已经有了IPsec的支持并且默认是开启的.
如果你使用其他的发布版,如Fedora Core 1, 你需要安装一个2.6.x的内核(更高版本更好).
编译新内核必须选择下面的选项:
Device drivers -> Networking support -> Networking options:
. PF_KEY sockets
. IP: AH transformation
. IP: ESP transformation
. IP: IPComp transformation
. IPsec 用户配置界面

你也应该包含所有你计划在设置IPsec时使用的加密算法.

在用户空间中, 你只需要setkey和Racoon, 它们都是IPsec-tools项目的一部分.安装这些工具是相当
简单的: 下载源程序,执行 configure, make, make install就可以了.
在你的发布版中也可能有已经编译好的包供你使用.

设置一个安全的连接
-----------------------------------------------------------------------------------------------
你可以使用IPsec的两种模式: 传输模式和隧道模式. 简单的说, 传输模式用于增强主机到主机的通信安全性.
而隧道模式用于增强站点到站点的通信安全性. 在传输模式中, 一个特殊的ESP或AH头被加到普通的IP头中;
在隧道模式中,ESP(AH)头和IP包都被封装到一个普通的IP包中. 这样ESP(AH)头对路由器来说就是不可访问的,
也就不会因为有一些不可识别的选项而被路由器丢弃.

IPsec的配置有几中不同的方法, 这里介绍了在主机间配置安全连接的三种方法.
. 共享密钥 在两边共享密钥. 初始化时,这个共享的密钥和加密或认证算法一起被指定. 使用共享密钥很简单
但并不安全; 因为在很多情况下,共享密钥都保存在双方的配置文件或脚本文件中. 如果你不经常更改你的密钥,
如果捕获足够的包,分析出密钥也是可能的.

. 预共享密钥 在这种模式下, 你需要运行Racoon. 它的功能和共享密钥相似.不同的是,Racoon使用预共享
的密钥作为协商一个密钥的种子,并且周期性的更改密钥.

. X.509证书  管理密钥最安全的方法是使用X.509证书. 这个方法需要访问一个可信任的安全当局(CA),
或者你需要有一个你自己的CA. IPsec配置在这种情况下并不更复杂,但是和一个信任的证书交互也可能是一个
问题.

在我们简单的场景中, 我们只关注IPsec实现的运行而不是安全连接的问题.所以我们讨论了共享密钥和
预共享密钥的配置.

一个简单的场景
------------------------------------------------------------------------------------------
下面列出了如何在两个机器间建立安全的连接.下面我们提供了gouda的一个配置文件,
用于设置一个安全的连接.gouda的IP是 192.168.0.1, reblochon的IP是192.168.0.2

 1: #!/usr/local/sbin/setkey -f
 2: flush;
 3: spdflush;
 4:
 5: # AH gouda to reblochon
 6: add 192.168.0.1 192.168.0.2 ah 1000
 7:         -A hmac-md5 "1234567890123456";
 8: add 192.168.0.2 192.168.0.1 ah 2000
 9:         -A hmac-md5 "1234567890123456";
10:
11: # ESP gouda to reblochon
12: add 192.168.0.1 192.168.0.2 esp 1001
13:         -E 3des-cbc "123456789012345678901234"
14:         -A hmac-sha1 "12345678901234567890";
15: add 192.168.0.2 192.168.0.1 esp 2001
16:         -E 3des-cbc "123456789012345678901234"
17:         -A hmac-sha1 "12345678901234567890";
18:
19: spdadd 192.168.0.1 192.168.0.2 any -P out IPsec
20:         esp/transport//require
21:         ah/transport//require;
22:
23: spdadd 192.168.0.2 192.168.0.1 any -P in IPsec
24:         esp/transport//require
25:         ah/transport//require;

在reblochon中,我们使用相同的脚本文件,只是修改两行:
19: spdadd 192.168.0.1 192.168.0.2 any -P in IPsec
23: spdadd 192.168.0.2 192.168.0.1 any -P out IPsec

注意: in, out关键字保留使用
第一行: setkey命令将被调用。这个程序用来在内核中插入或删除IPsec条目.
第二,三行: 我们用setkey命令清除安全关联(SA)和安全策略(SP),因为我们想在一个干净的状态下开始

在了解更多的技术细节前,我们需要了解IPsec协议的两个基本的概念: SA, SP.
SA Security Association 一个CA定义了安全参数,比如在两个系统间建立安全连接所使用的加密算法
SP Security Policy SP从某中意义上讲是定义两个系统间使用的安全上下文的安全规则;
比如, SP可以指定在我的机器和Inte.net上的远程系统间使用加密的通信.

在我们的场景中, 在reblochon和gouda间定义了两个SP. SP按以下方式定义

source | destination | on which kind of traffic to apply the policy (TPC, UDP, port, any) |
-P the direction in/out | what to do (IPsec/discard/none) |
protocol (esp/ah) / mode (transport/tunnel)
/ (IP address of both ends of the tunnel) not required in transport mode / require

例如:
spdadd 192.168.0.1 192.168.0.2 any -P out IPsec
            esp/transport//require
            ah/transport//require;
           
申明了一个安全策略: 从192.168.0.1到192.168.0.2将使用IPsec的传输模式,用ESP或AH协议

现在你已经在机器之间建立了安全策略,为了能够完成定义的策略你需要定义SA.你需要两个SA才能通信,
一个从gouda到reblochon,一个从reblochon到gouda. 两个SA不需要相同的算法. 实际上, 和本例子不同,
为了更好的安全性,你不应该在两个SA中使用相同的密钥.

你可以按下面的格式定义SA

source | destination | ah/esp | SPI (Security Policy Index) any number but should to unique |
-E/-A algorithm and associated secret key.
           
例如下面几行定义了一个SA
add 192.168.0.1 192.168.0.2 esp 1001
         -E 3des-cbc "1234567890123456789012"
         -A hmac-sha1 "12345678901234567890";
从gouda到reblochon的包使用ESP协议, 并使用3DES算法加密,使用SHA1作为认证的算法.

现在你可以在两边都运行这个脚本, 你可以使用setkey -D检查已经建立的不同SA的状态.如果你想查看你的
系统上存在的安全策略,可以使用 setkey -DP.这样在两个系统间传输的信息都是经过加密的,你可以使用
Ethereal来监控两个系统间的流量.

自动密钥分配
------------------------------------------------------------------------------------------
现在, 你应该能够理解为什么这种配置不是很安全了.依赖以明文保存在配置文件中的密钥来确保系统的安全是不
实用的.不过不需要太担心,IPsec的开发者已经考虑到了这个问题,并开发了一个协议来协商密钥并且
自动的建立安全的连接.这个功能由Racoon来实现. 有了Racoon就不再需要指定任何的SA了,只需要指定SP就可以了.
Racoon动态的定义SA,当然你得需要配置Racoon才行. Racoon运行在UDP 500端口, 你的防火墙不应该
阻止你的系统的UDP 500端口.在这里我们不将详细的讨论Racoon的设置,更多的信息请自行参考howto文档

基准规则
-----------------------------------------------------------------------------------------
我们使用Netio软件在2.6.7内核测试新的原生IPsec实现.我们使用拥有512M内存的Pentium IV 2.2G
机器. 用Netio测量网络的吞吐量. 我们建立一个使用3DES加密(密钥长度为192位)
和使用SHA1完整性验证的传输模式安全连接. 下面的表1和表2列出了用TCP和UDP实验的结果.

Table 1. Results form Netio TCP Benchmark

Packet Size   |      Bandwidth without IPsec   | Bandwidth with IPsec
-------------------|------------------------------------|------------------------
        1kb      |                10905kb               |     5157kb
        2kb      |                10832kb               |     5222kb
        4kb      |                10827kb               |     5305kb
        8kb      |                10811kb               |     5263kb
      16kb      |                10814kb               |     5345kb
      32kb      |                10729kb               |     5374kb
   
Table 2. Results from Netio UDP Benchmark

Packet Size   |  Bandwidth without IPsec       |   Bandwidth with IPsec
-------------------|------------------------------------|--------------------------
       1kb      |                11479kb               |     4806kb
       2kb      |                11244kb               |     4320kb
       4kb      |                11698kb               |     4985kb
       8kb      |                11714kb               |     5116kb
     16kb       |                 11725kb              |     5152kb
     32kb       |                 11743kb              |     5271kb
   
我们可以看到IPsec减少了TCP(UDP)连接的一半的吞吐量.绝对的带宽还是不低,对大多数应用来说足够了(最坏
的情况下也有4.3MB/sec)

结论
-------------------------------------------------------------------------------------------
新的Linux原生IPsec实现有一个友好的用户界面, 这样用户就能够更容易的在不同的Linux系统间设置安全
的连接. ......

本文由http://www.linuxjournal.com/article/7840翻译而成, 英文水准所限只是基本意思翻译出来,如有错漏欢迎指正. 不明之处参看原文.

Thanks!

原文转自:http://www.ltesting.net