虚拟网卡通过实现一个字符设备来支持物理层,这样应用层和物理层就通过这个字符设备联系起来了,从这个字符设备读出来的就是虚拟网卡发往物理层的字节流,写入字符设备的数据作为字节流被虚拟网卡接收,虚拟网卡下面不再是网线或者无线电波,而是一个字符设备,这样从字符设备读出的还是写入字符设备的都是物理层字节流了,用它来实现隧道再简单不过了,VPN 程序读取字符设备,得到封装好的原始数据,然后用 SSL 再封装后发往 VPN 的对端,和 loopback 的最初尝试一样,实现配置一条路由,使得要通过隧道的数据从虚拟网卡流出,最终通过虚拟网卡的字符设备导入应用层的 VPN 进程。
有了虚拟网卡,VPN 隧道可以如上述很简单的实现,那么还有什么额外的工作要做呢?由于虚拟网卡的物理层可以通过字符设备随意读写,那么一台机器也就被虚拟成了两台机器,VPN 进程可以被设想为运行在另一台机器上,而这台机器有一个网卡连接真实的机器,该网卡就是虚拟网卡,于是问题就转化成了两台机器通信的问题,这个很好办,完全通过路由就能搞定,因此额外的工作基本没有,并且我们也避开了抓包,代理等降低性能又很难扩展的概念。虚拟网卡实现的隧道非常灵活,需要做的仅仅是安装一个虚拟网卡驱动,然后配置一下路由即可,一切尽在我们所熟悉的 route 命令中搞定。数据流向见下图:
其实 IP 网络本身就是一个虚拟的网络,任何不通过导线直接相连通信的网络都是虚拟网络,难道 IP 网不是构建在各种局域网,广域网,电信网,电视网等物理网络之上的虚拟网络吗?按照分层的观点,pstn 都可以看成是虚拟网络,VPN 作为虚拟网络的意义更特殊罢了,而且实现的也各式各样,甚为巧妙。
ip over ssl 没有触动协议栈,也没有增加新的协议,利用 SSL 的灵活性将 IP 封装的更加安全了,SSL 比 IPSec 要灵活得多,应用层的 SSL 本身可配置性就比较好,不仅仅可以实现 IPSec 中 dh 密钥协商,还可以使用很多 pki 的优秀特性。开源软件一向不会放弃任何优秀的东西,OpenVPN 就是用上述思想完成的,实际上 OpenVPN 几乎没有做什么,就是一个整合,整合什么呢?通读代码发现就是配置虚拟网卡,配置路由,读写字符设备,用 OpenSSL 的库进行 SSL 协议封装,几乎全部都是现有的东西,然而经过 OpenVPN 的整合就成了一个稳定又高效的 VPN 软件。