离翻译IPsec Howto 1,2都快一年了,没有坚持做完,很不应该。以后有时间把后面的都补上。
本章解释了Linux kernel >= 2.5.47 and 2.6.*中native IPsec协议栈的使用。安装与配置IPsec栈与FreeS/WAN有很大的不同,与BSD变种(FreeBSD、NetBSD、OpenBSD)上的安装配置相似。
我将首先说明Linux kernel和用户空间工具的配置与安装。接着解释如何以手动分配密钥的方式使用IPsec的传输模式和隧道模式。然后说明使用预分配密钥方式和X.509证书两种方式建立自动密钥连接。最后解释对路边武士(road warriors)的支持。
安装
安装最少需要kernel版本2.5.47或2.6.*。kernel源代码可以从
cd /usr/local/src
tar xvjf /path-to-source/linux-.tar.bz2
cd linux-
make xconfig
make bzImage
make modules
make modules-isntall
make install
这些是配置与编译Linux kernel最常用的一些命令。如果你需要一个特别的安装请参考Kernel-Howto。
在编译kernel的过程中,打开如下的特性是非常重要的:
Networking support (NET) [Y/n/?] y
*
* Networking options
*
PF_KEY sockets (NET_KEY) [Y/n/m/?] y
IP: AH transformation (INET_AH) [Y/n/m/?] y
IP: ESP transformation (INET_ESP) [Y/n/m/?] y
IP: IPsec user configuration interface (XFRM_USER) [Y/n/m?] y
Cryptographic API (CRYPTO) [Y/n/?] y
HMAC support (CRYPTO_HMAC) [Y/n/?] y
Null algorithms (CRYPTO_NULL) [Y/n/m/?] y
MD5 digest algorithm (CRYPTO_MD5) [Y/n/m?] y
SHA1 digest algorithm (CRYPTO_SHA1) [Y/n/m/?] y
DES and Triple DES EDE cipher algorithms (CRYPTO_DES) [Y/n/m/?] y
AES cipher algorithm (CRYPTO_AES) [Y/n/m/?] y
在某些版本的kernel中,你也许需要打开对IPv6的支持。
当kernel编译安装完成后,就轮到用户空间工具了。当前用户空间工具在kernel头文件的位置。这个包需要版本大于或等于2.5.47的kernel头文件。
注意:当使用的kernel版本大于或等于2.6.10的时候,必须使用ipsec-tools >= 0.5的版本,因为kernel 2.6.10加入了老版本的racoon不能识别的转发策略。请小心!一些Linux发布版的发行商对一些很旧的kernel打patch,所以更旧版本的kernel也许需要你更新ipsec-tools。请检查你的kernel的fwd策略。
./configure –-with-kernel-headers=/lib/modules/2.6.x/build/include
Make
Make install
到此,基本所需要的都准备好了。
使用setkey建立手动密钥连接
手动密钥连接意味着建立连接所需要的所有参数都由管理员提供。在这里IKE协议没有启用。管理员决定SA使用什么协议、算法、密钥,并决定了如何生成SAD。
传输模式
本小节将在传输模式下建立手动密钥连接。这也许是一个开始使用IPsec的好方法,因为这是建立连接最简单的方式。本小节假设使用IPsec通信的两台机器的IP地址为:192.168.1.100和192.168.2.100IP。
存储在SAD和SPD中的所有参数都可以由setkey命令修改。这个命令有一个非常详细的man手册页。这里只包含了建立一个传输模式下IPsec连接所需要的选项。当使用命令setkey –f /etc/setkey.conf时,它从文件中读出命令。下面是一个常见的/etc/setkey.conf文件。#!/usr/sbin/setkey -f# Configuration for 192.168.1.100# Flush the SAD and SPDflush;spdflush;# Attention: Use this keys only for testing purposes!# Generate your own keys!# AH SAs using 128 bit long keysadd 192.168.1.100 192.168.2.100 ah 0x200 -A hmac-md50xc0291ff014dccdd03874d9e8e4cdf3e6;add 192.168.2.100 192.168.1.100 ah 0x300 -A hmac-md50x96358c90783bbfa3d7b196ceabe0536b;# ESP SAs using 192 bit long keys (168 + 24 parity)add 192.168.1.100 192.168.2.100 esp 0x201 -E 3des-cbc0x7aeaca3f87d060a12f4a4487d5a5c3355920fae69a96c831;add 192.168.2.100 192.168.1.100 esp 0x301 -E 3des-cbc0xf6ddb555acfd9d77b03ea3843f2653255afe8eb5573965df;# Security policiesspdadd 192.168.1.100 192.168.2.100 any -P out ipsecesp/transport//requireah/transport//require;spdadd 192.168.2.100 192.168.1.100 any -P in ipsecesp/transport//requireah/transport//require如果你不只是想使用手动密钥连接来测试,还想用作其它的用途,你需要使用另外一些密钥来替换上面例子中的密钥。使用下面的例子来产生你需要的密钥。$ # 128 Bit long key$ dd if=/dev/random count=16 bs=1 | xxd –ps16+0 Records ein16+0 Records auscd0456eff95c5529ea9e918043e19cbe$ # 192 Bit long key$ dd if=/dev/random count=24 bs=1| xxd -ps24+0 Records ein24+0 Records aus9d6c4a8275ab12fbfdcaf01f0ba9dcfb5f424c878e97f888当产生密钥时,请使用/dev/random,因为它可以保证密钥的随机性。这个脚本首先清空(flush)SAD和SPD。然后建立AH SA和ESP SA。Add命令加入一个安全关联(SA)到SAD中,需要提供源、目的IP地址,IPsec协议(AH or ESP),SPI以及算法。认证算法用 –A来指定,加密算法用 –E指定,压缩算法用-C指定(目前IP压缩算法还不支持)。在算法的后面必须指定密钥。密钥的格式可以用以0x开头的十六进制或double-quoted ASCII。Linux支持下面的AH和ESP算法:hmac-md5, hmac-sha, des-cbc, 3des-cbc。在不久的将来也许下面的算法会被支持:simple(不加密),blowfish-cbc, hmac-sha2-256, hmac-sha2-512。Spdadd加入安全策略到SPD中。策略定义了哪个包需要被IPsec保护,以及使用什么协议和密钥。这个命令需要被保护的包的源IP地址和目的IP地址,需要保护的上层协议(端口),使用的策略(-P)。策略定义了数据包的方向(in/out),接收数据包后的动作(ipsec/discard/none),IPsec使用的协议(AH/ESP/IPCOMP),IPsec的模式(传输模式)以及级别(use/require)。这个配置文件必须在参与IPsec通讯的两边都建立。……(意译)另一边只需要做很小的改变即可,最简单的方法是把-P in用-P out替换。下面是另外一台机器的配置:#!/usr/sbin/setkey -f# Configuration for 192.168.2.100# Flush the SAD and SPDflush;spdflush;# Attention: Use this keys only for testing purposes!# Generate your own keys!# AH SAs using 128 bit long keysadd 192.168.1.100 192.168.2.100 ah 0x200 -A hmac-md50xc0291ff014dccdd03874d9e8e4cdf3e6;add 192.168.2.100 192.168.1.100 ah 0x300 -A hmac-md50x96358c90783bbfa3d7b196ceabe0536b;# ESP SAs using 192 bit long keys (168 + 24 parity)add 192.168.1.100 192.168.2.100 esp 0x201 -E 3des-cbc0x7aeaca3f87d060a12f4a4487d5a5c3355920fae69a96c831;add 192.168.2.100 192.168.1.100 esp 0x301 -E 3des-cbc0xf6ddb555acfd9d77b03ea3843f2653255afe8eb5573965df;# Security policiesspdadd 192.168.1.100 192.168.2.100 any -P in ipsecesp/transport//requireah/transport//require;spdadd 192.168.2.100 192.168.1.100 any -P out ipsecesp/transport//requireah/transport//require;当对方的配置文件修改完成后,使用setkey –f /etc/setkey.conf来load配置。如果load成功,可以显示出SAD和SPD。# setkey –D# setkey –DPThe setup resembles now the setup of Figure 4.Figure 4. Two machines in transport mode using AH and ESP如果现在你在一端ping另一端,通信数据将被加密,用tcpdump将看到如下信息:12:45:39.373005 192.168.1.100 > 192.168.2.100: AH(spi=0x00000200,seq=0x1):ESP(spi=0x00000201,seq=0x1) (DF)12:45:39.448636 192.168.2.100 > 192.168.1.100: AH(spi=0x00000300,seq=0x1):ESP(spi=0x00000301,seq=0x1)12:45:40.542430 192.168.1.100 > 192.168.2.100: AH(spi=0x00000200,seq=0x2):ESP(spi=0x00000201,seq=0x2) (DF)12:45:40.569414 192.168.2.100 > 192.168.1.100: AH(spi=0x00000300,seq=0x2):ESP(spi=0x00000301,seq=0x2)隧道模式当使用IPsec的机器作为一个网关,并保护后面的两个网络的安全通信时使用隧道模式(Figure 5)。原始的IP数据包将被IPsec网关加密,并封装到一个新的IP数据包中,然后发送给对方的IPsec网关。对方IPsec网关将解包、解密以恢复原始的IP数据包,并发送给它的目的机器。Figure 5. The two peers protect the traffic between two networks隧道模式下的SA和SP设置与传输模式下很相似,下面是一个例子。#!/usr/sbin/setkey -f# Flush the SAD and SPDflush;spdflush;# ESP SAs doing encryption using 192 bit long keys (168 + 24 parity)# and authentication using 128 bit long keysadd 192.168.1.100 192.168.2.100 esp 0x201 -m tunnel -E 3des-cbc0x7aeaca3f87d060a12f4a4487d5a5c3355920fae69a96c831-A hmac-md5 0xc0291ff014dccdd03874d9e8e4cdf3e6;add 192.168.2.100 192.168.1.100 esp 0x301 -m tunnel -E 3des-cbc0xf6ddb555acfd9d77b03ea3843f2653255afe8eb5573965df-A hmac-md5 0x96358c90783bbfa3d7b196ceabe0536b;# Security policiesspdadd 172.16.1.0/24 172.16.2.0/24 any -P out ipsecesp/tunnel/192.168.1.100-192.168.2.100/require;spdadd 172.16.2.0/24 172.16.1.0/24 any -P in ipsecesp/tunnel/192.168.2.100-192.168.1.100/require;注意:当你是用的kernel >= 2.6.10时,如果你需要系统作转发,你就必须定义forward策略。如果使用ipsec-tools 0.5,它将自动加入forward策略,如果使用其它工具也许需要你自己手动加入了。如果你在kernel-mode(-k)下使用setkey,你也需要手动加入forward策略。spdadd 172.16.2.0/24 172.16.1.0/24 any –P fwd ipsecesp/tunnel/192.168.2.100-192.168.1.100/require;这个例子只使用了ESP协议。ESP协议可以保证数据的完整性和保密性。在这种情况下,ESP算法的顺序很重要。首先需要定义加密算法和密钥;然后需要定义认证算法和密钥。在隧道的另一端,你需要复制这个文件并替换策略的方向(in vs. out)。如果你使用了forward策略,你需要改变策略语句中的IP地址顺序。和BSD的IPsec实现相比,Linux的IPsec SA只能用于传输模式或者隧道模式,而不能同时用于两种模式中。默认为传输模式,所以当SA用户隧道模式时,必须用-m tunnel来指明。安全策略指明了被保护网络的IP地址段。使用这些IP地址的包将被IPsec所保护。只要使用了tunnel模式,SP必须指定tunnel以及被保护的对方网络的IP地址段。这些信息在寻找适当的IPsec SA时需要。如果tunnel没有正常工作,请检查你的路由设置。你的机器需要知道它们如何通过vpn网关发送数据包到对方网络。最简单的方法是设置vpn网关作为默认网关。本文档未结束。待续。