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

关于VPN的一些总结和理解相关推荐

  1. Site-to-Site VPN配置和调试实践:构建安全的远程网络连接

    Site-to-Site VPN配置和调试实践:构建安全的远程网络连接 [实验目的] 理解Site to Site VPN的含义. 掌握Site to Site VPN的含义. 验证配置. [实验拓扑 ...

  2. lvs原理, 只改 ip 不改端口, vpn arp tcp 隧道 (子网掩码作用和局域网传输)

    思考问题角度: 0. 前置数据和条件 1. 正常流程 2. 一个人多次,多个人多次 3.每个对象身上的状态 对于 lvs : 1.正常流程: client:  ip地址. 每次传输时 mac 地址获取 ...

  3. 你不会真的以为自己懂得计算机网络吧?

    原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 思维导图 简介 上一期我讲到了数据结构怎么学,当时我的学习方法是先看视频,再看书,然后刷一刷基础算法题做巩固. 作为一个非科班考研党, ...

  4. HCIP第十三天笔记

    1.BGP的路由过滤 (1)通过路由策略来进行过滤 ①抓取流量 [r1]ip ip-prefix aa permit 172.16.1.0 24 ②配置路由策略 [r1]route-policy aa ...

  5. android vpnservice SSTP 协议在连接过程遇到的问题

    前景:接到项目需求时候没有冷静的分析需求在android 开发者网站搜了搜看到有相关资料看到有vpn的连接方式 就以为可以了开干了 没有想清楚协议这块的问题 客户这边提供了三种协议方式 PPTP L2 ...

  6. 教程篇(7.0) 12. FortiGate安全 SSL安全隧道 ❀ Fortinet 网络安全专家 NSE 4

     在本节课中,你将学习如何配置和使用SSL VPN.SSL VPN是一种让远程用户访问你的私有网络的简单方法.  本节课,你将学习上图显示的主题.  通过展示理解VPN概念的能力,你将能够更有效地理解 ...

  7. 深入理解SSL VPN

    名词解析: SSL (Secure Socket Layer,安全套接字层 ) TLS(Transport Layer Security,传输层安全协议) TLS 1.0是IETF(Internet ...

  8. 在实践中深入理解IP协议

    本文为我个人计划撰写的博客专题<在实践中深入理解常见网络协议>中关于IP协议的一篇,有兴趣的朋友可以继续关注我的博客,我将会陆续撰写各种协议的实践分析文章. TCP/IP协议栈其实当然不止 ...

  9. 对家庭网络设备行业的理解

    本人从事网络设备开发,本文观点限行家庭网络设备的开发,尤其指家用无线路由器(以下行业所指代或以此为出发点).限于作者水平,必然存在理解的局限,请多包涵和指摘. 一.行业发展的动力 主要为802.11协 ...

最新文章

  1. 15.3 动态类型安全
  2. dart 乘方运算符_Dart系列-运算符
  3. 1.5编程基础之循环控制 03 均值 python
  4. 《Python编程从入门到实践》记录之第7章 用户输入(input)和while 循环总结(思维导图)
  5. ControllerShutdownRequest分析
  6. python sys.modules
  7. ACCESS常用数字类型的说明和取值范围
  8. [原创]jQuery的this和$(this)
  9. lpush和rpush的区别_redis数据类型之list-lpush,rpush讲解
  10. 【算法工程师】成为一名优秀的机器学习算法工程师所需知识及资料汇总-附思维导图
  11. 想不想制作一个Coreldraw 蝴蝶结呀这个是非常详细的教程
  12. cpuz测试分数天梯图_怎么看CPU性能排行 CPU天梯图2018年5月最新版 (全文)
  13. 手写操作系统(2)——代码是怎么运行的?
  14. go的close函数理解
  15. 给函数取一个“好”名字
  16. Google Earth Engine(GEE)扩展——制作的GEE app的误区
  17. postman interceptor抓取cookie
  18. java基础[接口]
  19. 核音智言 | 数字孪生IOC,助力城市治理智能高效!
  20. python实现语音朗读

热门文章

  1. 什么是真正的流程管理?流程管理的是与不是。
  2. ANDROID手表怎么设置壁纸,表盘背景随心换 果壳智能手表换壁纸教程
  3. 为什么win11系统远程连接服务器出现问题
  4. 一个月面试了15家公司我吐了!!!(面试题整理)
  5. 如何预测百威啤酒销量?数据竞赛冠军笔记分享 思路
  6. vscode git拉下来后LF CRLF问题
  7. centos7启动盘制作
  8. 2.4 找准位置,水滴石穿
  9. 2019史上最全java面试题题库大全800题含答案
  10. BigDecimal乘以100的几种方法 及性能测试