首页 -> 安全研究

安全研究

绿盟月刊
绿盟安全月刊->第2期->工具介绍
期刊号: 类型: 关键词:
IP安全工具——IPSec

作者:Kurt Seifried
整理:backend
日期:1999-10-15

IP安全工具——IPSec使用了网络通信加密技术。虽然不能加密数据包的头部和尾部信息(如源/目的IP地址、端口号、CRC校验值等),但可对数据包数据进行加密。由于加密过程发生在IP层,因此可在不改变POP/WWW等协议的情况下进行网络协议的安全加密。同时它也可以用于实现局域网间(通过互联网)的安全连接。基于IPv6的IPSec for Linux目前仍在测 试当中,但Windows 9x/NT、Solaris和其它一些UNIX平台的IPSec软件均已发布。你需要在内核中增加对IPSec的支持,才能使用IPSec软件。但是不幸的是,北美地区以外的Linux发布版本的内核均不支持IPSec。因此第一步就是获取最新的内核源程序和Linux IPSec源代码:http://www.xs4all.nl/~freewan/。
然后将内核源代码(以2.2.10为例)安装到/usr/src/linux,并编译、安装和重启内核,以测试新内核。在使IPSec正常工作之前必须保证网络工作正常。接着将IPSec for Linux源 代码解压到/usr/local/src目录下,运行安装程序"make menugo",对内核进行“补丁”。 再运行内核的配置程序。最后就是安装IPSec工具和内核。

cd /usr/local/src/
tar zvxf /path/to/tarball/snapshot.tar.gz
chown R root:root freeswan-snap1999Jun14b
cd freeswan-snap1999Jun14b
make menugo

确保已保存好内核的配置。一般情况下,如果使用"make zImage"命令重新生成内核时超
出大小限制。可用"make bzImage"命令重新编译内核:

cd /usr/src/linux
make bzImage
cp /usr/src/linux/arch/i386/boot/bzImage boot/vmlinuz-2.2.10-ipsec

现在我们需要修改LILO配置文件lilo.conf,并重新运行lilo和重新启动系统内核。
lilo.conf文件例子如下:

boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=100
image=/boot/vmlinuz-2.2.10-ipsec
label=linux-ipsec
root=/dev/hda1
read-only
image=/boot/vmlinuz-2.2.10
label=linux
root=/dev/hda1
read-only

重新运行lilo,系统提示:

linux-ipsec *
linux

然后重新启动带有IPSec支持的2.2.10内核的系统。系统重启时会出现几个错误,这主要
是IPSec在缺省情况下使用了实际并不存在的eth999接口。建议你将ipsec程序的路径加入到
用户环境变量中。
IPSec的网络设置。首先,需要允许网关服务器的TCP-IP转发。在Red Hat Linux系统中
的实现方法:
将 FORWARD_IPV4="false" 改为 FORWARD_IPV4="yes" 即可。
另一个方法是直接修改/proc文件系统,执行以下命令即可:

cat 1 > /proc/sys/net/ipv4/ip_forward

由于大多数人都使用了缺省的禁止IP转发安全策略,但你必须允许数据锯从远程网络或
主机传送到你的网络或主机中。而且,任何使用了IPSec的内部网络的所有伪装(masquerade)
规则都必须在允许IPSec的规则之后进行,否则主机将试图伪装(masquerade)数据包,而不是
将它们传递给IPSec。
以下例子说明了如何在两个已使用了IP masquerading伪装的受保护网络之间通过IPSec
进行安全的互联网连接:

手工(固定)密钥连接 (Manual connection keying)
为简单起见,我们先通过使用手工(固定)密钥,并编辑ipsec.conf和防火墙规则来建
立安全连接。ipsec.conf中的许多缺省参数已设置好,我们需要修改的参数如下:

conn sample
type=tunnel
left=
leftnexthop=
leftsubnet=
right=
rightnexthop=
rightsubnet=
spibase=0x200
esp=3des-md5-96
espenckey=
espauthkey=

使用随机数生成器产生一个数字,并保留其16进制前导字符0x。配置例子如下:

conn my-tunnel
type=tunnel
left=1.2.3.4
leftnexthop=1.2.3.1
leftsubnet=10.0.0.0/24
right=5.6.7.8
rightnexthop=5.6.7.1
rightsubnet=192.168.0.0/24
spibase=0x200
esp=3des-md5-96
espenckey=some_auth_key_here (ranbits 192)
espauthkey=some_other_key_here (ranbits 128)

设置完成后,复制ipsec.donf和ipsec.secrets文件到其他需要使用此安全模式的机器
中。剩下的工作就是修改防火墙规则,使其只将数据包转发,而不将其伪装(masquerade)。
在服务器1.2.3.4上增加以下规则:

ipchains -A forward -p all -j ACCEPT -s 10.0.0.0/24 -d 192.168.0.0/24
ipchains -A forward -p all -j ACCEPT -s 192.168.0.0/24 -d 10.0.0.0/24

记住,要确保这些规则在伪装(masquerade)规则之前,如以下所示:

#
# FORWARD RULES
#
ipchains -P forward DENY
#
ipchains -A forward -p all -j ACCEPT -s 10.0.0.0/24 -d 192.168.0.0/24
ipchains -A forward -p all -j ACCEPT -s 192.168.0.0/24 -d 10.0.0.0/24
ipchains -A forward -p all -j MASQ -s 10.0.0.0/24 -d 0.0.0.0/0

在服务器5.6.7.8上重复类似工作:

ipchains -A forward -p all -j ACCEPT -s 192.168.0.0/24 -d 10.0.0.0/24
ipchains -A forward -p all -j ACCEPT -s 10.0.0.0/24 -d 192.168.0.0/24

记住,要确保这些规则在伪装(masquerade)规则之前,如以下所示:

#
# FORWARD RULES
#
ipchains -P forward DENY
#
ipchains -A forward -p all -j ACCEPT -s 192.168.0.0/24 -d 10.0.0.0/24
ipchains -A forward -p all -j ACCEPT -s 10.0.0.0/24 -d 192.168.0.0/24
ipchains -A forward -p all -j MASQ -s 192.168.0.0/24 -d 0.0.0.0/0

现在我们可以利用这个手工构造的ipsec通道,建立网络A与网络B之间的通信。

ipsec manual –up my-tunnel

系统输出信息如下:

/usr/local/lib/ipsec/spi: message size is 36
/usr/local/lib/ipsec/spi: message size is 132
/usr/local/lib/ipsec/spi: message size is 132

从客户机10.0.0.2上ping 192.168.0.2,如果ping得通则说明设置正确。否则请检查网
络,确保1.2.3.4与5.6.7.8之间可以通信,允许TCP-IP转发,和两个网络间的防火墙没有规
则禁止数据包通过或伪装数据包。当成功完成了手工(固定)密钥连接后,便应当开始配置
自动密钥 (automative keying)。

自动密钥连接 (Automatic connection keying)
对于一个商业应用来说,使用手工(固定)密钥是不安全和不可靠的。在自动密钥连接
模式下产生一个256位共享密钥,将其复制到连接通道的各个节点上后,那些企图截取数据包
的网络攻击者将很难攻破这种安全连接。在自动密钥连接模式下,一个密钥的有效期是8个小
时,这种配置有效地阻止了那些企图用暴力法猜出密钥的攻击者。下面我们在前一个例子的
基础上建立自动密钥连接配置:
共享密钥保存在ipsec.secrets中,因此必须使其绝对安全。以下例子用于服务器1.2.3.4
和5.6.7.8之间的连接:

1.2.3.4 5.6.7.8 "0xa3afb7e6_20f10d66_03760ef1_9019c643_a73c7ce0_91e46e84_ef6281b9_812392bf"

这行内容必须保存在两台服务器的ipsec.secrets文件中。接着是在ipsec.conf文件中编
辑通道配置,如下例:

conn my-tunnel
type=tunnel
left=1.2.3.4
leftnexthop=1.2.3.1
leftsubnet=10.0.0.0/24
right=5.6.7.8
rightnexthop=5.6.7.1
rightsubnet=192.168.0.0/24
keyexchange=ike
keylife=8h
keyingtries=0

然后启动pluto守护进程。在通道的另一端连接pluto守护进程以建立一个连接。需要提醒
的是,因为pluto守护进程运行在端口500/UDP,你需要在防火墙开一个“洞”使数据包能够顺
利通过:

ipchains -A input -p udp -j ACCEPT -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 500

使用"%search"关键字比列出要建立的通道清单更方便。方法如下:
在每一个通道配置中增加一行:

auto=start

编辑ipsec.secrets文件:

plutoload=%search
plutostart=%search

如果一切正常,/var/log/messages中将有类似如下记录:

Jun 26 02:10:41 server ipsec_setup: Starting FreeS/WAN IPSEC...
Jun 26 02:10:41 server ipsec_setup: /usr/local/lib/ipsec/spi: message size is 28.
Jun 26 02:10:41 server ipsec_setup: KLIPS debug `none'
Jun 26 02:10:41 server ipsec_setup: KLIPS ipsec0 on eth0 1.2.3.4/255.255.255.0 broadcast 24.108.11.255 Jun 26 02:10:42 server ipsec_setup: Disabling core dumps:
Jun 26 02:10:42 server ipsec_setup: Starting Pluto (debug `none'):
Jun 26 02:10:43 server ipsec_setup: Loading Pluto database `my-tunnel':
Jun 26 02:10:44 server ipsec_setup: Enabling Pluto negotiation:
Jun 26 02:10:44 server ipsec_setup: Routing for Pluto conns `my-tunnel':
Jun 26 02:10:45 server ipsec_setup: Initiating Pluto tunnel `my-tunnel':
Jun 26 02:10:45 server ipsec_setup: 102 "my-tunnel" #1: STATE_MAIN_I1: initiate
Jun 26 02:10:45 server ipsec_setup: 104 "my-tunnel" #1: STATE_MAIN_I2: from STATE_MAIN_I1; sent MI2, expecting MR2
Jun 26 02:10:45 server ipsec_setup: 106 "my-tunnel" #1: STATE_MAIN_I3: from STATE_MAIN_I2; sent MI3, expecting MR3
Jun 26 02:10:45 server ipsec_setup: 003 "my-tunnel" #1: STATE_MAIN_I4: SA established
Jun 26 02:10:45 server ipsec_setup: 110 "my-tunnel" #2: STATE_QUICK_I1: initiate
Jun 26 02:10:45 server ipsec_setup: 003 "my-tunnel" #2: STATE_QUICK_I2: SA established Jun 26 02:10:46 server ipsec_setup: ...FreeS/WAN IPSEC started

而在/var/log/secure文件中将有类似如下记录:

Jun 26 02:10:42 server Pluto[25157]: Starting Pluto (FreeS/WAN Version snap1999Jun14b)
Jun 26 02:10:44 server Pluto[25157]: added connection description "my-tunnel"
Jun 26 02:10:44 server Pluto[25157]: listening for IKE messages
Jun 26 02:10:44 server Pluto[25157]: adding interface ipsec0/eth0 1.2.3.4Jun 26 02:10:44 server Pluto[25157]: loading secrets from "/etc/ipsec.secrets"
Jun 26 02:10:45 server Pluto[25157]: "my-tunnel" #1: initiating Main Mode
Jun 26 02:10:45 server Pluto[25157]: "my-tunnel" #1: ISAKMP SA established
Jun 26 02:10:45 server Pluto[25157]: "grumpy-seifried" #2: initiating Quick Mode POLICY_ENCRYPT+POLICY_TUNNEL+POLICY_PFS
Jun 26 02:10:45 server Pluto[25157]: "my-tunnel" #2: sent QI2, IPsec SA established
Jun 26 02:11:12 server Pluto[25157]: "my-tunnel" #3: responding to Main Mode
Jun 26 02:11:12 server Pluto[25157]: "my-tunnel" #3: sent MR3, ISAKMP SA established
Jun 26 02:11:12 server Pluto[25157]: "my-tunnel" #4: responding to Quick Mode
Jun 26 02:11:12 server Pluto[25157]: "my-tunnel" #4: IPsec SA established
Jun 26 02:31:31 server Pluto[25157]: "my-tunnel" #5: responding to Main Mode
Jun 26 02:31:32 server Pluto[25157]: "my-tunnel" #5: sent MR3, ISAKMP SA established
Jun 26 02:31:32 server Pluto[25157]: "my-tunnel" #6: responding to Quick Mode
Jun 26 02:31:32 server Pluto[25157]: "my-tunnel" #6: IPsec SA established

还可以查看"eroute"的输出以确认通道配置正确:

10.0.0.0/24 -> 192.168.0.0/24 => tun0x114@1.2.3.4

使用"route"查看路由表时:

Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
1.2.3.4 0.0.0.0 255.255.255.255 UH 0 0 0 eth0
10.0.0.1 0.0.0.0 255.255.255.255 UH 0 0 0 eth
11.2.3.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
1.2.3.0 0.0.0.0 255.255.255.0 U 0 0 0 ipsec0
192.168.0.0 1.2.3.1 255.255.255.0 UG 0 0 0 ipsec0
10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0
eth1127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0
lo0.0.0.0 1.2.3.1 0.0.0.0 UG 0 0 0 eth0


商业化的IP安全软件产品

i-data
i-data是一套基于Linux和FreeS/WAN的、建立VPN服务器的产品。该产品来自丹麦,网站
地址为:http://www.i-data.com/networks/

Windows平台的IP安全软件产品

PGP VPN
由NAI公司开发、支持IPSec的软件包。下载地址:
http://www.nai.com/asp_set/products/tns/pgp_vpn.asp
NAI的PGP免费版本也支持IPSec VPN,下载地址:
http://www.pgpi.com/

版权所有,未经许可,不得转载