关于VPN的一些总结和理解
- 前言
- 一、VPN的概述
- 二、VPN的原理
- 2.1 原理概述
- 2.2 虚拟网卡
- 2.3 点对点隧道的建立
- 三、其他
- 3.1 vpn和vlan的区别?
- 3.2 vpn和web代理的关系?
- 参考
前言
同样的机缘巧合,最近看了一些关于vpn的内容,总结一下,正好作为这个月的技术博客记录吧。
一、VPN的概述
第一次听说VPN是在大概大二的时候(当时还和VLAN弄混了),一开始不知道是干啥的,只知道班里有些接触比较广的同学率先用这种技术开启了“科学上网”的大门。后来慢慢了解到,这是一种可以探索“墙外”世界的工具。
VPN的真实定义是虚拟专用网(Virtual Private Network),这种技术可以追溯到1996年。当时的微软员工为了创建了PPTP(点对点加密协议),通过加密数据并在 LAN 或 WAN 连接上形成隧道来在用户之间创建安全网络。 使用这种技术可以让员工在家中安全的访问公司的网络,其核心在我看来有两点,一是隧道,而是安全。(当然它们之间是有联系的)
后来技术不断发展,出现了越来越多的VPN底层协议L2TP/IPsec、SSL、PPTP、SSTP)等等,这些协议各有特点,各位看官请自行查阅,在此就不过多说明了。
在实际应用中,VPN主要用在远程连接公司网络或者充当安全代理,访问“墙外”的世界。
二、VPN的原理
2.1 原理概述
关于VPN的基本工作原理,核心的技术在我来看有两点,一个是封装,一个是加密。
前者通过在协议栈的IP层或者数据链路层封装一层额外的地址信息来构建两个结点之间的隧道。打个不确切的比方,就像下图中所示的那般,两个App之间的通信需要通过guarder的中转,当数据从App1流向App2之时,目的地已经从App2换成了guard2。当数据到达guard2之后,再由guard2将数据发给App2。(当然实际情况有些出入)。
如果仅仅只有封装的话,裸露的隧道将会暴露在公共网络上,数据很容易泄露,因此基本的隧道协议都包括加密部分,即数据经过加密之后才会传送到隧道上进行传输。“穿上衣服,进行打扮完之后”的数据安全性自然提高不少。
2.2 虚拟网卡
下面以openvpn为例,详细的介绍数据包在两个结点及openvpn之间的流程,主要涉及的是上一小节所述的封装和解封装的过程。
说到openvpn的工作原理,还需要了解叫做虚拟网卡设备的东东。所谓虚拟网卡设备是操作系统用软件模拟出来的设备,它和真实的物理网卡类似,可以收发数据。不同的是,一般来说真实网卡联系的是网络和本机的内核协议栈,而虚拟网卡联系的是应用程序和内核协议栈,其关系如下图所示。
对于Linux来说其虚拟网卡设备是TUN/TAP,在新建虚拟网卡设备时,操作系统会建立一个与之对应的字符设备/dev/net/tun,写入字符设备/dev/net/tun的数据会发送到虚拟网络接口中;发送到虚拟网络接口中的数据也会出现在该字符设备上。
如上图所示,应用程序可以向字符设备写入数据,则虚拟网卡会随着接收到这些数据包,就像从外部网络传来的数据那样,虚拟网卡会把这些数据交给内核的协议栈进行处理(这一般来说,这些数据需要经过协议栈的拆包,解封装,所以如果数据不符合协议栈的协议规则,则协议栈可能会把数据丢掉); 同时,应用程序也可以通过系统的Socket,将数据经过内核协议栈写入虚拟网卡,虚拟网卡会把数据写入到响应的字符驱动,就像传到了外部网络一般。
关于虚拟网卡的一些内容,就简要介绍这些。详细的内容可以查看资料【2】【3】。
2.3 点对点隧道的建立
openvpn服务的架构如下图所示。
在使用时一般需要在请求侧安装openVPN的客户端,在服务侧安装openVPN的服务端。请求通过客户端的封装加密后发往服务侧,在服务侧的openVPN程序接收到请求后经过解封装和解密等步骤后交给上层的服务提供者(或者转发给内网的提供服务的结点)。
openvpn点对点隧道的具体走包流程如下图所示。
左边的应用程序充当客户端,右边的应用程序充当服务端。这里解释一下流程。
对于左边:
- 左边的程序通过内核协议栈(可能是使用socket套接字)将数据发往虚拟网卡TUN。在这个过程中内核协议栈会将数据包添加TCP层的端口、IP层的IP地址。注意,这里的源IP和目的IP是客户端的和服务端的虚拟网卡地址。
- 虚拟网卡设备接收到数据之后,会发往字符设备/dev/net/tun。
- 监听的VPN客户端程序会从/dev/net/tun设备中读取这些数据,并进行加密。注意这里加密的数据是整个数据包,包括地址部分。
- VPN客户端将数据再次通过内核协议栈发往Eth0物理网卡。在这个过程汇中会进行第二次的协议封装(包括TCP层的端口、IP层的IP地址),这里还包括链路层的MAC地址。注意,这里的IP地址是源主机和目的主机(运行openVPN服务端的机器)的物理网卡的IP地址。
- 经过加密的数据通过隧道在公共的网络上面路由,转发,最终转发到目的主机。
对于右边:
- 当目的主机的物理网卡接收到数据之后,经过内核协议栈的解析,将协议报头进行剥离(包括物理链路层、IP层、和传输层)发送给监听的openVPN服务端程序。
- openVPN服务端程序将数据部分进行解密,然后发给对应的字符驱动。这个过程中openVPN服务端会根据解密形成的目的虚拟网卡(目的Tun)的地址找到对应的字符驱动。
- 字符驱动收到数据之后,会转发给对应的虚拟网卡。
- 虚拟网卡收到数据后,就像从外部网口收到的数据一样,将数据再次转发给内核协议栈。
- 内核协议栈对数据进行解析,将相关的报头(内层的地址信息)进行剥离,最终将请求的数据转发给真实的应用程序。
懂了?瞅瞅下面这幅图,检测一下呗。
三、其他
3.1 vpn和vlan的区别?
一开始的时候就把这两个概念搞混了,vpn指的是虚拟专用网,一般用于远程连接。vlan指的是虚拟局域网,大多用于把物理上隔离的主机,组成逻辑上联系的局域网。一般需要交换机或者路由器的支持。如下图所示为vlan的示意图。
3.2 vpn和web代理的关系?
从底层流量的传输路径来看,vpn和web代理都是通过一次中转,来达到访问远程服务的目的。但是一般来说,前者工作在网络的数据链路或者网络层,后者工作在应用层。即前者通过更改数据报文(封装解封装)来实现中转,后者通过请求转发来实现(类似于收到请求->解析->充当代理客户端,发起目标服务的请求)。如下图所示为web代理的示意图。
还有一个不同在于,一般来说vpn更强调加密性,一般中间传输的数据都是经过协议加密的;而web代理相对来说对加密的关注较少,安全性较弱。
参考
【1】A Brief History of VPNs
【2】理解Linux虚拟网卡设备tun/tap的一切
【3】Linux Tun/Tap 介绍
【4】https://www.junmajinlong.com/virtual/network/data_flow_about_openvpn/#post-comment
【5】What’s the Difference Between a Proxy and a VPN?
【6】VPN 和代理服务器在实现方法上有什么区别?
【7】OpenVPN简介及架构详解
【8】Virtual Private Networks: How They Work And Why You Might Need One