南京苏嵌教育

2024年了还有程序员不懂VPN的工作原理!那是当然的...

作者:苏嵌教育 来源:苏嵌教育
发布日期:2024年10月11日

点赞、收藏、星标不会错过精彩推送哦!什么是VPNVPN提示...

点赞、收藏、星标不会错过精彩推送哦!什么是VPN
VPN提示:ISP(Internet Service Provider,互联网服务提供商)是提供互联网接入服务的公司或组织。ISP 通过各种技术(如光纤、DSL、卫星或无线)将互联网连接到家庭或企业。由于国内的一些原因,有时候我们访问Google、youtobe等国外网站,需要通过一些代理软件才能访问,俗称科学上网。常见的代理机制包括Virtual Private Network 和 HTTP Proxy,这两种软件的工作机制是不同的,但本质上大同小异,今天我们先来聊聊 Virtual Private Network 是如何工作的,之后有机会我们再来HTTP Proxy是如何工作的。VPN(虚拟专用网络,Virtual Private Network)允许通过公共网络(如互联网)安全地连接到私有网络。它通过加密数据、隐藏用户的真实 IP 地址以及用户认证等方式来保护隐私和数据安全。VPN 常用于以下目的:保护隐私:加密用户的数据流量,防止被第三方监视或拦截。绕过地理限制:使用户能够访问被地域限制的网站或服务。安全访问:在公共 Wi-Fi 网络上安全地访问企业内网或其他受限资源。VPN主要借助以下几个手段实现上述目标:隧道化:VPN 创建一个“隧道”,在用户和 VPN 服务器之间传输数据。这个隧道确保数据在公共网络中传输时的安全性加密:VPN 通过加密协议将用户的数据加密,这样即使数据被拦截,也无法被解读。身份验证:用户和 VPN 服务器之间的连接通常需要进行身份验证,以确保只有授权用户才能建立连接。说到VPN,比较有名的软件当然是 OpenVPN,今天我们就来看看它是如何工作的。什么是OpenVPNOpenVPN是一种开源的虚拟专用网络软件,它由客户端和服务端组成,可以实现虚拟专用网络(VPN)连接。在VPN连接过程中,OpenVPN可以实现代理的功能,将客户端的请求通过OpenVPN服务器代理到目标服务器。其代理的基本过程如下:在本地运行OpenVPN客户端,配置好OpenVPN服务器地址、账号密码(或者其他认证方式)OpenVPN通过正常网络向OpenVPN服务器发起连接请求。连接建立成功后,当用户访问目标服务器时,数据请求会被本地OpenVPN客户端发拦截,经由OpenVPN客户端发往OpenVPN服务器(通常在远端)。OpenVPN服务器收到请求后,解析该请求,并路由到目标服务器。之后,目标服务器返回响应数据。紧接着,OpenVPN服务器将响应数据返回给OpenVPN客户端,而OpenVPN客户端转手将响应数据返回给用户。在此过程中,OpenVPN实现了客户端与目标服务器之间的代理。由于客户端的请求经过了OpenVPN服务器的转发,目标服务器不知道请求来自哪个客户端,保护了客户端的隐私,且OpenVPN客户端通常会对数据加密后再转发给OpenVPN服务器,OpenVPN服务器解密后再转发给目标服务器。提示:此处有个关键要点:OpenVPN服务器和目标服务器之间必须保证网络互通Linux虚拟网卡TUN与TAP机制OpenVPN背后的技术原理是操作系统提供的虚拟网卡机制。TUN (network TUNnel) / TAP (network TAP) 是 Linux 提供的的两种虚拟网络设备。该设备一端连接内核网络网络协议栈,一端连接用户态进程的一个文件描述符。用户态进程通过读写该文件来接收或者向虚拟网卡发送数据。通常会设置虚拟网卡为默认网关,这样其他用户的数据会被路由到虚拟网卡,从而被VPN进程劫持。在 Linux 系统中,TUN 和 TAP 是两种虚拟网络接口类型,它们用于实现虚拟网络设备和虚拟专用网络(VPN)解决方案。下面是对这两种接口的详细介绍:1. TUN(Network TUNnel)TUN 设备是一个虚拟网络接口,工作在 IP 层(网络层)。它主要用于将 IP 数据包从一个网络接口转发到另一个接口,通常用于创建点对点的虚拟专用网络(VPN)。特性:数据包处理:TUN 设备处理 IP 数据包。它将这些数据包从虚拟接口接收并转发到用户空间应用程序,或者从用户空间应用程序发送到网络。隧道模式:TUN 设备通常用于点对点的隧道。它将数据包在两个端点之间传递,这些端点可能是在不同的物理网络上。典型应用:TUN 设备常用于 OpenVPN 和其他基于 IP 的 VPN 解决方案。使用示例:在 OpenVPN 中,TUN 设备用于建立虚拟的 IP 网络,使得远程客户端能够像在同一个局域网一样互相通信。2. TAP(Network TAP)TAP 设备是一个虚拟网络接口,工作在 以太网 层(数据链路层)。它处理以太网帧,而不是 IP 数据包,允许更复杂的网络操作和虚拟化。特性:数据包处理:TAP 设备处理以太网帧。这使得 TAP 设备能够进行更低层次的网络操作,比如桥接和虚拟局域网(VLAN)设置。桥接模式:TAP 设备常用于创建虚拟网络桥接,使得两个或多个虚拟接口能够互相通信,就像它们在同一个物理网络中一样。典型应用:TAP 设备用于 OpenVPN 的桥接模式,支持创建虚拟局域网(VLAN)环境,使得远程客户端可以像在同一个局域网一样互相通信。使用示例:在 OpenVPN 的桥接模式中,TAP 设备用于将虚拟网络接口与物理网络接口桥接,使得虚拟网络能够与实际网络互通。3. Tun和Tap的异同Tun是三层的设备,该设备没有MAC地址,从字符设备上读取IP数据包,写入的也是IP数据包,因此不能进行二层的操作,例如发ARP包和以太网广播。Tab是二层的设备,该设备有MAC地址,处理的是数据链路层的数据帧,从字符设备上读取的是数据链路层的数据帧,写入的也是数据。在使用上面,两者都是通过字符设备的方式进行读取和写入,Tun是三层网络设备,而Tab是二层网络设备,Tun常用于VPN等技术,由于工作在IP层,无法与物理网卡做bridge,但可以通过三层交换(如  ip_forward)与物理网卡连通,Tab设备工作在第二层,收发的是MAC层数据包,拥有MAC层的功能,可以与物理网卡做bridge,支持MAC层广播。
总结TUN 设备:处理 IP 数据包。用于点对点的 VPN 隧道。常见应用:OpenVPN 的隧道模式。TAP 设备:处理以太网帧。用于虚拟网络桥接。常见应用:OpenVPN 的桥接模式。OpenVPN实现原理Tun是一个网络层设备,支持点到点的网络通信,常用于tunnel隧道和VPN的构建,tunnel技术是网络设备把网络层数据包封装到另一个协议中以跨过网络传送到另一个网络设备的处理过程,主要用于公网主机和私有网络互联互通。在Linux系统中支持多种隧道技术,其底层实现原理都是基于Tun设备。下图演示了应用进程通过VPN代理访问云端的过程:
+--------------------------------------------------------------------------------------------------------------+|                                                                                                              ||  +--------------------+      +--------------------+                 +--------------------+                   ||  | User Application A |      |    VPN Client      |<-----+          |     VPN Server     | -------------- +  ||  +--------------------+      +--------------------+      |          +--------------------+                |  ||               | 1                    | 5                 |               | 12                             |  ||...............|......................|...................|...............|................................|..||               ↓                      ↓                   |               ↑                                |  ||         +----------+           +----------+              |           +----------+                         |  ||         | socket A |           | socket B |              |           | socket C |                         |  ||         +----------+           +----------+              |           +----------+                         |  ||                 | 2               | 6                    |               | 11                             |  ||.................|.................|......................|...............|................................|..||                 ↓                 ↓                      |               ↑                                |  ||             +------------------------+                 4 |           +------------------------+        13 |  ||             | Newwork Protocol Stack |                   |           | Newwork Protocol Stack |           |  ||             +------------------------+                   |           +------------------------+           |  ||                | 7                 | 3                   |               | 10  | 15          | 14         |  ||................|...................|.....................|...............|.....|.............|............|..||                ↓                   ↓                     |               ↑     ↓             ↑            |  ||        +----------------+    +----------------+          |      +----------------+    +----------------+  |  |   |        |      eth0      |    |      tun0      |          |      |      eth0      |    |      tun0      |<-+  ||        +----------------+    +----------------+          |      +----------------+    +----------------+     ||    10.32.0.11  |                   |   192.168.3.11      |               |     |                             | |                | 8                 +---------------------+               | 9   | 16                          ||                |                                                         |     |                             |+----------------|---------------------------------------------------------|-----|-----------------------------+                 ↓                                                         ↑     ↓         Physical Network                                              Physical Network以OpenVPN配置ip隧道为例,下图是一个简图(而且是不正确的流程图),后面会详细分析每一个步骤。
公网上的两个主机节点A、B,物理网卡上配置的IP分别是ipA_eth0和ipB_eth0。在A、B两个节点上分别运行openvpn的客户端和服务端,它们都会在自己的节点上创建tun设备,且都会读取或写入这个tun设备。假设这两个tun设备配置的IP地址分别是ipA_tun和ipB_tun,再在A、B节点上分别配置到目标tun IP的路由走本机的tun接口,两者就成功建立了一条能互相通信的隧道。这里详细分析一下隧道通信的数据流程。以ping ipB_tun为例,其整体流程图如下:
其中data1和data2是什么,下面会说明。提示:上面这张图的起始点1号是从网络协议栈开始的,比较唐突,实际你可以理解成用户的网络数据被路由表路由到虚拟网卡。通过openvpn发送数据当A节点数据要通过隧道发向B节点时:用户空间执行ping ipB_tun,ping程序会请求内核网络协议栈构建icmp协议请求数据经过路由决策,该icmp协议数据要走tun0接口,于是内核将数据从网络协议栈写入tun0设备写入tun0设备之前,网络协议栈会对icmp请求数据进行封装,假设封装后的数据称为data1tun是三层设备,所以data1中只封装IP头,不封装以太网帧头,其源和目标IP分别是ipA_tun、ipB_tun注意,data1中没有封装以太网帧头OpenVPN读取tun0设备数据,将读取到的data1数据当作普通数据发向B节点的eth0地址ipB_eth0,于是data1写入到网络协议栈OpenVPN的源和目标端口(因为OpenVPN是用户服务程序)两个节点的eth0的IP地址以太网帧头(因为数据要从物理层的eth0设备出去,所以要从四层封装到二层)用户程序OpenVPN从虚拟网卡读取的数据是原封不动地data1,其中包含了内核已经封装过的IP头,OpenVPN是无法对数据进行解封的OpenVPN请求内核将data1作为普通数据发送出去,于是包含IP头的data1被写入内核网络协议栈内核经过路由决策,data1数据要从本机的eth0接口流出所以网络协议栈会对data1进行封装,假设封装后的数据称为data2data2中封装的内容包括:注意data2中有两层IP头,内层的IP头即data1中的IP头是tun设备的IP,外层的IP头是物理网卡eth0的IPdata2最终通过A的物理网卡eth0发送出去到达B节点的物理网卡eth0以上完整流程如下图:
通过openvpn接收收据A节点通过eth0发送的数据经由网络最终会到达B节点的eth0接口。当B节点的物理网卡eth0收到数据后,对比特流进行解析,得到data2数据,写入内核网络协议栈:网络协议栈会对data2解封,将以太网帧头、外层IP头和端口层剥掉,最终得到data1因为目标端口号是OpenVPN程序所监听的,所以解封后的data1数据交给OpenVPN,即内核将data1拷贝到用户空间注意,data1中完整地包含了A、B两节点中两个tun设备的源和目标IPOpenVPN程序得到data1后,发现目标IP是tun0设备的(虽然openvpn无法解封数据,但却可以分析数据),于是将data1数据从用户空间写入tun0设备(就像外界数据流入物理网卡一样),data1最终传输到tun0的另一端即内核的网络协议栈中以上完整流程如下图:
B节点的网络协议栈对data1数据解封得到*内层的ICMP协议请求数据,同时内核发现目的IP是配置在本机tun0设备上的地址,于是响应它而非丢弃该数据。B构建响应数据的过程类似于A节点构建ping请求时的流程ICMP协议位于tcp/ip协议栈中,不涉及应用层,所以直接由内核构建ping的响应数据因为解封data1时的源IP是A节点的ipA_tun,所以构建的响应目标是ipA_tun经过路由决策,该响应数据要从tun0流出,tun0是3层设备,所以只封装IP头(源IP和目标IP分别是ipB_tun、ipA_tun),而不封装帧头内核将响应数据写入tun0后,openvpn从中读取,读取后将其作为普通数据发送给ipA_eth0,于是数据写入网络协议栈,内核协议栈再次对其封装,包括端口号、两个eth0的IP地址以及以太网帧头,最终通过物理网卡eth0发送出去到达A节点  点击标题可跳转1、Unix从兴盛到衰落鲜为人知的故事2、*受初学者欢迎的Linux系统ubuntu科普3、ubuntu 20.04 界面美化,提高工作舒适度!
Linux 世界我们专注于编程知识和软件设计分享,包括但不限于C/C++、linux开发。偶尔也聊聊程序人生。长按二维码,关注我们免责声明:整理文章为传播相关技术,版权归原作者所有,如有侵权,请联系删除。
加微信咨询
徐老师 @南京苏嵌教育
微信号:151******60

专业解答各类课程问题、介绍师资和学校情况

微信咨询
相关资讯
你有什么事是当了程序员之后才懂的? 程序员失业送外卖,已经写入书籍成为被嘲笑的案例了。。。 大厂人在偷偷找回周末,究竟是人性的觉醒还是道德的升华 职业发展抉择,回归故土还是留守都市 2025年的金三银四跳槽季是否还存在
相关课程