基于IPsec的虚拟专用网在Linux上的实现安装配置Word文档格式.docx
《基于IPsec的虚拟专用网在Linux上的实现安装配置Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于IPsec的虚拟专用网在Linux上的实现安装配置Word文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
RFC2401规定了IPsec的基本结构,它利用认证头标(AH)和封装化安全净荷(ESP)来实现数据的认证和加密。
前者用来实现数据的完整性,后者用来实现数据的机密性。
同时对数据的传输规定了两种模式:
传送模式和通道模式。
在传送模式中,IP头与上层协议头之间嵌入一个新的IPsec头(AH或ESP);
在通道模式中,要保护的整个IP包都封装到另一个IP数据包里,同时在外部与内部IP头之间嵌入一个新的IPsec头。
两种IPsec头都可以同时以传送模式和通道模式工作。
图1说明了分别在两种模式下的IP包。
原始的数据包
传送模式受保护
的数据包
通道模式受保护
图1处于传送和通道模式下的受IPsec保护的数据包
IPsec是由四大组件组成,它们是因特网密钥交换进程、IPsec进程本身、安全联盟数据库和安全策略数据库。
IPsec中有两个重要的数据库,分别是安全联盟数据库SAD和安全策略数据库SPD。
SAD中的每一个元组是一个安全联盟SA,它是构成IPsec的基础,是两个通信实体经协商建立起来的一种协定,它决定了用来保护数据包安全的IPsec协议、转码方式、密钥以及密钥的有效存在时间等。
SPD中的每一个元组是一条策略,策略是指应用于数据包的安全服务以及如何对数据包进行处理,是人机之间的安全接口,包括策略定义、表示、管理以及策略与IPsec系统各组件间的交互。
两个数据库联合使用。
对于发送方,每个SPD的元组都有指针指向相关的SAD的元组。
如果一个SPD的元组没有指向适合发送包的SA,那么将会创建新的SA或SA束,并将SPD的元组和新的SA元组链接起来。
对于接收方,通过包头信息包含的IP目的地址、IP安全协议类型(AH或ESP)和SPI(安全参数索引)在SAD中查找对应的SA。
SA中其他字段为序列号、序列号溢出标志、Anti-replay窗口、AH认证算法和密钥、ESP加密算法和密钥及初始化矩阵、ESP认证算法及密钥等等。
因特网密钥交换(IKE)是IPsec最为重要的部分,在用IPsec保护一个IP包之前,必须先建立一个SA,IKE用于动态建立SA。
IKE代表IPsec对SA进行协商,并对SAD数据库进行填充。
RFC2409所描述的IKE是一个混合型的协议,它建立在由Internet安全联盟和密钥管理协议(ISAKMP)定义的一个框架上,见RFC2408。
IKE使用了两个阶段的ISAKMP。
第一阶段建立IKE安全联盟,第二阶段利用这个既定的安全联盟,为IPsec协商具体的安全联盟。
IPsec进程本身就是用来实现整个IPsec的守护进程,用户可以通过和这个进程打交道来管理自己的安全策略,实现适合自己需要的网络安全。
当然,每个开发组织的源代码不一样,用户管理的界面和方式就不一样,但是它们都必须遵守RFC的规范,最终的目的都应该是差不多的。
通常,IPsec的源代码是嵌入到内核IP层源代码中的,也有人提出在其层次在IP之上,TCP之下,两种方式都可以。
3.虚拟专用网
虚拟专用网(VPN)是专用网的扩展,它的通信两端之间通过的是公用传输介质如Internet。
VPN允许你在两台计算机之间通过公共传输介质通信,就好像是自己的端到端的专用网一样。
为了模拟端到端的专用网,数据必须被加上一个路由信息头,以便能够在Internet上找到正确的路径;
同时为了数据的安全,数据包在传输过程中必须被加密。
图2说明了VPN的逻辑概念,VPN连接使用户可以在家工作或者在出差的旅途中利用公用介质如Internet来和公司总部的机器连接。
从用户的角度来看,VPN是一个VPN的客户端与服务器端的端到端的的连接,Internet等公共介质的网络结构是无关紧要的,因为从逻辑上看,数据是在专用网上传输。
VPN也可以使公司在地域上分割的各个分部之间通过Internet传输信息,信息必须在一个安全的通道中传播,从逻辑上看就像一个WAN上的专用网。
VPN的一个重要的特征就是安全性,通过VPN通信的两台主机必须通过一个安全的通道(tunnel)。
这个tunnel是逻辑上的,并不真正存在,因此通过数据的加密和认证使得数据包即使被截获也不容易破译。
如何实现这一点,以前的VPN很多的采用SSL等方法对数据进行加密,但是缺点是配置安全策略不够灵活,另外,需要在高层协议上开发大量的代码,唯一的优点就是能够对DOS(服务拒绝)攻击由较好的防御。
图2VPN的逻辑概念图
4.基于IPsec的虚拟专用网
当IPsec用于路由器时,就可以建立虚拟专用网。
在路由器的连内部网的一端,如图2所示,是一个受保护的网络,另一端则是不安全的公共网络。
两个这样的路由器建立起一个安全通道,通信就可以通过这个通道从一个本地的保护子网发送到一个远程的保护子网,这就形成了一个VPN。
在这个VPN中,每一个具有IPsec的路由器都是一个网络聚合点,试图对VPN进行通信分析将会失败。
目的地是VPN的所有通信都经过路由器上的SA来定义加密或认证的算法和密钥等参数,即从VPN的一个路由器出来的数据包只要符合安全策略,就会用相应的SA来加密或认证(加上AH或ESP报头)。
整个安全传输过程由IKE控制,密钥自动生成,保护子网内的用户根本不需要考虑安全,所有的加密和解密由两端的路由器全权代理。
我们来看看数据包的处理过程,先看看数据包的外出处理:
(1)源主机TCP层通过调用ip_output()函数,调用IP层,令其发送一个数据包给路由器;
(2)路由器针对目的主机的数据包,查询策略引擎,根据安全策略强制加上AH或ESP头;
(3)IKE处理,对没有SA的安全策略建立新的SA;
(4)SA处理,增加序列号字段;
(5)通道模式处理,通常VPN用的是通道模式,因此加上一个额外的IP头;
(6)路由器发送这个安全的数据包。
接收方的处理过程:
(1)另一端的路由器收到这个包,剥去额外的IP头,并利用数据包的AH或ESP头调用IPsec层;
(2)IPsec层从AH或ESP头摘录出SPI,从IP头中选出源和目的地址及协议;
(3)IPsec层用以上的参数从SAD中取出所需的SA,如果没找到,就丢弃这个包;
(4)SAD返回SA,IPsec将会根据AH和ESP定义的规则对这个包进行处理;
(5)验证和这个包对应的策略,进而决定IPsec处理的应用是否正确,策略是通过SA中的指针获得或利用选择符查询SPD得来;
(6)如果验证正确,那么解密并把这个包转发到真正的目的主机。
5.在Linux上的例子
我们实现的基于IPsec的VPN选用的Linux操作系统作为两端的路由器,其结构如图2所示,是一个典型的VPN结构。
两边的路由器定义了相同的安全策略,也就是说,两端的通信都遵守相同的安全规则,例如都使用HMAC-MD5算法对WWW服务进行验证,都使用TRI-DES算法对telnet进行加密等等。
IPsec的四大部分都在作为路由器的Linux机器上。
两端的路由器的IP地址分别是202.38.64.185和202.38.75.75,我们的测试方案是从64.185内的主机host1和75.75内的主机host2的ftp通信,host1和host2的有相应的域名解析,分别对应各自内部的IP地址。
公共网络是校园上的Internet网,如图3所示
图3基于IPsec的VPN在Linux上的实现环境
经过测试表明,从host1到host2的IP包全部被封装了一个额外的IP头,所有的上层协议都是经过加密的乱码,无法分析其内容,黑客获得的唯一信息就是这个包是64.185和75.75之间的通信(ESP应用TRI-DES算法)。
另外,应用TRI-DES的结果使得网络吞吐量下降了25%左右,这是由于在路由器上所做的加密和解密过程都需要耗费一定的时间。
基于IPsec的VPN实现有以下优点:
(1)在IP层增加AH或ESP头实现网络安全使得通信安全可靠;
(2)IKE协议可以自动产生需要的SA,并且SA的生存期非常短,使得破译更加困难;
(3)定义安全策略方便灵活,只需要在配置文件里进行编辑,就可以实现安全策略,例如如果一种算法被破解,立刻换另一种算法。
(目前AH支持HAMC-MD5、HAMC-SHA1;
ESP支持DES-CBC、TRI-DES-CBC、BLOWFISH-CBC、CAST128-CBC)
6.小结
IPsec的提出使得VPN有了更好的解决方案,这是因为在网络层就进行安全服务,使得密钥协商的开销被大大削减了,这是由于多种传送协议和应用程序可共享由网络层提供的密钥管理结构(IKE)。
其次,假如网络安全服务在较低层实现,那么需要改动的应用程序就要少得多。
IPsec是目前唯一一种能为任何形式的Internet通信提供安全保护的协议,因此,可以预见,未来的VPN实现方案将会更多的利用IPsec。
上一篇我们介绍了基于IPsec的VPN的基本原理,现在我们来看看具体怎么配置自己的虚拟专用网.
1.VPN的类型
关于如何组建VPN,有的公司付费购买专门的软件,而有的公司用自己的路由器来实现,因为很多路由器内嵌VPN功能.这些VPN可以像SSH隧道一样简单,也可以做的很复杂.所有的方案都有一个共同点,那就是必须在不安全的互连网创建一个虚拟的安全的隧道.VPN主要有以下类型:
IPsec
VPND
SSH
诸如一些CISCO路由器(内嵌VPN功能)
2.我推荐的选择FreeS/WAN
上面如此多的选择,为什么我要选择Linux上的FreeS/WAN(基于IPsec)来实现VPN呢?
因为从目前的应用情况看,FreeS/WAN是目前最安全的在Linux上的实现方案.它基于3DES等加密算法.另外,试验表明SSH和VPND方案缺少FreeS/WAN的某些功能,而且IPsec被越来越多的其他软件所支持,以后的兼容性更好.例如,NAI的PGPnet就和FreeS/WAN一起工作得很好.但是,我认为真正重要的一点是,它是免费的(Linux也是免费的),这对于我们国内用户来说,不用花大价钱去买专门的软件,您只需要向ISP支付一点上网费,就可以组建自己的廉价的VPN.
3.它的用途
通过Internet连接2个甚至更多的办公室(当然是两地分居的那种);
允许公司的某个职员在千里之外远程登录到公司内部网络;
在Internet上,数据是在一个虚拟的安全通道内传播;
4.安装和配置IPsec和FreeS/WAN1.5
(1)安装;
如果你的内核版本低于2.2.14,那么我强烈建议你升级到2.2.14;
可以从http:
//www.kernel.org/下载.按照你自己的要求编译内核,开始最好不要IPsec支持(以后再做).
然后到http:
//www.freeswan.org/上下载freeswan-1.5.tar.gz(七月二号出的最新版),把这个文件放到/usr/src/目录下,运行tarzxvffreeswan-1.5.tar.gz解开,这时候会出现一个新的目录/usr/src/freeswan-1.5/,所有的freeswan的源代码和各种文件都在这个目录下.
这时候切记当前目录是/usr/src/freeswan-1.5/,运行makemenugo;
在网络部分,确定所有IPsec的部分都被选上.退出菜单,保存新内核的设置,注意!
!
即使你什么也没改,也必须save,否则IPsec不会启动.
现在你需要用新的内核启动,运行
cp/usr/src/linux-2.2.14/arch/i386/boot/bzImage/boot/vmlinuz-2.2.14将bzImage移到
/boot目录下.然后运行cp/usr/src/linux-2.2.14/System.map/boot/System.map-2.2.14来创
建新的System.map文件.最后在/usr/src/linux-2.2.14/下运行makemodules;
make
modules_install.编辑/etc/lilo.conf,将新的内核放到最前面,运行lilo使之生效.
重新启动,你将会看到
IPSecrunningunderFreeS/WAN1.5willstartup
ipsec0startup
等字样,如果没有的话,说明安装不正确,需要重新安装.
(2).VPN的配置
一。
ipsec.conf文件(/etc/ipsec.conf)
现在IPsec已经装好了,我们需要用它来配置VPN.典型的,我们需要两个网关,不必
关心那个是左边的,那个是右边的,只要记住它们是一对,就好像两个克隆人.让我们看看下面的例子:
LeftNet=====LeftGate---------------------------RightGate=====RightNet
Internet
有关信息如下:
LeftNet:
192.168.1.0/24
LeftGate(internal):
192.168.1.1
LeftGate(external):
100.100.100.100
LeftName:
North
RightNet:
192.168.2.0/24
RightGate(internal):
192.168.2.254
RightGate(external):
200.200.200.200
RightName:
South
现在需要在ipsec.conf文件里创建连接.注意通信有很多种情况:
NettoNet,Left
GatetoRightNet,LeftNettoRightGate,andGatetoGate.每一个情况都必须有一个连
接来处理.我推荐你在对这些连接命名的时候最好能够反映通信情况.本例中需要5个
连接,分别是%default,NorthNet-SouthNet,NorthGate-SouthNet,NorthNet-SouthGate和
NorthGate-SouthGate.注意名字中不能有空格.配置文件中加入下面内容:
注意%default在文件中已经存在,它说明了以后的连接所用的加密或认证算法以及密钥和spi等,一般密钥需要改动.如下
#defaultsforsubsequentconnectiondescriptions
conn%default
#Howpersistenttobein(re)keyingnegotiations(0meansvery).
keyingtries=0
#Parametersformanual-keyingtesting(DON\'
TUSEOPERATIONALLY).
spi=0x200
esp=3des-md5-96
espenckey=0x01234567_89abcdef_02468ace_13579bdf_12345678_9abcdef0
espauthkey=0x12345678_9abcdef0_2468ace0_13579bdf
然后加入下面的新连接
connNorthNet-SouthNet
left=100.100.100.100
leftsubnet=192.168.1.0/24
leftfirewall=yes
right=200.200.200.200
rightsubnet=192.168.2.0/24
rightfirewall=yes
connNorthGate-SouthNet
connNorthNet-SouthGate
connSouthGate-NorthGate
注意本文件中在两个网关设置了防火墙,这是应该的,几乎没有一个VPN不用防火墙的.
现在我们确定一下在config.setup部分中的变量设置是否正确,它是如下形式
configsetup
interfaces=%defaultroute
klipsdebug=none
plutodebug=none
interfaces选项当用IPsec收发数据包是从哪个网络接口走,如果设为%defaultroute,将根据机器的路由表中的路由表项来走.当然,你也可以指定网络接口,例如
interfaces="
ipsec0=eth1"
(设为第二块网卡,偏不从第一块走).
Klipsdebug和plutodebug是用来打开或关闭调试选项,即出了问题到/var/log/messages中加入出错信息.
非常重要的一点!
两个网关的ipsec.conf的内容必须完全一致(除了configsetup部分允许有差异,如网卡的选则,conn*部分必须克隆),否则IPsec不能处理.
二。
ipsec.secrets文件
它是两个网关之间的对称加密算法的密钥.两个网关的这个文件必须完全一致.如何在两个网关之间传输密钥呢,这有点像鸡和蛋的问题,但是不用担心,数学家发明了更高级的加密算法(非对称加密如RSA),它是双方有自己的私钥和共同的公钥(坏人可以知道公钥),但是双方都不知道对方的私钥,坏人当然也不知道了.传送密钥的时候,用自己的私钥和公钥加密,对方用对方的私钥和公钥解密.不相信,去看看RSA算法.就是这么神奇.当然,也可以有别的方法,A地网关的管理人员考到小盘上,送到B地,不过嘛,有点可笑.
这个文件应该如下样子的:
100.100.100.100200.200.200.200"
jxj52SjRmUu3nVW521Wu135R5k44uU5lR2V3kujT24U1lVumWSkT52Tu11W
Vnm1Vu25lV52k4"
不用解释,你可以看出怎么配置它了.
三。
防火墙设置
假设用ipchains,下面是左边网关的例子:
ipchains-Ainput-s100.100.100.100-d0/0-jACCEPT
ipchains-Ainput-s100.100.100.100-d192.168.2.0/24-jACCEPT
ipchains-Ainput-s192.168.1.0/24-d192.168.2.0/24-jACCEPT
它允许从自己发向Internet和右边子网的包,同时允许从左边子网发往右边子网的包.
注意,ipsec.secrets和ipsec.conf的文件必须设为只有root可读,普通用户不能访问,以保证安全.
(3)测试
以上说的手工密钥的加密方式,自动密钥加密方式以后再说.
首先启动我们加的连接,如下
[root@Tiger/etc]#ipsecmanual--upNorthGate-SouthGate
[root@Tiger/etc]#ipsecmanual--upNorthGate-SouthNet
[root@Tiger/etc]#ipsecmanual--upNorthNet-SouthGate
[root@Tiger/etc]#ipsecmanual--upNorthNet-SouthNet
做完上面的,然后运