关于VPN的一些总结和理解

关于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点对点隧道的具体走包流程如下图所示。
在这里插入图片描述
左边的应用程序充当客户端,右边的应用程序充当服务端。这里解释一下流程。
对于左边:

  1. 左边的程序通过内核协议栈(可能是使用socket套接字)将数据发往虚拟网卡TUN。在这个过程中内核协议栈会将数据包添加TCP层的端口、IP层的IP地址。注意,这里的源IP和目的IP是客户端的和服务端的虚拟网卡地址。
  2. 虚拟网卡设备接收到数据之后,会发往字符设备/dev/net/tun。
  3. 监听的VPN客户端程序会从/dev/net/tun设备中读取这些数据,并进行加密。注意这里加密的数据是整个数据包,包括地址部分。
  4. VPN客户端将数据再次通过内核协议栈发往Eth0物理网卡。在这个过程汇中会进行第二次的协议封装(包括TCP层的端口、IP层的IP地址),这里还包括链路层的MAC地址。注意,这里的IP地址是源主机和目的主机(运行openVPN服务端的机器)的物理网卡的IP地址。
  5. 经过加密的数据通过隧道在公共的网络上面路由,转发,最终转发到目的主机。

对于右边:

  1. 当目的主机的物理网卡接收到数据之后,经过内核协议栈的解析,将协议报头进行剥离(包括物理链路层、IP层、和传输层)发送给监听的openVPN服务端程序。
  2. openVPN服务端程序将数据部分进行解密,然后发给对应的字符驱动。这个过程中openVPN服务端会根据解密形成的目的虚拟网卡(目的Tun)的地址找到对应的字符驱动。
  3. 字符驱动收到数据之后,会转发给对应的虚拟网卡。
  4. 虚拟网卡收到数据后,就像从外部网口收到的数据一样,将数据再次转发给内核协议栈。
  5. 内核协议栈对数据进行解析,将相关的报头(内层的地址信息)进行剥离,最终将请求的数据转发给真实的应用程序。


懂了?瞅瞅下面这幅图,检测一下呗。
在这里插入图片描述

三、其他

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/30050.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

go+vue自建运维管理平台

文章目录 鲁班运维平台容器管理集群管理namespace管理节点管理工作负载存储管理网络管理配置管理事件中心 kuboard 鲁班运维平台 这个平台和spug很像,感觉就像是spug运维平台的容器版本。 但是如果是容器平台则选择的余地很大,优秀的如kubersphere、kub…

LeetCod刷题笔记

目录 2739.总行驶距离 思路:模拟 代码 6890.找出分区值 思路:急转弯 代码: 1254.统计封闭岛屿的数目​编辑 思路:DFS 代码: 6447.给墙壁刷油漆 思路:动态规划 代码: 思路:状态DP 代码&…

Rust in Action笔记 第四章生命周期、所有权、借用

第四章用了一个行星通信的例子来阐述整个主题,主要角色有地面站(Ground station)、人造卫星(CubeSat),两者有不同的状态并且能互相发消息通信; Rust有类型安全(type safety&#xf…

WinDbg安装入坑1(C#)

由于作者水平有限,如有写得不对的地方,请指正。 使用WinDbg的过程中,坑特别的多,对版本要求比较严格,如: 1 32位应用程序导出的Dump文件要用32位的WinDbg打开,想要没有那么多的问题&#xff…

传统机器学习算法解析(opencv实现)

前言 文本主要解析在传统机器学习当中一些小的算法与思想,只是传统机器学习算法当中的一小部分,更多传统机器学习算法可参考我的另外几篇博客 链接1: PCA主成分分析 链接2: Canny边缘检测算法 链接3: K-Means聚类算法 链接4: SIFT算法分析 1. opencv …

农村饮水安全政策要求与解决措施

农村饮水安全,是指农村居民能够及时、方便地获得足量、洁净、负担得起的生活饮用水。农村饮水安全包括水质、水量、用水方便程度和供水保证率4项评价指标。 一、农村饮水安全问题 农村饮水安全问题一直是农村发展的重要问题。在过去,由于农村供水设施落…

Linux之多线程(下)——线程控制

文章目录 前言一、POSIX线程库1.概念2.pthread线程库是应用层的原生线程库3.错误的检查 二、线程控制1.创建线程——pthread_createpthread_create函数例子创建一个新线程主线程创建一批新线程 2.获取线程ID——pthread_self3.线程等待——pthread_join4.线程终止——return、p…

Flutter的状态管理之Provider

Provider简介 Flutter Provider是Flutter中一个非常流行的状态管理库,它可以帮助开发者更加方便地管理应用程序中的状态。Provider提供了一种简单的方式来共享和管理应用程序中的数据,并且可以根据数据的变化来自动更新UI界面。 Provider的核心思想是将…

C# 自动更新(基于FTP)

效果 启动软件后,会自动读取所有的 FTP 服务器文件,然后读取本地需要更新的目录,进行匹配,将 FTP 服务器的文件同步到本地 Winform 界面 一、前言 在去年,我写了一个 C# 版本的自动更新,这个是根据配置文…

qt学习——基本使用、对象树、按钮、信号与槽

初识qt **qt****qt命名规范以及相关快捷键的使用****QPushButton****对象树****点击按钮关闭窗口****信号和槽****标准的信号和槽****自定义信号和槽****带参数的自定义信号和槽传参以及函数的二义性问题****信号和槽的拓展****qt4的信号与槽****QDebug的输出转义问题****lambd…

STM32 Proteus仿真自动刹车系统超声波测距电机控制-0042

STM32 Proteus仿真自动刹车系统超声波测距电机控制-0042 Proteus仿真小实验: STM32 Proteus仿真自动刹车系统超声波测距电机控制-0042 功能: 硬件组成:STM32F103C6单片机 LCD1602显示器HCSR04超声波传感器按键(加 减)电机蜂鸣器 1.单片机…

Qt编写视频监控系统76-Onvif跨网段组播搜索和单播搜索的实现

一、前言 在视频监控行业一般会用国际onvif工具来测试设备是否支持onvif协议,工具的名字叫ONVIF Device Manager(还有个工具叫ONVIF Device Test Tool,专用于程序员测试各种数据交互),可以自行搜索下载,此…

04-编织灵魂旋律:Golang 函数的魔力绽放

📃个人主页:个人主页 🔥系列专栏:Golang基础 💬Go(又称Golang)是由Google开发的开源编程语言。它结合了静态类型的安全性和动态语言的灵活性,拥有高效的并发编程能力和简洁的语法。G…

通过共享内存进行通信(嵌入式学习)

通过共享内存进行通信 概念特点函数示例代码 概念 在Linux中,共享内存是一种进程间通信(IPC)机制,允许多个进程共享同一块内存区域。这种通信方式可以提供高效的数据传输,特别适用于需要频繁交换数据的场景。 IO间进…

为CentOs配置静态IP

目录 第一步:查看物理机IP 第二步:虚拟机网络设置 点击虚拟机->编辑虚拟机设置 第三步:CentOS网络配置文件 第四步:重启网络 第五步:测试网络 为什么要设置静态IP 在安装好CentOS虚拟机以后,一般我…

程序替换原理

文章目录 一、程序替换 一、程序替换 程序替换用于将当前进程的用户空间的代码和数据全部替换为新程序的代码和数据,程序替换不会创建新进程,而是用当前进程执行新程序的代码,fork 创建子进程后,子进程默认执行的是父进程的代码&…

vue2和vue3的渲染过程简述版

文章目录 vue2渲染过程vue3渲染过程优化和扩充 vue2和vue3对比 vue2渲染过程 在Vue 2的渲染过程中,包括以下几个关键步骤: 解析模板:Vue 2使用基于HTML语法的模板,首先会将模板解析成抽象语法树(AST)&…

K8s 部署 Apache Kudu 集群

一、K8s 部署 Apache Kudu 集群 安装规划 组件replicaskudu-master3kudu-tserver3 1. 创建命名空间 vi kudu-ns.yamlapiVersion: v1 kind: Namespace metadata:name: apache-kudulabels:name: apache-kudukubectl apply -f kudu-ns.yaml查看命名空间: kubectl …

JUC高级-0614

5.LockSupport与线程中断 5.1 线程中断 蚂蚁金服面试题:如何中等一个线程,如何停止一个线程什么是中断机制 首先:一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止。所以,Thread.stop, Thread.…

【spring源码系列-06】refresh中obtainFreshBeanFactory方法的执行流程

Spring源码系列整体栏目 内容链接地址【一】spring源码整体概述https://blog.csdn.net/zhenghuishengq/article/details/130940885【二】通过refresh方法剖析IOC的整体流程https://blog.csdn.net/zhenghuishengq/article/details/131003428【三】xml配置文件启动spring时refres…