VPN基本原理-疫情下远程办公
- 2020 年 4 月 1 日
- 筆記
最近由于新型冠状病毒的影响,大部分企业都难以复工。庆幸可以从事IT相关行业,虽然不能复工,但是可以通过VPN来连接企业网络进行远程在家办公。当然最近的VPN申请也是异常火爆,在这里我们整理一下VPN的基本工作原理。
对于VPN我们最基本的使用需求是,在自己家里的网络连接企业的私有网络,从而访问私有网络的资源和服务。General总结一下,就是一个私有网络通过public internet访问另一个私有网络。主要涉及到以下几个items:
- VPN隧道
- Tunnel network device(隧道网络设备)
- VPN软件
- Overall访问流程
VPN隧道:
VPN一般使用的是网络隧道原理,什么是隧道呢,就是把一个网络数据包作为payload放入另一个网络数据包里,比方tcp in udp,udp in tcp等。为什么需要隧道呢,因为从一个私有网络访问另一个私有网络,源IP和目标IP都是私有地址,并且这两个网络不互通,也没有专线直连,public internet也不允许私有IP地址路由。所以我们把原始网络包放入另一个网络包中,而另一个网络包都是公网IP,可以完成公网的路由,送到目的网路之后在进行拆包完成访问。从内部网络包角度看,是给它穿了一个可以路由公网的马甲,从外部网络包角度看,就是内部的俄罗斯套娃。我们以tcp in udp为例子讲述,下面是两个示例图:


- 第一个图是典型的tcp数据包,包含tcp的源ip,目的ip,源端口,目的端口。当然在VPN实现中,目的ip为目标私网的ip地址,源ip为源私网的ip地址。
- 第二个图是隧道数据包,整体是udp数据包,udp的payload为整个tcp包。udp目的ip为host VPN系统的server公网地址,目标端口为VPN系统server公网port。源udp端口为源私有网络的NAT公网地址,源udp端口为随机available端口。
Tunnel network device(隧道网络设备):
Tunnel network device是操作系统os上的一种特殊的网络设备,它最重要的特性就是一端连接os网络协议栈,另一端可以被运行在用户空间应用程序监听读写。从操作系统网络协议栈发送数据到这个设备,数据会直接进入监听这个设备的应用程序,在应用程序里修改网络数据包(例如上面的马甲或者俄罗斯套娃操作)。从应用程序写入这个设备的数据,会直接进入内核空间的网络协议栈,在协议栈中做封包,路由转发。
在不同的操作系统下,实现这个目的也会有不同的方式或者设备,我们这里以linux系统为例。在linux系统中TUN/TAP就是这样的设备,只不过TUN设备针对的是三层数据包,即ip包,TAP设备针对的是二层数据包,即以太包。
- linux TUN device:Linux TUN device是一种网络设备,它可以有自己的ip地址,其最重要的特性就是可以被应用程序监听读写,被监听读写的对象为三层ip数据包。
- TUN device一端连接网络内核空间,另一端连接用户空间的应用程序。
- 用户空间的应用程序有能力通过TUN device读写修改三层ip数据包。
- 数据从内核空间进入TUN device的时候,该设备会把数据交给用户空间的应用程序,使得应用程序有机会根据自己的逻辑修改ip数据包。
- 用户空间的应用程序可以把数据发给TUN device,该设备会把数据交由内核空间进行路由转发。
VPN软件:
VPN软件就是负责监听上面介绍的隧道网络设备的应用程序,在VPN的客户端(例如我们自己的工作电脑)完成封包(上面介绍的马甲或者俄罗斯套娃操作)。在VPN的服务端,也就是外层数据包(一般为udp包)目标ip所在的服务端上解包(类似与脱马甲或者拆套娃的操作),然后把原始数据包(一般为tcp包)写入操作系统内核网络空间,由操作系统完成路由转发。
Overall访问流程:
下图展示了一个简单的VPN overall访问流程:

- 有私有网络private network one和private network two。
- 在private network one里的设备需要访问private network two里的target server。
- private network one里的设备运行VPN软件,原始数据包发送到os的网络协议栈,如上流程1。
- 设备有路由表把上面的数据本地转发给隧道网络设备,如上流程2。
- 根据隧道网络设备的特性,该数据会被VPN软件监听到,从而进入VPN软件的用户空间里,如上流程3。
- VPN软件修改原始数据包,完成上面的穿马甲或者俄罗斯套娃操作。这时内层数据包的原始ip和目标ip分别为两个私有网络的ip地址,外层数据包的目标ip地址为目标私有网络的NAT公网地址。然后将数据写入隧道网络设备,根据该设备特性,数据进入os内核空间的网络协议栈。如上流程4和流程5。
- 在os内核空间的网络协议栈转发到priavte network one的路由中,并在该路由器再次完成路由转发到priavte network one的公网出口网关,如上流程6。
- 数据在public internet上路由到priavte network two的公网入口网关,如上流程7。
- 数据被转发到priavte network two中运行VPN软件的服务器上,并进到VPN软件中,如上流程8。
- 在VPN软件中完成拆除外层数据包的操作,即脱去马甲和拆俄罗斯套娃操作,如上流程9。
- 拆除外层数据包之后,VPN软件将原始数据包写入隧道网络设备,该设备将数据发送到os的内核网络协议栈。然后在os的内核网络协议栈中做路由转发,转发到priavte network two的路由器中,如上流程10。
- 在priavte network two的路由中再次完成路由转发,将数据发送到目标服务器,如上流程11。
以上仅仅是VPN工作的大致原理简化,实际生产级软件远比这复杂,除了上面最基本的通讯之外还有身份认证,数据加密,访问限制等等。对于VPN软件的客户端,安装在不同的操作系统上也有不同版本,而且实际生产中的网络环境也比以上复杂的多,以上仅仅是最简单的简化,目的是可以直观的了解VPN基本工作原理,欢迎大家讨论学习。