IP安全工具——IPSec
作者:Kurt Seifried
编译:backend
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/had 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 => [email protected] 使用\"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/
发布人:netbull 来自:安全资讯