0%

揭密OpenVPN工作原理

由于国内的一些原因,有时候我们要下载些代码,比如WebRTC、Chrome等,必备要通过一些代理软件才能将它们下载下来。

常见的代理软件包括Virtual Private Network 和 HTTP Proxy,这两种软件的工作机制是不同的,今天我们先来聊聊 Virtual Private Network 是如何工作的,之后有机会我们再来HTTP Proxy是如何工作的。

说到 Virtual Private Network,比较有名的软件当然是 OpenVPN,今天我们就来看看它是如何工作的。

什么是OpenVPN

OpenVPN是一种开源的虚拟专用网络软件,它由客户端和服务端组成,可以实现虚拟专用网络(VPN)连接。在VPN连接过程中,OpenVPN可以实现代理的功能,将客户端的请求通过VPN服务器代理到目标服务器。

其代理的基本过程如下:

  • 首先,OpenVPN客户端通过虚似专用网络向VPN服务器发起连接请求。
  • 连接建立成功后,当用户访问目标服务器时,数据请求会由OpenVPN客户端发往OpenVPN服务器。
  • VPN服务器收到请求后,解析该请求,并路由到目标服务器。
  • 之后,目标服务器返回响应数据。
  • 紧接着,VPN服务器将响应数据返回给OpenVPN客户端,而OpenVPN客户端转手将响应数据返回给用户。

在此过程中,OpenVPN实现了客户端与目标服务器之间的代理。由于客户端的请求经过了VPN服务器的转发,目标服务器不知道请求来自哪个客户端,保护了客户端的隐私。

TUN与TAP模式

在OpenVPN中有两种工作模式,一种称为 TUN(tunnel)模式,即通道的意思;另一种是TAP(Terminal Access Point)模式,即一种网络设备或软件虚拟设备的意思。

TUN模式是一种虚拟点对点的网络设备模式。通常用于实现点对点(即主机到主机)虚拟专用网络(VPN)。在TUN模式下,OpenVPN会创建一个虚拟网络接口(通常称为tun0),通过该接口发送和接收IP包。TUN模式通常用于路由网络流量,因此其只能够处理IP层(OSI模型中的第3层)数据包,不能处理链路层(OSI模型中的第2层)数据包。

TAP模式是一种以太网桥设备模式。通常用于实现一点对多点(即主机到局域网)虚拟专用网络(VPN)。在TAP模式下,OpenVPN同样会创建一个虚拟网络接口(通常称为tap0),不过该接口与NAT模式下的接口不同,它可以接收和发送以太网帧,就像一个物理的以太网接口一样。TAP模式可以处理链路层数据包,因此它可以传输多种类型的网络包,如IP、ARP、NetBIOS等。

一般来说,TUN模式更适合用于远程访问,因为它可以更好地控制网络流量,并且可以提供更好的性能。而TAP模式更适合用于网络扩展,因为它可以模拟真实的局域网,并且可以传输多种类型的网络包

因此,我们访问外网是都是使用的TUN模式。

基本工作原理

当我们打开OpenVPN与服务端建立连接后,OpenVPN首先会创建一个虚似网络接口tun,之后使用TLS协议与服务端建立好连接。

连接建立好后,用户(应用程序)在向目标主机发送数据包时,传输到网层的数据包会被tun虚拟网络接口截获。

当tun虚拟接口截获数据后,它将为截获的数据进行加密等一系列操作,之后再将数据传给真正的网络设备,在我这里就是 eth0

eth0收到数据后,经网络路由,路由到OpenVPN服务端。服务端收到数据后进行解密,再根据目标地址将数据转交给目标主机。

目标主机收到请求后进行处理,之后将处理结果返回VPN服务器。VPN服务器再将数据返回到发送主机。

以上就是OpenVPN的基本工作原理。

如何截获本地数据包

这里有同学可能会好奇,OpenVPN是如何截获用户的数据包,将其发往VPN服务器,并最终传给目标主机的呢?

其实非常简单,当使用VPN时,OpenVPN会向本地路由表中添加一个表项,如下所示:

1
2
3
4
5
Internet:
Destination Gateway Flags Netif Expire
0/1 10.8.0.1 UGScg utun10
default 192.168.1.1 UGScg en1
...

其中 0/1的含义是,将整个网络分成两个大的网段,第一个网段是从 0.0.0.0 到 127.255.255.255,第二个网段是从 128.0.0.0 到 255.255.255.255。

由于路由规定,具体网段路由的优先权大于默认路由,因此整个网段被分成了两个具体的网络后,其优先权就大于 defulat路由了。所以,所有属于这两个网段的IP包都会被路由到utun10网关,又由于utun10就是VPN网关,因此就保证了所有数据都走了VPN链路。

总之,当我们在客户端建立好VPN连接后,本地路由表中就增加了0/1这一路由项,从而使得所有的数据都通过VPN出去了。

小结

通过上面的分析,大家应该清楚OpenVPN到底是如何工作的了。我想对于很多同学来说,理解其工作原理的难点是不知道OpenVPN是如何截获网络数据包的,实际上就是通过增加一个本地路由配置,从而达到的截获数据包的。

欢迎关注我的其它发布渠道