关于VPN的一些总结和理解

news2024/11/11 13:15:50

关于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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NVM安装使用

电脑重装了系统,需要重新安装软件应用,顺便记录一下安装过程。 NVM是一个Node的版本管理工具,通过NVM可以方便的切换Node的版本 安装 下载,去github下载 Releases coreybutler/nvm-windows 运行安装程序 使用 接下来使用…

局域网内海量文件快速复制方法

遇到的问题:最近需要不同磁盘和服务器间大文件(一个文件夹几十 T,里面有很多小文件)的快速复制,直接通过默认复制卡死。 解决方法:FastCopy,官网:FastCopy ,测试速度能能…

vue2旧项目 极速打包实践

背景 公司项目的体量较大,每次serve需要1分钟左右,build需要3分多钟,这是在电脑资源空闲时的速度,如果浏览器开了10几个标签啥的,更慢了。每次改点东西打包发测试环境都很难受。 项目技术栈 // package.json{"d…

百万粉丝都在看的Python上手教程----滚雪球学Python

前言: Hello大家好,我是Dream。 今天为大家带来一本书:《滚雪球学Python》 一起来看看吧~ 《滚雪球学Python》之所以这样命名本书,是希望大家用滚雪球的思维学习编程语言,“滚”的第一遍,从全局掌握Python技…

大话Stable-Diffusion-Webui-动手开发一个简单的stable-diffusion-webui(三)

文章目录 原理文生图API组件的输入TypeScript响应式数据文生图API调用Axios安装使用配置代理文生图API调用调用结果处理图片渲染安装swiper代码仓库原理 上一篇内容中,我们已经将文生图功能的整体UI界面设计好了,这一篇内容将通过调用sd的API,使得我们设计的UI与sd进行联动…

多域名实现单点登录详解

Hi I’m Shendi 多域名实现单点登录详解 简介 在很久以前给自己的网站制作了登录系统,但因为个人备案等原因没有需要用到登录的地方,于是就没有特意去完善这部分功能,仅仅是将用户部分抽取出来作为一个微服务 最近编写一个转换工具&#xf…

unittest教程__认识unittest(1)

unittest是python内置的单元测试框架,具备编写用例、组织用例、执行用例、输出报告等自动化框架的条件。 使用unittest前需要了解该框架的五个概念: 即test case,test suite,test loader,test runner,test fixture。 …

【多线程】锁策略、CAS、Synchronized

目录 常见的锁策略 乐观锁 vs 悲观锁 悲观锁: 乐观锁: 读写锁 重量级锁 vs 轻量级锁 自旋锁(Spin Lock) 公平锁 vs 非公平锁 可重入锁 vs 不可重入锁 CAS 什么是 CAS CAS 是怎么实现的 CAS 有哪些应用 1) 实现原子类 2) 实现自…

从0到1使用NodeJS编写后端接口的实战案例(仅供参考)

目录 一、项目简介 1、使用技术 2、实现的主要功能 3、项目结构 二、开发环境准备 1、安装node.js 2、安装 MYSQL 数据库 3、安装 node.js 的 mysql 驱动 4、安装 Express 框架 5、Node 格式化时间模块Silly-datetime 6、安装 nodemon 三、后端代码 1、入口文件 —…

帝国cms城市分站系统开发:首页友情链接和分站友情链接分开调用

第一步:phome_enewslink 增加myarea字段 字段类型:int,长度6,非null字段,默认值0 或者在帝国cms后台执行 sql语句: alter table [!db.pre!]enewslink add myarea int(6) not null; 第二步:修…

二次封装NavLink(React实现)

实现思路: 1、定义一个普通组件 2、普通组件内使用NavLink 3、传递参数给定义的普通组件并实现效果 代码实现: App.jsx import React, { Component } from "react"; import About from "../src/Pages/About"; import Home fro…

Vivado全版本下载分享

Vivado是由Xilinx公司开发的一款用于FPGA设计和开发的综合设计环境。它包括了高层次综合(HLS)、逻辑设计、约束管理、IP核管理、仿真、综合、实现和调试等功能,支持面向最新FPGA器件的设计。 这里分享一下Vivado的电脑安装配置推荐&#xff…

性能测试调优模型、思想和技术

最近阅读《软件性能测试、分析与调优实践之路》一书,个人认为性能调优章节为整部书的精华,该章节包括了性能测试调优模型、调优思想和调优技术。下面是摘抄整理自书中内容: 调优模型 下图为互联网中常见的用户请求的分层转发和处理的过程&a…

Echarts前端可视化库使用教程

Echarts介绍 ECharts是一个使用 JavaScript 实现的开源可视化库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Safari等),底层依赖矢量图…

XSS跨站脚本攻击及防护

目录 一、初识XSS跨站脚本 1.1 XSS玫击概述 1.2 XSS漏洞攻击本质 1.3 XSS攻击的危害 1.4 XSS玫击原理 1.5 XSS攻击过程 1.6 XSS攻击特点 1.6.1 间接攻击 1.6.2 可更正性 1.6.3 传播性强 二、XSS攻击与防护 2.1 XSS攻击分类 2.1.1 存储型XSS 2.1.2 反射型XSS 2.1…

OpenCV(图像处理)-基于Python-形态学处理-开运算、闭运算、顶帽、黑帽运算

1. 形态学2. 常用接口2.1 cvtColor()2.2 图像二值化threshod()自适应阈值二值化adaptiveThreshod() 2.3 腐蚀与膨胀erode()getStructuringElement()dilate() 2.4开、闭、梯度、顶帽、黑帽运算morphologyEx() 1. 形态学 OpenCV形态学是一种基于OpenCV库的数字图像处理技术&…

React学习笔记(二)组件详解(上)

一、组件的概念: 当你开始学习 React 的时候,你会了解到 React 组件是 React 应用程序的基本构建块。组件是一个隔离的、可重复使用的代码块,由 HTML 元素、其他组件或自定义的 UI 元素组成,组件也就是react的核心思想&#xff0c…

python Flask web项目uwsgi + nginx部署

1.安装python 略 2.虚拟环境 2.1安装vertualenv pip3 install virtualenv2.2创建虚拟环境 创建保存环境的目录: mkdir venvs创建虚拟环境: [rootroot /]# virtualenv /home/xxx/venvs/flask2 --pythonpython3查看虚拟环境: [rootroot…

破万亿!英伟达的市值

文章目录 破万亿 🤨 英伟达的市值🤨 英伟达市值几近破万亿🤖 ChatGPT 伪造 6 个法律案例🗡️ AI 巨头的呼吁,是真担心还是想垄断?🏠 硅谷诈骗犯开启女性监狱新家📈 美国房价春季反弹…

有趣的图(五)(59)

小朋友们好,大朋友们好! 我是猫妹,一名爱上Python编程的小学生。 和猫妹学Python,一起趣味学编程。 今日主题 咱们今天继续学习图的应用,这些算法都是实际问题抽象出来的。 举个例子吧! 下面6个城市&a…