OpenVPN 基于 OpenSSL 来实现安全,但是却不是传统意义上的 SSLVPN,它只是一个普通的 VPN,工作在 IP 层而不是传输层。
VPN 的含义着重点有两层意思,一个是 V,也就是虚拟,另一个是 P,也就是专用。
虚拟就是说不用物理布线,仅仅在逻辑上实现一个网络,虚拟网络之所以能实现并建立起来,靠的是分层模型的优势,分层模型直接将网络按照逻辑意义纵向分成了7个层次(或者 TCP/IP 的5个层次),每一层都仅仅承载数据而不管数据的格式和内容,上下层次间仅仅通过接口和服务来通信,理论上任何层次的数据都可以被承载在其它的任何层次或者它当前的层次上,于是就出现了很多 XX over YY 的网络模型,比较典型的比如 ppp over ethernet 等。
over 模型按照数据层次可以分为三类,第一类是上层数据承载于下层,这实际上就是我们使用的普通的 TCP/IP 模型,第二类是同层承载,比如上面说的 pppoe,这一类构建方式主要是为了在一个以传输占主导的层次上增加一个非传输意义的逻辑或者说实现一个隧道,比如 pppoe 中,ethernet 主要用于局域网传输,而且性价比十分合理,但是却缺乏认证机制,但是 ppp 协议的认证功能虽然很好,但是却缺乏多点通信和寻址能力,作为传输协议意义不大,于是就使用 ethernet 进行传输,使用 ppp 进行认证,另外一个同层承载的例子是 IPSec 的隧道模式,它将一个 IP 数据报封装于另一个 IP 数据报中,这样实际上也就实现了一般意义上的“虚拟局域网络”(注意不是vlan),因为在数据报到达最终目的地之前,参与路由的始终是外层的 IP 头,内层的 IP 头连同真实数据都被外层 IP 当成了 data,因此不参与路由,所以从隧道的出发路由器到结束路由器,不管中间经过的是局域网,广域网还是别的什么,内层的 IP 数据报一直“以为”自己在出发路由器的那个局域网内,因此就实现了一个虚拟网络,实现了 VPN 中的 V,那么 P 呢,IPSec 将 V 和 P 做到了一起,也就是说在实现 ip over ip 的过程中实现了安全,这就是熟知的 ah 协议和 esp 协议,实现了安全才能保证专用,否则别人都可以进入你的虚拟网络了,作为 VPN 来说,IPsec 就到此为止,但是 IPSec 的用处不光如此,IPSec 主要是保证 IP 数据报的安全(因为 IP 层不提供任何安全保护,ipv6 就不一样了,完全不需要 IPSec),VPN 只是它的隧道模式的一个应用,除了隧道模式,IPSec 还有传输模式,不建立隧道,只是将认证或者加密的功能置于 IP 数据报中,当然也就是不需要 ip over ip了。
众所周知 IPSec 的隧道模式实现的 VPN 有一个缺陷,那就是很难穿越 nat,因为 nat 要修改 IP 头,一旦 IP 头被修改了,那么最终的 ah 或者 esp 的认证加密的校验结果就会出错,因此就不能随意在 nat 的网络环境中使用 IPSec 实现的 VPN,当然不涉及 IP 头认证的 IPSec 协议还是可以用的。
难道 VPN 就 IPSec 这一根稻草了吗?认证和加密的逻辑十分复杂和多样,不适合在 IP 层做,IP 层做好快速路由和连接不同子网就够了,如果将分层模型的每个层次仅仅当作一种交通工具来看待的话,问题就容易解决了,交通工具或者叫运输工具可以相互运输,大卡车可以运小卡车,也可以拆了被小卡车运,大卡车还可以运输别的大卡车,它们都可以被放入集装箱被轮船运输,分层模型就是这样的,我们可以让应用层或者表示层或者传输层来承载 IP 数据报,这也就是 over 模型的第三类,即上层承载下层,很多时候越往上层逻辑越复杂,实现越灵活,如果想要在低层次实现高度复杂的逻辑,不妨试试这种模型,这个意义上看,IPSec 实现的 VPN 最后肯定不如 ip over ssl 好,因为扩充 IPSec 很难,毕竟它在协议栈中的位置不适合做大幅修改,但是 ssl 的扩展性却很好,它本身就在协议栈的顶端,即使影响也就影响应用层,比如迫使 http 转换到 https。
如果说底层就不该有复杂多样且多变的逻辑这种设计思想是对的,那么 IPsec 就不该出现,IPv6 除了扩充地址空间外,新增的功能净加重了 IP 层的负担,IPv6 的复杂设计净是商业公司为了推自己的接口或者设备而使出的伎俩,不过也说不准,留给历史评述吧。
VPN 不一定要实现隧道,只要能互相访问并且保证互访者独占性的网络理论上都是 VPN,然而隧道的方式更具有代表性,各种实现也更丰富和花哨。