虚拟专用网络(Virtual Private Network,VPN)能够在不使用专用物理连接的情况下,将一个虚拟的网络扩展到全网,因此所有连接到 VPN 中的设备可如同物理连接到同一私有网络中一样,发送并接收数据。如果个人设备使用 VPN 接入目标私有网络,这种方式也叫作远程访问 VPN;当 VPN 用来连接两个远程网络的时候,被称为 site-to-site VPN。
远程访问 VPN 可以将特定设备与一个静态 IP 连接,设备如同远程办公室中的一台电脑;但是对于移动设备来说,更常用的是可变网络连接和动态地址的配置方法。这样的配置通常被称为 road warrior 配置,而且是 Android VPN 中最常用的配置。
为了保证通过 VPN 传输数据的私密性,VPN 一般会使用一个安全隧道协议以认证远程客户端并实现数据保密。由于 VPN 协议需要同时在多个网络层工作而且为了兼容不同的网络配置,常常需要进行多层封装,所以非常复杂。对于 VPN 的详细讨论超出了本书范围,但是在下面几节中会简单介绍主流的 VPN 协议。
PPTP
Point-to-Point Tunneling Protocol(PPTP)使用 TCP 的信道来建立连接,并使用 Generic Routing Encapsulation(GRE)隧道协议来封装 Point-to-Point Protocol(PPP)的数据包。支持的认证方法有密码认证协议(Password Authentication Protocol,PAP)、握手问题认证协议(Challenge-Handshake Authentication Protocol,CHAP)和微软扩展 MS-CHAP v1/v2,以及 EAP-TLS。其中当前仍然被认为安全的只有 EAP-TLS。
PPP 的载荷可以使用微软点对点加密(MPPE)协议进行加密,其中使用了 RC4 流加密方法。因为 MPPE 并不支持任何密文认证,所以无法防范位翻转(bit-flipping)攻击。除此之外,RC4 加密近年来也出现过多次问题,大大减弱了 MMPE 和 PPTP 的安全性。
L2TP/IPSec
二层隧道协议(Layer 2 Tunneling Protocol,L2TP)类似于 PPTP,工作在数据链路层(OSI 模型中的第二层)。因为 L2TP 本身并不提供任何加密或者保密功能(依赖于隧道协议实现这些特性),L2TP VPN 一般使用 L2TP 和 IPSec 协议套件的组合实现,由 IPSec 完成认证,进行机密性和完整性的保证。
在 L2TP/IPSec 的配置中,首先会使用 IPSec 建立一个安全信道,然后 L2TP 隧道将会在这个安全信道之上建立。L2TP 的包会被封装到 IPSec 包中,因此保证了安全。IPSec 的连接需要建立一个安全关联(Security Association,SA),这是密钥算法和模式、加密密钥和建立安全信道所需的其他参数的组合。
SA 使用网络安全关联和密钥管理协议(ISAKMP)建立。ISAKMP 不会定义一个特殊的密钥交换方法,而是使用人工指定的预先共享的密钥或者使用网络密钥交换(IKE 和 IKEv2)协议。IKE 使用 X.509 证书进行对方身份的验证(与 SSL 类似),并使用 Diffie-Hellman 密钥交换创建一个共享密文,并使用其生成实际的会话加密密钥。
IPSec Xauth
IPSec 扩展认证(Xauth)对 IKE 进行了扩展,包含了额外的用户认证交换。这样就允许使用一个已存在的用户数据库或者 RADIUS 架构来认证远端请求访问的客户端,并且能够集成双因素认证。
Mode-configuration(Modecfg)是另一个 IPSec 扩展,经常被用于远程访问场景。Modecfg 可以让 VPN 服务端向客户端推送网络配置信息,比如私有 IP 地址和 DNS 服务器地址。如果同时使用 Xauth 和 Modecfg,能够生成一个纯 IPSec 的 VPN 解决方案,不需要使用任何额外协议进行认证和隧道操作。
基于 SSL 的 VPN
基于 SSL 的 VPN 使用 SSL 或者 TLS 建立安全连接和网络数据传输隧道。然而并不存在一个标准来定义基于 SSL 的 VPN,所以为了建立安全信道并封装数据包,在不同实现中会使用不同的策略。