博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用IKE构建企业虚拟网
阅读量:2434 次
发布时间:2019-05-10

本文共 9004 字,大约阅读时间需要 30 分钟。

目前,互联网通信面临的风险主要包括两个方面:1.信息在传输时被偷看或非法修改;2.公网对内部网的非法访问和攻击。在这样的情况下,VPN技术脱颖而出,它可以很好地解决利用互联网传输的安全问题。

IPSec是被广泛接受用来实现VPN的技术,在企业中得到广泛应用。IPSec在IP层上对数据包进行保护,它可提供数据源验证、无连接数据完整性、数据机密性、抗重播和有限业务流机密性等安全服务,可以在相当程度上降低互联网通信的风险。

IKE(Internet Key Exchange)是IPSec中至关重要的一个协议,因为IPSec需要使用它协商某些与IPSec安全有关的安全参数,包括计算机信任、加密密钥和安全方法。IKE的主要功能就是安全联盟(SA)的建立和维护。

本文主要从IPSec及IKE简介、Linux VPN运行环境组建和IKE配置等三个方面进行描述,并给出利用IKE构建VPN应用的实例。

IPSec及IKE简介

1.IPSec简介

IPSec协议由一组协议组成,其中包括AH、ESP、IKE及加密和验证算法。ESP用于确保IP数据包的机密性(未被别人看过)、数据的完整性及对数据源的身份验证。此外,它还要负责对重播攻击的抵抗。AH也提供了数据完整性、数据源验证及抗重播攻击的能力,但不能用它来保证数据的机密性。

IPSec的安全服务是由通信双方建立的安全联盟(SA)来提供的。SA表示了策略实施的具体细节,包括源/目的地址、应用协议、 SPI(安全策略索引)、所用算法/密钥/长度,它们决定了用来保护数据安全的IPSec协议、模式、算法/密钥、生存期、抗重播窗口及计数器等。

每一个IPSec节点都包含有一个安全策略库(SPD)。SPD决定了整个VPN的安全需求。在SPD这个数据库中,每个条目都定义了要保护的是什么通信、怎样保护它,以及和谁共享这种保护。IPSec系统在处理输入/输出IP流时必须参考该策略库,并根据从SPD中提取的策略对IP流进行不同的处理:拒绝、绕过或进行IPSec保护。

IPSec协议(包括AH和ESP)有传输模式和通道模式两种工作模式。传输模式用来保护上层协议;而通道模式用来保护整个IP数据报。在传输模式中,IP头与上层协议头之间需插入一个特殊的IPSec头;而在通道模式中,要保护的整个IP包都需封装到另一个IP数据报里,同时在外部与内部IP头之间插入一个IPSec头。

2.IKE简介

用IPSec保护一个IP包之前,必须先建立一个SA。IKE用于动态建立SA。IKE代表IPSec对SA进行协商,并对SADB和SPD数据库进行填充。

IKE利用PF_KEY接口与内核进行交互,以便更新内核的SPD和SADB。SADB是一个存在于内核中的逻辑实体,用来存储、更新、删除安全协议的安全联盟数据。安全协议(如IPSec)利用内核中的逻辑接口来请求和获取SA。

IKE规定了协商的两个独立阶段。第一阶段目的是通信各方彼此间建立一个通过身份验证和安全保护的通道IKE SA。对该阶段来说,IKE采用的是身份保护交换,以及根据基本ISAKMP文档制定的野蛮交换法,即“主模式”和“野蛮模式”。它们各自做的都是建立一个保密和验证无误的通信信道(IKE SA),并建立验证过的密钥,为双方的IKE通信提供机密性、消息完整性及消息源验证服务。

IKE SA提供了各种各样的参数,这些参数称为“保护套件”,包括加密算法、散列算法、验证方法及Diffie-Hellman组。还有一些可选属性,它们可作为保护套件的一部分进行协商。在这些可选属性之前,必须加上一个“存活时间”(有效期)。

对第二阶段来说,IKE定义了一种快速模式交换。在第一阶段建立IKE SA后,就可以利用它加密地进行IPSec SA的参数协商,如加密算法、验证算法、密钥和存活时间等。

Linux VPN运行环境组建

1.升级到内核2.6.5

目前发行的各种Linux版本基本都是采用2.4.x内核,Linux VPN实现大都采用Freeswan软件。现在2.6.5内核的协议栈嵌入了IPSec处理代码,将内核升级到2.6.5,可以利用其固有的IPSec功能。本文描述的Linux VPN实现基于Fedora 1。

介绍如何将内核升级到2.6.5的文章我以前有说过,这里仅简单列出升级内核的基本步骤。

(1)首先从www.kernel.org网站下载2.6.5内核,http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.5.tar.gz 将它放到/usr/src目录下。

(2)将内核源码释放到/usr/src/目录下。

#tar -zxvf linux-2.6.5.tar.gz
#cd linux-2.6.5
#make mrproper
#make menuconfig

注意,为了保证与内核2.4.x中文件系统兼容,必须将文件系统ext3改为必选项。并在网络选项中选择以下四项,使系统内核能够支持IPSec。

<*> PF_KEY sockets
<*> IP: AH transformation
<*> IP: ESP transformation
<*> IP: IPComp transformation

重新使用内核2.6.5启动系统。

#make
#make modules_install
#make install

(3)安装IPSec手工配置工具。

从http://ipsec-tools.sourceforge.net/下载源码ipsec-tools-0.3.tar.gz,http://easynews.dl.sourceforge.net/sourceforge/ipsec-tools/ipsec-tools-0.3.tar.gz 按照帮助文件提示进行编译。

#./configure
#make; make install

这样有了应用程序sekey,就可用它手工配置SPD和SA。

ipsec-tools自带的IKE进程racoon运行时不能自动执行通道模式下的协商过程,必须由内核发起SA请求来触发,所以必须事前手工输入安全策略。这给VPN应用带来了很大不便,因此这里将采用后文描述的isakmpd进程。

2.安装IKE相关应用程序

本文介绍的IKE支持预共享密钥和X.509两种认证模式。为了支持X.509证书认证,必须首先安装keynotes。

安装keynotes的步骤如下:

(1)从 http://www1.cs.columbia.edu/~angelos/keynote.html获取源码keynote.tar.gz。http://www1.cs.columbia.edu/~angelos/Code/keynote.tar.gz

(2)将其解压并编译。

#tar -zxvf keynote.tar.gz
#./configure
#make

注意,编译isakmpd时,需要keynotes的文件头和库libkeynotes.a。

现在可以安装isakmpd了。isakmpd最早运行在OpenBSD上,由Thomas Walpuski将其移植到Linux平台,所以在源码里会看到OpenBSD的痕迹。

安装isakmpd的步骤如下:

(1)从http://bender.thinknerd.de/~thomas/IPsec/isakmpd-linux.html看帮助获取源码isakmpd。

[root@vitter vitter]# export CVS_RSH=/opt/ssh/bin/ssh

[root@vitter vitter]# export CVSROOT=:pserver:anoncvs@anoncvs.de.openbsd.org:/cvs
[root@vitter vitter]# cvs login
Logging in to :pserver:anoncvs@anoncvs.de.openbsd.org:2401/cvs
CVS password: anoncvs
[root@vitter vitter]# cvs -z9 co -d isakmpd src/sbin/isakmpd

(2)编译。
修改文件GNUmakefile,将OS改为Linux。
修改文件isakmpd/sysdep/linux/GNUmakefile.sysdep,将内核2.6.5和keynotes的头文件加入编译路径。 (Building isakmpd should be straight forward on most systems (read: it works on my systems) as there is no lousy ./configure script or the like.)

[root@vitter isakmpd]# sed 's/^/(OS=/t/topenbsd/)/#/1/' GNUmakefile | /

pipe> sed 's/^#/(OS=/t/tlinux/)//1/' > tmp; mv tmp GNUmakefile
[root@vitter isakmpd]# make

 

(3)装备运行目录。

#mkdir /etc/isakmpd

存放配置文件和策略文件。

#mkdir /etc/isakmpd/ca

存放CA X.509证书。

#mkdir /etc/isakmpd/certs

存放本机和其它主机X.509证书。

#mkdir /etc/isakmpd/private
存放本机的私钥。

 

#cp isakmpd /usr/sbin/.

至此,支持IPSec和IKE的Linux运行环境组建完成。

isakmpd的配置文件和策略文件

实施IPSec前,必须解释一下isakmpd的配置文件和策略文件,因为对它们的理解关系到能否正确实施VPN。这两个文件是 isakmpd.conf和isakmpd.policy,分别对应IPSec的SADB和SPD。isakmpd.conf主要描述了建立IKE SA和IPSec SA所需的必要参数;isakmpd.policy策略文件控制哪些安全主机或VPN网关可以与本机建立SA,以及建立什么样的SA。下面就常用的一些配置项加以解释,更详细的信息请查阅相关帮助手册。

配置文件isakmpd.conf采用.ini格式,每小节以[section]形式开始,在小节内可以将值赋予一个tag:

[section]
tag=value

如果value很长,可以在行尾使用“”续行。以“#”开头的行是注释行。通常右边的值是其它section的名字。对于一些特殊的小节,section都有预定义的默认值,如“General”、“Keynote”、“X509-certificates”和“Default- phase-1-configuration”。一些预定义的section名可以被isakmpd进程识别,这样可以避免完全详细描述主模式的转换码和快速模式的套件、协议及转换码。

对于主模式:

{DES,BLF,3DES,CAST}-{MD5,SHA}[-GRP{1,2,5}][-{DSS, RSA_SIG}]
对于快速模式:

bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center">

QM-{proto}[-TRP]-{cipher}[-{hash}][-PFS[-{group}]]-SUITE

其中{proto}可为ESP或AH;{cipher}可为DES、3DES、CAST、BLF或AES;{hash}可为MD5、SHA或

RIPEMD;{group}可为GRP1、GRP2或GRP5。

例如,3DES-SHA表示3DES加密、SHA哈希和预共享密钥认证。这些自动生成的值可以在配置文件中使用相同的section名和tag名将其重新

设置。

为了让大家对该配置文件有个感性认识,以一个采用预共享密钥认证的简单配置文件为例来说明(如图1示)。该文件的最右端以“//”开始部分是加注的解释,

在实际的配置文件中并不存在。

图1 配置文件isakmpd.conf

下面介绍策略文件isakmpd.policy。

一个最简单的策略文件只需一行就可以工作:

authorizer: "POLICY"

它表示对那些想建立连接的实体没有策略限制,因而不是安全的配置。这里的“authorizer”表示谁有权决定策略。特殊的授权者“POLICY”拥有

最终的和无限制的权利。任何其它的授权者必须由“POLICY”授权。

也可以在策略文件内设置一些被允许的条件。下面的策略表示只有那些使用ESP协议,而且加密算法不为空的实体有权建立IPSec SA:

authorizer:"POLICY"

conditions: app_domain == "IPsec policy" &&
esp_present == "yes" &&
esp_enc_alg != "null" -> "true";

还可以利用“licensees”授权给其它的实体。简单的例子就是预共享密钥的情形:

authorizer:"POLICY"

licensees: "passphrase:something really secret"
conditions:app_domain == "IPsec policy" &&
esp_present == "yes" &&
esp_enc_alg != "null" -> "true";

上面的配置表示任何知道预共享密钥,且通信参数符合条件的人都得到授权建立IPSec连接。记住要把isakmpd

.conf中的Authentication设置成预共享密钥。

关于策略文件更安全和详细的描述请参考isakmpd.policy帮助手册和网站http:

//hem2.passagen.se/hojg/isakmpd/。

企业VPN实现案例

假设某企业总部在北京,分公司在南京,两地想通过互联网传输企业的私有信息。为了降低成本,可以利用Internet实现企业虚拟专用网,具体拓扑见图
2。

 

图2 基于Internet的企业VPN应用拓扑图

图2中两地VPN网关的公网地址是假设的。192.168.0.0

/24网段与192.169.0.0/24网段利用VPN-GW-NJ和VPN-GW-BJ之间建立的加密隧道进行通信。

为了使Linux能够适应今后的大规模VPN部署,这里使用X.509证书进行IKE认证,同时也避免了因预共享密钥泄露引起的VPN系

统安全问题。利用X.509配置IKE,可分两步进行:首先创建X.509证书;然后修改配置文件,使IKE进程使用X.509证书进行认证。

关于CA(Certificate Authority)的知识,请查阅相关资料。本文只给出实施IPSec所需X.509证书的创建步骤。

(1)创建自己的CA证书。

#openssl genrsa -out /etc/ssl/private/ca.key 1024

#openssl req -new -key /etc/ssl/private/ca.key
-out /etc/ssl/private/ca.csr

其中ca.key是CA的私钥,必须存放在安全的地方。

下一步利用CA的私钥为CA自己签署证书:

#openssl x509 -req -days 3650 -in /etc/ssl/private/ca.csr

-signkey /etc/ssl/private/ca.key
-out /etc/ssl/ca.crt

这样便拥有自己的CA证书,然后可以用该证书为其它主机签发X.509证书。

(2)为每个IPSec网关创建私钥和证书。

在网关VPN-GW-NJ上:

#openssl genrsa -out /etc/isakmpd/private/local.key 1024

#openssl req -new -key /etc/isakmpd/private/local.key
-out /etc/isakmpd/private/202.102.0.120.csr

将证书请求传给CA进行签署:

#openssl x509 -req -days 365 -in 202.102.0.120.csr -CA /etc/ssl/ca.crt

-CAkey /etc/ssl/private/ca.key -CAcreateserial
-out 202.102.0.120.crt

必须运行工具certpatch在证书中增加一些扩展项,以使它可以被isakmpd所用。

#certpatch -i 202.102.0.120 -k /etc/ssl/private/ca.key

202.102.0.120.crt 202.102.0.120.crt

将签署好的证书放在网关的/etc/isakmpd/certs/目录下,同时将CA证书ca.crt放在网关的/etc/isakmpd/ca/目录

下。

对网关VPN-GW-BJ同样执行上述步骤,将202.102.0.120改成网关VPN-GW-BJ的公网IP地址即可。

(3)编辑配置文件和策略文件。

两台VPN网关的策略文件isakmpd.policy配置为:

authorizer:"POLICY"

conditions: app_domain == "IPsec policy" &&
( esp_present == "yes" ||
ah_present == "yes")-> "true";

上述配置不是最安全的配置,应该再进一步进行安全优化。

两台安全网关的配置文件isakmpd.conf分别如图3、图4所示。

 

图3 VPN-GW-NJ的配置文件

 

图4 VPN-GW-BJ的配置文件

(4)启动isakmpd进程。

#isakmpd

(5)用相关工具验证VPN是否正常工作。

[root@wwchen isakmpd]# setkey -DP

192.169.0.0/24[any] 192.168.0.0/24[any] any
in ipsec
esp/tunnel/213.14.1.122-202.102.0.120/use
created: Dec 27 15:39:12 2003 lastused:
lifetime: 0(s) validtime: 0(s)
spid=232 seq=3 pid=4921
refcnt=1
192.168.0.0/24[any] 192.169.0.0/24[any] any
out ipsec
esp/tunnel/202.102.0.120-213.14.1.122/require
created: Dec 27 15:39:12 2003 lastused:
lifetime: 0(s) validtime: 0(s)
spid=225 seq=2 pid=4921
refcnt=1
... ...

以上为查看策略库SPD时VPN正常工作显示的内容。

[root@wwchen isakmpd]# setkey -D

202.102.0.120 213.14.1.122
esp mode=tunnel spi=3338011673(0xc6f60419) reqid=0(0x00000000)
E: 3des-cbc 033ccd02 e4430fe4 e3947652 e4a3a5a9 f2fd5514 06bec978
A: hmac-md5 54e401f0 57f1ff08 5f37f52c d2bcfa1d
seq=0x00000000 replay=16 flags=0x00000000 state=mature
created: Dec 27 15:39:12 2003 current: Dec 27 15:39:24 2003
diff: 12(s) hard: 1200(s) soft: 1080(s)
last: hard: 0(s) soft: 0(s)
current: 0(bytes) hard: 0(bytes) soft: 0(bytes)
allocated: 0 hard: 0 soft: 0
sadb_seq=1 pid=4922 refcnt=0
213.14.1.122 202.102.0.120
esp mode=tunnel spi=1733688336(0x6755fc10) reqid=0(0x00000000)
E: 3des-cbc 82acc8b0 d2c641c9 5677169d 67a4f9ed 0b7da239 6585ba29
A: hmac-md5 07a411f6 b72bcd1a aab1dbd3 da3f869b
seq=0x00000000 replay=16 flags=0x00000000 state=mature
created: Dec 27 15:39:12 2003 current: Dec 27 15:39:24 2003
diff: 12(s) hard: 1200(s) soft: 1080(s)
last: hard: 0(s) soft: 0(s)
current: 0(bytes) hard: 0(bytes) soft: 0(bytes)
allocated: 0 hard: 0 soft: 0
sadb_seq=0 pid=4922 refcnt=0

以上为查看安全关联库SADB时VPN正常工作显示的内容。

转载地址:http://dwqmb.baihongyu.com/

你可能感兴趣的文章
欧拉函数——从容斥定理和积性函数的性质谈开
查看>>
容斥原理 带禁止位的排列
查看>>
第一个JSP程序(JSP入门)
查看>>
JSP语法简介
查看>>
JavaBean入门与简介
查看>>
JSP中EL表达式入门与简介
查看>>
Spring入门实例
查看>>
Spring的几种注入方式
查看>>
Spring自动装配
查看>>
Hibernate入门与实例
查看>>
Jython入门学习
查看>>
Hiberate基础用法实例
查看>>
Maven编译时指定JDK版本
查看>>
Hibernate单向关联N-1
查看>>
Hibernate单向关联1-1
查看>>
jQuery自定义动画
查看>>
Spring-data-redis在shiro中的实例
查看>>
GUN C中__attribute__作用
查看>>
3、系统调用之SYSCALL_DEFINE分析
查看>>
linux的signal_pending及signal
查看>>