OpenVPN工作原理解析:从虚拟网卡TUN设备到SSL加密隧道的全过程揭秘

简单介绍下 OpenVPN (虚拟专用通道),因为小编之前工作中需要熟悉它的源码,当时看的时候就简单记录了一下重点之处以及其工作的原理,所以想分享出来,让不熟悉的小伙伴们一起学习下~
OpenVPN 简介
VPN 技术通过密钥交换、封装、认证和加密,打造了一个安全的隧道,使得数据在公共网络中传输时能保持完整、私密和有效。而 OpenVPN 作为一个开源项目,提供了一种新颖的 SSL VPN 解决方案。
传统的 SSL VPN 通过端口代理来实现,代理服务器根据不同的应用协议(比如 HTTP、Telnet 等)进行端口转发,客户端与代理服务器之间建立 SSL 安全连接,然后所有的数据都通过代理服务器转发给应用服务器。但这种方法有些麻烦,并且有很多局限性:它只适用于 TCP 固定端口的应用,而且每个需要代理的端口都得单独配置;对于像 FTP 这种需要动态端口的协议,还得重新开发;更重要的是,它无法支持 TCP 以外的协议;而且代理服务器前面的防火墙也得随时根据代理端口的变化做相应调整。
OpenVPN 则通过一种全新的方式来实现 SSL VPN 功能,解决了传统 SSL VPN 的这些问题。它不仅扩展了应用范围,而且在防火墙设置方面,只需要开放一个 TCP 或 UDP 端口,大大简化了部署和配置的难度。
那为什么要用 VPN 呢?
使用 OpenVPN 的原因有很多~有以下几点:
- 隐藏真实 IP:通过连接到 VPN 服务器,隐藏你的真实 IP,保护个人隐私。
- 远程访问公司网站:绕过公司网络的 IP 限制,实现远程访问公司管理系统。
- 绕过 ISP 限制和数据监听:通过加密连接避免 ISP 或其他第三方监听和拦截数据。
- 加密明文传输:即使目标网站没有加密,VPN 也能通过加密隧道确保数据安全。
大家平时最常见的就是“翻墙”,是的,OpenVPN 可以做到~
它为什么可以“翻墙”呢?
VPN 可以“翻墙”是因为它通过加密和隧道技术,将你的网络流量绕过地理限制和网络封锁。具体原因包括:
- 虚拟 IP 地址:VPN 通过替换你的真实 IP 地址,使你看起来像是在其他地区或国家访问互联网,从而绕过地区封锁。
- 加密隧道:VPN 加密数据并通过安全的隧道传输,避免了被本地网络监控和干扰,突破了防火墙的限制。
- 隐藏真实流量:VPN 让你的网络流量看起来像是普通的加密数据,而不是被封锁的特定流量,从而绕过审查机制。
通过这些技术,VPN 让咱们能够自由访问全球互联网内容,实现“翻墙”。(国内“翻墙”不允许哈!大家要遵纪守法,通过国家批准的合法正规渠道进行境外访问)
工作原理有几块重点内容,简单介绍下~
一、虚拟网卡
在 Linux 中支持一种名为 tun 的虚拟网络设备。tun 设备的驱动程序由两个部分组成:一部分是字符设备驱动,另一部分是网卡驱动。网卡驱动将从 TCP/IP 协议栈接收到的数据包(以 skb 结构表示)放入 tun 设备的读取队列。用户进程通过调用字符设备接口(如 read 函数)从设备队列中读取数据,从而获得完整的 IP 数据包。
在 字符驱动的 read 函数 中,数据会从核心态的 skb(Socket Buffer)结构传递给用户空间,完成从内核到用户的转发。而在数据的反向传输中,write 函数提供了一个接口,让用户空间的数据能够被写入到内核空间。具体来说,write 函数会将用户态的数据写入到内核缓冲区,并将数据传递给 TCP/IP 协议栈进行进一步处理。这种方式使得 tun 设备 既能作为一个字符设备进行读写操作,又可以像传统的物理网卡一样,支持配置 IP 地址 和 路由。
tun 设备作为虚拟网卡,具备了与物理网卡相似的功能,例如支持 IP 地址分配、路由配置等操作。其虚拟化特性使其能够模拟物理网卡的行为,提供网络隔离和数据加密等功能,因此它成为实现 OpenVPN 等 SSL VPN 解决方案的关键技术。通过将 tun 设备 与加密隧道相结合,OpenVPN 能够创建安全、私密的虚拟网络通道,从而在互联网上实现远程访问和数据保护。
这种虚拟网卡的使用,不仅为 VPN 连接提供了一个稳定的网络接口,还能确保数据流在用户和 VPN 服务器之间的安全传输。总之,tun 设备 是实现 SSL VPN 功能的重要组成部分,能够提供灵活的网络虚拟化和高效的数据转发能力。
二、虚拟网卡的地址池以及路由
在 OpenVPN 中,虚拟网卡的地址池和路由配置是确保客户端和服务器之间安全、有效连接的关键部分。总结如下:
1. 虚拟网卡的地址池:
- OpenVPN 在创建虚拟网络时,会为每个连接的客户端分配一个虚拟 IP 地址,这些 IP 地址通常来自一个地址池。
- 地址池一般在 OpenVPN 服务器配置文件中定义。常见配置示例如下:
server 10.8.0.0 255.255.255.0
这里,10.8.0.0 是虚拟网络的网络地址,255.255.255.0 是子网掩码。OpenVPN 会在这个地址段内分配 IP 给每个连接的客户端。
- 地址池的范围可以根据需要进行调整,通常会选择一个私有 IP 地址范围(例如 10.8.0.0/24)作为虚拟网络的地址池。
2. 路由配置:
- OpenVPN 会自动为每个客户端配置路由,确保客户端能够通过虚拟网卡访问 VPN 服务器的网络,并通过 VPN 连接访问远程网络。
- 服务器配置中可以指定将哪些路由推送给客户端。例如,如果希望客户端能够访问整个网络,可以在服务器端配置:
push "route 192.168.1.0 255.255.255.0"
这会将 192.168.1.0/24 的路由推送到客户端,使得客户端能够访问这个网络。
- 在客户端连接后,OpenVPN 会动态更新客户端的路由表,将通过 VPN 的流量路由到虚拟网卡。
- 可以配置路由器转发,允许 OpenVPN 服务器通过其接口将流量转发到其他网络。
这样 OpenVPN 就能够创建一个虚拟的私有网络(VPN),并确保客户端和服务器之间的安全通信以及数据流的正确转发。
三、客户端与服务端安全连接的建立
OpenVPN 的服务器和客户端支持两种连接方式:TCP 和 UDP。在建立连接之前,客户端和服务器需要预先定义所使用的连接方式(TCP 或 UDP)以及端口号。基于这些设置,客户端和服务器通过 SSL 协议进行安全的握手过程。连接过程包括两个主要部分:SSL 握手和虚拟网络的管理信息交换。
在 SSL 握手期间,OpenVPN 会将虚拟网络的网段、IP 地址和路由信息传递给客户端,确保客户端能够正确加入虚拟网络。握手成功后,客户端与服务器之间建立起了一个安全的 SSL 连接,通过该连接,所有的数据流都将经过虚拟网卡进行 SSL 加密处理。
一旦 SSL 加密完成,数据将在 TCP 或 UDP 连接上通过物理网卡进行传输,确保数据的安全性和完整性。简而言之,OpenVPN 通过 SSL 协议建立安全连接,并通过虚拟网卡在客户端和服务器之间进行加密数据传输,最终通过物理网络接口将加密数据发送出去。
四、虚拟网卡网络数据包是怎么处理呢?
虚拟网卡建好了,客户端与服务端也建立起通讯了,那它们之间的数据包发送与接收是怎么处理的呢?往下看 ~
1、发送数据流程
应用层的外发数据通过系统调用接口传递到内核的 TCP/IP 栈进行处理。经过 TCP/IP 协议的路由后,数据包被传送至虚拟网卡。虚拟网卡的驱动程序中hard_start_xmit()函数处理数据包,将其加入到 skb(Socket Buffer)队列,并完成数据从内核空间到用户空间的复制。
OpenVPN 随后调用虚拟网卡的字符设备处理函数 tun_read(),从设备中读取数据包。接收到的数据包经过 SSL 协议的加密和封装处理后,OpenVPN 使用 socket 系统调用将加密后的数据包发送到目标地址,实现安全的数据传输。
简而言之,数据从应用层到虚拟网卡,经历了内核的处理、SSL 封装和最终通过套接字发送的过程,确保了 VPN 数据的安全性和完整性。
2、接收数据流程
当物理网卡接收到数据包时,它将数据传递给内核的 TCP/IP 栈,随后这些数据包被送往 OpenVPN。OpenVPN 通过 link_socket_read()函数接收数据包,并使用 SSL 协议进行解密处理。经过此处理后,OpenVPN 调用虚拟网卡的字符设备处理函数tun_write(),将解密后的数据写入虚拟网卡。
在此过程中,设备驱动程序负责完成数据从用户空间到内核空间的复制,并将数据写入 skb(Socket Buffer)链表。随后,驱动程序调用netif_rx()函数,将数据包再次送入系统的 TCP/IP 协议栈。最终,数据包被传递到上层应用程序,实现了数据的有效接收与处理。
画个图更直观:

3、数据包封装
- 应用层数据通过 TCP/IP 协议栈传输到虚拟网卡。
- 数据加密和封装:通过 SSL/TLS 协议对数据进行加密,并封装成 VPN 数据包。
- 数据写入虚拟网卡:封装后的数据通过虚拟网卡的驱动程序写入内核,并准备发送。
- 数据通过物理网卡传输:数据通过物理网卡发送到目标 VPN 服务器。
- 远程服务器解密和解封装:远程服务器解密数据包,并恢复原始应用层数据。
其中 OpenVPN 与 Openssl 是一起用的~
OpenVPN 需要与 OpenSSL 一起安装,因为它依赖 OpenSSL 的函数库来实现 SSL 连接。在客户端和服务端建立 SSL 连接时,OpenVPN 会调用 OpenSSL 提供的功能。具体来说,OpenVPN 通过bio_write()函数将数据写入 OpenSSL 的状态机通道,使用bio_read()从 OpenSSL 读取处理结果。此外,OpenVPN 还利用 OpenSSL 的加密和解密功能来处理转发的数据包。
以上是小编看完源代码后总结出来的,有不正确的地方,欢迎指出来,咱们一起学习~
以上关于OpenVPN工作原理解析:从虚拟网卡TUN设备到SSL加密隧道的全过程揭秘的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » OpenVPN工作原理解析:从虚拟网卡TUN设备到SSL加密隧道的全过程揭秘
微信
支付宝