在虚拟与现实之间穿梭-VPN
当你问某个移动用户:“我在咖啡馆想边喝着咖啡边接收公司的电子邮件和访问公司内网办公。如何能保证安全地访问互联网?” 知识渊博的他会回答:“用VPN呀!” 是的,用VPN!VPN是一种通过互联网把公司的私有网络和远程网络安全地连接起来的虚拟逻辑网络技术,可以简称为虚拟专用网络技术。任何人如果想从VPN中间获取数据,那都是无法读懂的,因为数据进行加密。VPN不是进行远程连接中出现的第一个技术。二十世纪末,最普遍的做法是使用专线,例如用ISDN把多个不同办公地区的计算机连接起来。但是互联网发展得非常快,ISP还提供了快速安全的VPN方案,它比专线便宜多了。公司利用这种方法建立起只允许员工使用的虚拟内部网络,使在远程办公区或家中的内部员工通过桌面共享技术就可以在一起工作。
更有意思的是我们可以DIY自己的VPN服务器。曾经听说过这么一个项目是用CentOS的OpenVPN服务器实现的。一个阿拉斯加的公司老板是一个狂热的天文爱好者。他在新墨西哥州购买了一个度假物村,在村中建了一个小型的天文观测台。该观测站内有一台电脑能控制伸缩圆顶、望远镜以及室外视频监控摄像头。VPN帮他实现了强大的远程控制功能。
由于望远镜系统是在互联网上运行的,具有远程访问权限,从阿拉斯加就可以控制在墨西哥州的望远镜、可以远程监控天文台和度假屋、能够远程重启和设置天文台内外分布在LAN上的所有设备。
在天文台中安装的是一台微型PC(Mini-ITX规格)系统,运行CentOS的LinuxOpenVPN,通过sshd访问互联网。第二台微型PC在他的阿拉斯加家中。在两台电脑之间建立一个持久的VPN连接。新墨西哥州的家和天文台建筑物之间用8端口或16端口以太网交换机以及6类线缆把所用设备连接起来,交换机通过光纤与互联网相连。6类电缆作为连接房内基础电源管理开关和天文台的客户端电源管理开关之间的线路。通过移动电话按键就可以控制连接在8口交换机之一的电源管理开关来独立启动每个设备,6类线缆还把这种控制能力扩展到天文台的客户端管理开关。虽然这个项目听起来不算小,但是一台CentOSOpenVPN服务器就能完全胜任此项工作。在企业环境中一台这种服务器可以为200多个客户提供VPN服务。还有用于承载VPN和SSH远程访问的企业及软件也是免费的,这个方案相当划算。
虽然VPN种类不少,但可以明确划分为以下两类:站到站接入和远程接入。站到站接入包含IPSEC、MPLS VPN和GRE,是由传统广域网接入演变,成对管理,扩展配置相对复杂,例如把总公司网络和分公司的网络虚拟连接起来。远程接入包含IPSEC、SSL VPN、L2TP、L2TP/IPSEC和PPTP,有拨号演变过过来,按用户管理,扩展性比较好。下表比较清晰地列出了各种VPN技术的特点。
表15.3
功能
PPTP
IPSec
L2TP
L2TP/IPSec
SSL VPN
部署
很少
广泛
很少
有限
广泛
加密
MMPE
DES、3DES、AES
MPPE
DES、3DES、AES
DES、3DES、AES、RC4-128、RC4-40
工作层
二层
二层/三层
二层
二层/三层
七层
类型
远程接入
站到站、远程接入
远程接入
远程接入
远程接入
特点
基本均内置于windows系统,缺乏广泛性
需要安装客户端
内置于较新的windows及iOS
内置于较新的windos,iOS可通过安装相关包文件支持
可选择无客户端(clientless)模式及有客户端模式
安全性
低
高
低
高
高
IPSec是目前应用最为广泛的VPN技术。IPSec可在IP层提供保护,并且IPSec可同时支持站到站模式及远程访问模式。IPSec采用DES、AES、3DES算法,可以保证数据的完整性及安全性。IPSec在Linux上支持主要有两个主要的分类,一为FreeS/WAN,现在已经停止开发,其分裂为两个项目,Openswan与Strongswan。
SSL是近年来兴起的VPN技术。SSL属于远程接入协议,可以存在3种部署模式:
无客户端模式(Clientless):提供对电子邮件及部分资源远程访问,不需安装任何程序或者客户端。
瘦客户端模式:通过在客户端安装java程序或插件,提供基于TCP的访问。
全隧道模式:通过SSL客户端,使客户端与企业内部建立一条隧道,使得访问者逻辑连接在企业网。SSL-Based VPN其主要代表有OpenVPN。
L2TP本质上是一种隧道传输协议,它使用两种类型的消息:控制消息和数据隧道消息。控制消息负责创建、维护及终止L2TP隧道,而数据隧道消息则负责用户数据的真正传输。L2TP支持标准的安全特性CHAP和PAP(2种身份验证协议),可以进行用户身份认证。在安全性考虑上,L2TP仅定义了控制消息的加密传输方式,对传输中的数据并不加密。因安全性低,企业较少的部署使用。
如果不得已使用L2TP VPN,为了弥补其安全性的缺陷,需要使用三层加密,即IPSec,这种VPN被称为基于IPSec的L2TP。首先用户会建立IPSec会话,然后再IPSec加密通道内建立L2TP会话。这样可以确保数据在Internet上的安全性和可靠性。
PPTP提供PPTP客户机和PPTP服务器之间的保密通信。通过PPTP,客户可以采用拨号方式接入公共的IP网。拨号客户首先按常规方式拨号到ISP的接入服务器,建立PPP连接。在此基础上客户进行二次拨号建立到PPTP服务器的连接,该连接称为PPTP隧道。PPTP把建立隧道的主动权交给了客户,但客户需要在其PC机上配置PPTP,这样做既会增加用户的工作量,又会造成网络的安全隐患。另外,PPTP仅工作于IP,不具有隧道终点的验证功能,需要依赖用户的验证。 PoPTop可以说是PPTP在Linux下的实现。不过,IPSec上跑L2TP更安全。
几种VPN方式进行比较之后发现,IPSec和SSL VPN方式应用最广泛。我们先了解一下IPSec标准,然后在Linux服务器上配置符合IPSec协议标准的OpenSwan软件。IPsec协议不是一个人在作战,它是应用于IP层上网络数据安全的一整套体系结构,包括网络认证头AH(Authentication Header)协议、封装安全载荷ESP(Encapsulating Security Payload)协议、因特网密钥交换IKE(Internet Key Exchange)协议和用于网络认证及加密的一些算法等。AH协议提供数据源认证、数据完整性校验和防报文重放功能,它能保护通信免受篡改,但不能防止窃听,适合用于传输非机密数据。ESP协议提供加密、数据源认证、数据完整性校验和防报文重放功能。ESP的工作原理是在每一个数据包的标准IP包头后面添加一个ESP报文头,并在数据包后面追加一个ESP尾。
在实际进行IP通信时,可以根据实际安全需求同时使用AH和ESP两种协议或选择使用其中的一种。IPsec有传输和隧道两种工作模式。传输模式只是传输层数据被用来计算AH或ESP头,AH或ESP头以及ESP加密的用户数据被放置在原IP包头后面。隧道模式更常用一些,在两个安全网关之间一般采用隧道模式进行通讯。隧道技术就是利用封包和解包技术,在公用网络上建立一条安全的数据通道(隧道),让数据包通过这条隧道传输。用户的整个IP数据包被用来计算AH或ESP头以及ESP加密的用户数据被封装在一个新的IP数据包中。
图15.18 VPN隧道技术
从公众的角度来看,在整个数据包之外又加了一个保护层,保证了数据在一个虚拟的隧道中移动。这层我们叫encapsulation,在隧道两端的计算机或网络设备我们叫tunnel interfaces。这种技术在网络数据处理上很常用。为了更好地理解隧道协议,我举个形象地比喻。想象一下,有个供应商通过快递公司给你运送一个很重要的包裹。供应商把包裹(用户协议)放在一个盒子(隧道协议)里,快递员把盒子放在卡车(传输协议)里送到仓库(隧道接口)。卡车(传输协议)在高速公路(互联网)上行驶送到你家(另一个隧道接口)。你打开盒子(隧道协议)取出包裹(用户协议)。这样你应该明白了吧。
IPSec VPN中最著名的人物应属Openswan。它自带有IPsec内核堆栈KLIPS,更方便的是可以使用2.6内核中的堆栈代码。如果使用2.6及以上内核,不用打补丁NAT就能启作用。Openswan已经内建对x.509和NAT Traversal的支持,使用起来非常的方便。 下载openswan软件包后只要make programs install就可以搞定,然后用ipsec verify命令来检验安装是否成功。
Openswan支持net-to-net和RoadWarrior两种模式。net to net模式是网关对网关的通讯。所在的Linux主机为通讯的网关,作为其子网的出口,对于子网的用户来所是透明的,远程的子网在通讯后可以像自己的局域网一样的访问。RoadWarrior模式客户端对网关的连接方式,例如公司员工带着笔记本电脑出差或在家,需要用IPSec连接到公司的内部网络。
为了讲述方便,假设我们现在有四台Linux主机。也你可以用VMWare架设虚拟主机方法来实现。网络拓朴示意图如下:
图15.19 VPN隧道技术
网络服务器Left的内网接eth0接口,地址是192.168.1.2,外网接eth1接口,地址是192.168.0.2,子网客户机PC A属于192.168.1.0/24这个局域网,IP地址为192.168.1.3。网络服务器Right的内网接eth0接口,地址是192.168.2.2,外网接eth1接口,地址是192.168.0.3,网客户机PC B属于192.168.2.0/24这个局域网,IP地址为192.168.2.3。
一般来讲我们主要从认证、密钥和加密这三个方面考虑安全机制。使用者与设备身份认证技术最常用的是用户名与密码或令牌认证等方式。通过VPN接入设备与AAA服务器、LDAP服务器或者动态密码服务器集成提高认证的准确性与安全性。密钥管理主要有SKIP和ISAKMP两种技术,他们的主要任务是保证在公用数据网上安全地传递密钥而不被第三方窃取。在SKIP中,工作密钥是通过种子密钥和随机数经过Diffie-Hellman算法计算而来,真正加密数据的密钥是不在网络上明文传输的,而且在一个新的连接中工作密钥也是不一样的。在ISAKMP中,双方都有公钥和私钥两把密钥通过双钥加密的技术发送给对方。加解密技术是数据通信中一项较成熟的技术,分为对称式加密和非对称式加密。对称式加密算法用的比较广泛的有DES、3DES和AES等,AES比DES支持更长的密钥,比DES具有更强的安全性和更高的效率。非对称加密算法中加密和解密使用不同的一对key。一个叫公钥,一个叫私钥,公钥与私钥是有关系的。用公钥加密的数据包需要用其对应的私钥解密才能得到明文。非对称加密算法例如RSA,它比对称加密要慢100到1000倍。VPN可直接利用上述现有加解密技术。
Openswan支持许多不同的安全认证方式,包括RSA keys、pre-shared keys或x.509证书方式,主要有ipsec.conf和ipsec.secrets两个配置文件。
RSA密钥方式:
在Left和Right服务器里,分别执行以下命令目的是生成一个新的RSA密钥对。
ipsecnewhostkey –output /etc/ipsec.secrets
然后
Left:ipsecshowhostkey --left>> /etc/ipsec.conf
Right:ipsecshowhostkey --right >rightrsasigkey.tmp
scprightrsasigkey.tmproot@left:/etc/rightrsasigkey.tmp
Left:cat /etc/rightrsasigkey.tmp>> /etc/ipsec.conf
scp /etc/ipsec.conf root@right:/etc/ipsec.conf
我们使用上面的命令来来回回地拷贝,究竟是为什么?主要目的就是要在left服务器的ipsec.conf文件上要有right服务器的rsasigkey值,反之亦然。配置文件类似是这样的:
……
30 conn ?fault
31 authby=rsasig
32 compress=yes
33
34 #关掉Opportunistic Encryption
35 include /etc/ipsec.d/examples/no_oe.conf
36
37 conn net-to-net
……
61 left=192.168.0.2
62 leftsubnet=192.168.1.0/24
……
80 right=192.168.0.3
82 rightsubnet=192.168.2.0/24
……
92 leftrsasigkey=0sAQ...
93 rightrsasigkey=0sAQ...
……
110 auto=add
x.509数字证书方式:
基于PKI(Public Key Infrastructure,公钥基础设施)构架的x.509数字证书方式更灵活,不必要一个一个地都记住长长的rsasig。在ipsec.conf中需要填入以下信息:
leftrsasigkey=?rt
rightrsasigkey=?rt
letcert=xxx.pem
rightcert=xxxx.pem
虽然填入证书文件名就行,但是前期你是要做很多功课的。在Left服务器上使用openssl生成根证书、Left和Right服务器证书,把文件拷贝到ipsec.d下相应的目录下,并通过安全渠道(scp、软盘或ftp等方式)把证书等文件拷贝到Right服务器上。在完成了ipsec所属的两个配置文件的配置工作之后,我们就可以在两个服务器上用“ipsec auto --up network-to-network”命令启动VPN。
VPN的隧道建立过程是VPN A向VPN B发起连接请求,B收到后初始化ipsec隧道的建立;IKE第一阶段认证对等体,并为ipsec协商建立一条安全隧道;IKE第二阶段完成ipsec协商,并建立ipsec隧道;一旦隧道被建立,可以开始被保护的VPN通信;当没有流量使用ipsec时废弃隧道,一种是明确地废弃隧道,另一种要是通过SA的生存周期超时来废弃隧道。我们使用ipseceroute或ipsec look命令检查隧道建立情况。如果命令返回信息里有了tun信息,我们就在192.168.1.0/24和192.168.2.0/24这两个局域网内的两个主机之间互相ping一下。嗯,没有ping通?这时候我们得用iptables检查一下防火墙的配置。
如果服务器开了iptables来做IP伪装(MASQUERADE)或NAT,就不能让MASQUERADE或NAT替你转发到Right服务器下的子网数据包,使用下面的命令防止nat竞争转发:
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -d ! 192.168.2.0/24 -j MASQERADE
RoadWarrior模式呢?它与Net-to-Net模式的认证和配置方法很类似,只是配置内容项有所区别。因为通讯的主机处于固定的位置上,net-to-net模式Left和Right是相同的,而在RoadWarrior配置,Left就是自己(Local),Right就是远程主机(Remote)。所以我们看上去,两个配置文件的Left和Right值是相反的。这个是RoadWarrior配置的关键。
使用Windows系统的人很多,让windows客户端通过Linux的IPSec VPN网关进行网络访问是很非常有用的。在Windows上,下载ipsec工具,例如Marcus Müller的ipsec.exe和Linsys IPSec Tool的lsipsectool.exe等,然后生成和导入证书,配置和运行IPSec服务。记住密钥要转化成Windows可以识别的p12格式哦。
SSL VPN是指应用层的VPN。用户利用浏览器内建的Secure Socket Layer封包处理功能,用浏览器访问公司内部SSL VPN服务器,然后透过网络封包转发的方式,让用户可以在远程计算机执行应用程序,读取公司内部服务器数据。它采用标准的安全套接层(SSL)对传输中的数据包进行加密,从而在应用层保护了数据的安全性。
随着移动互联网的流行,SSL VPN发展非常迅速。3G手机通过SSL VPN方式就可以访问企业资源。采用SSL VPN接入方式,具有极强的用户认证授权保护,同时数据的传输是强加密的,密钥是经过动态协商的,能够防止信息传输被恶意篡改。但是还是有人担心东西保存在手机上不保险。不用担心,有了云计算和云存储提供远程服务后,终端上只是桌面级的操作,不含任何企业的应用和数据,这样具有更高的安全保障。
还有另外一个应用场景,使用SSL VPN手段穿越GFW。OpenVPN是一位善于伪装的情报员,在你自己的国外主机上安装了一个OpenVPN,网站的操作例如FTP文件服务、pop &smtp邮件收发以及在google查技术资料就畅通无阻了。下面我们来看看他是如何伪装的。
OpenVPN是一个开放源码的基于SSL的VPN系统,仅仅使用UDP协议,支持从NAT设备后的连接。运行在Linux上的openvpn需要tun、openssl和LZO几个软件的支持。我们还要做一些配置工作。
首先使用openvpn的clean-all和build-ca命令初始化PKI,然后使用build-key-server server生成服务器key,使用build-key client1生成某个客户端的密钥,使用build-dh生成Diffie Hellman参数。在制造了一堆钥匙之后,我们把在easy-rsa目录下生成的keys(例如:ca.crt, ca.key, client1.crt, client1.csr, client1.key, dh1024.pem, server.crt, server.csr和server.key等)打包后通过scp或ftp等手段搞到本地。
要想使openvpn服务器工作,还得根据实际情况配置好openvpn拥有的server.conf,包括本地IP,根证书、服务器证书、服务器私钥和Diffiehellman参数的存放的路径和文件名和VPN服务器子网等。如果你在中国需要访问一些域名被封掉的网站,可以通过在国外搭建的openvpn服务器把DNS push到你的客户机上。假设服务器的IP地址为10.8.0.1,那么在server.conf中加入:
push "dhcp-option DNS 10.8.0.1"
push "dhcp-option DNS 8.8.8.8"
并在服务器/etc/resolv.conf文件中加入:
nameserver8.8.8.8
Linux系统一般都带有私有的DNS服务器,使用/etc/init.d/named start开启DNS服务。
除了配合openvpn自身的配置,还需要设置路由。例如使用如下命令,才能透过VPN访问Internet。
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j SNAT --to-source a.b.c.d
同时,需要记住把ip forward打开,可使用如下命令实现:
sysctl -w net.ipv4.ip_forward=1
SSL VPN比IPSsec VPN访问控制粒度要细。由于IPSEC VPN部署在网络层,因此,内部网络对于IPSec VPN的使用者来说是透明的,只要是通过了IPSec VPN网关,就可以任意访问内网中的资源。SSL VPN重点在于保护具体的敏感数据,针对不同的客户端指定不同的等级和权限。我们对OpenVPN服务端进行用户权限配置,而不需要修改客户端配置文件。例如在server.conf增加:
1 #10.8.0.0是给所有VPN客户端的IP段;
2 server 10.8.0.0 255.255.255.0
3 #10.8.1.0是给管理员分配的IP段;
4 server 10.8.1.0 255.255.255.0
5 #10.8.2.0就是给特定用户组分配的IP段;
6 server 10.8.2.0 255.255.255.0
7 #下面是定义服务器读取特殊客户端配置文件的目录为ccd;
8 client-config-dirccd
有上面的基础,在ccd目录下可以对指定的客户进行特殊的定义,例如:
sysadmin1:ifconfig-push 10.8.1.1 10.8.1.2
contractor1: ifconfig-push 10.8.2.1 10.8.2.2
contractor2: ifconfig-push 10.8.2.5 10.8.2.6
万事具备只欠东风,启动Openvpn就可以支持SSL VPN访问了。参考命令如下:
openvpn --config /usr/local/etc/server.conf
在Windows和Mac OS X上都可以装openvpn客户端,下载安装后配置client.ovpn文件,并将打包的key文件(ca.crt、ca.key、client1.crt、client1.csr和client1.key)解压到openvpn文件夹下。启动openvpn客户端点击connect即可享受vpn服务了。打开MSN、QQ、IE等网络应用,也可以尝试访问一些被GFW禁掉的网站,有点小激动。